딥러닝study-1

ChanceMKR·2022년 5월 15일
0

딥러닝

목록 보기
1/4
post-thumbnail

딥러닝이란?

인공신경망을 수많은 계층 형태로 연결한 기법

DNN

✔️ 컴퓨터는 어떻게 숫자를 예측할까?

우리가 5 손글씨를 입력받았다고 생각해보자

첫번째 노드들은 가장 작은 형태인 픽셀단위로 나누어져 있고 각 노드들은 밝기에 따라 0~1의 값을 가지고 있다.


그리고 두번째 노드들은 테두리를 인식하고 그 특징들을 작은 단위로 저장한다.

이런 과정들이 반복 된 뒤 출력층 바로 앞의 노드에서는 여러 모양들의 정보를 가지게 된다.

마지막 output 노드는 각 클래스의 정보를 가지고 있고 앞선 노드의 정보와 클래스 간의 가중치에 따라 컴퓨터는 숫자를 예측하게 된다.

✔️ 컴퓨터는 어떻게 성능을 높일까?

그리고 정답인 예측값에서는 1을 빼주고,
나머지 클래스의 예측값에서는 0을 빼준다.

그 값들을 모두 제곱하여 더한 합계가 작으면 작을수록 더 정확한 예측을 한 것이 된다.
그리고 이 예측의 정도에 따라 가중치를 업데이트 해주면서 정확도를 향상시킨다.

CNN

Convolution Neural Network / 합성곱 신경망

✔️ DNN과의 차이점

DNN은 사진을 입력받아 matrix 형태로 구성된 이미지를 flatten() 함수와 같은 방법을 통해 array 형태로 구성한다.

하지만 CNN은 이미지의 matrix를 그대로 이용한다.

위와 같은 필터를 이미지 파일에 씌워주어 특성맵을 만들게 된다.

특성맵 시각화

다음은 고양이 사진을 모델에 넣었을 때 어떤 식으로 특성맵이 출력되는지 보는 코드이다.

model= tf.keras.models.Sequential([tf.keras.layers.Conv2D(input_shape=(100,100,3), 
    activation='relu', kernel_size=(5,5), filters=32), 
    tf.keras.layers.MaxPooling2D(), 
    tf.keras.layers.Conv2D(activation='relu', kernel_size=(5,5), filters=64), 
    tf.keras.layers.MaxPooling2D(), 
    tf.keras.layers.Conv2D(activation='relu', kernel_size=(5,5), filters=64), 
    tf.keras.layers.MaxPooling2D(), 
    tf.keras.layers.Conv2D(activation='relu', kernel_size=(5,5), filters=64), 
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(2, activation='softmax')
]) 

다음 고양이 사진을 모델에 넣고 1번째 층과 7번째 층에서의 특성맵을 출력해보았다.

img=cv2.imread("./chap5/data/cat.jpg")
plt.imshow(img)

ins= model.inputs
outs= model.layers[0].output
feature_map= Model(inputs= ins, outputs= outs) 

img=cv2.resize(img,(100,100)) 
input_img= np.expand_dims(img, axis=0) 

feature_map=feature_map.predict(input_img) 
fig= plt.figure(figsize=(50,50)) 
for i in range(16):
    ax=fig.add_subplot(8,4,i+1) 
    ax.imshow(feature_map[0,:,:,i])

첫 번째 층의 특성맵은 아직 고양이의 형태가 거의 남아있는 것을 볼수 있다.

ins= model.inputs
outs= model.layers[6].output
feature_map= Model(inputs= ins, outputs= outs)
img=cv2.imread("./chap5/data/cat.jpg") 
img=cv2.resize(img,(100,100))
input_img= np.expand_dims(img, axis=0)

feature=feature_map.predict(input_img) 
fig= plt.figure(figsize=(50,50))
for i in range(48):
    ax=fig.add_subplot(8,8,i+1) 
    ax.imshow(feature[0,:,:,i])


하지만 층이 거듭 될수록 고양이의 형체는 사라지고 특성맵의 차원도 축소되는 것을 볼 수 있었습니다.

CNN이 특성맵을 만드는 과정과 DNN 노드의 값에 가중치를 곱하여 다음 노드의 값을 정하는 것과 비슷하다고 볼 수 있습니다.

0개의 댓글