합성곱 신경망은 부분적으로 연결되어 있다
따라서 고해상도의 이미지나 음성 등의 고차원적인 데이터를 인풋으로 하여도 무한개의 뉴런으로 늘어나지 않은채 학습시킬 수 있다.
고수준 뉴런이 이웃한 저수준 뉴런의 출력에 기반한다는 아이디어에서 착안된 신경망 모델이며 각 뉴런은 이전 층에 있는 몇개의 뉴런에만 연결된다. 이러한 구조가 전체 시야 영역에 포함된 모든 종류의 복잡한 패턴을 감지할 수 있게 된다.
첫번째 합성곱층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아닌 합성곱 층 뉴런의 수용장 안에 있는 픽셀에만 연결된다. 그리고 두번째 합성곱층에 있는 각 뉴런은 첫번째층의 작은 사각 영역 안에 위치한 뉴런에 연결된다. ...
이런 구조는 네트워크가 첫번째 은닉층에서 작은 저수준 특성에 집중하고 그 다음 은닉층에서는 더 큰 고수준 특성으로 조합해나가는 계층적 구조 를 띄게 한다.
*여기서 채널이란 몇개의 필터 / 몇개의 층으로 인식하면 됨
#저수준 딥러닝 API
#각 채널의 픽셀 강도는 0에서 255 사이의 값을 가진 바이트 하나로 표현되어 0-1 로 스케일링 해줌
image = load_sample_image("flower.jpg")/255
output = tf.nn.conv2d(image, filters, strides, padding = "SAME")
#첫번째 이미지의 두번째 특성맵을 그림
plt.imshow(output[0, :, :, 1], cmap = 'gray')
plt.show()
padding
#신경망이 가장 잘 맞는 필터 학습
conv = keras.layers.Conv2D(filters = 32, kernel_size = 3, strides = 1,
padding = 'same', activation = 'relu')
#poolsize = kernel size
max_pool = keras.layers.MaxPool2D(pool_size = 2)
#깊이 차원으로 풀링
#커널 크기와 스트라이드의 첫번째 세값은 1, 마지막 값은 깊이 차원으로 지정
#단, 입력 깊이를 나누었을 때 떨어지는 값이어야 한다
output = tf.nn.max_pool(images, ksize= (1,1,1,3), strides = (1,1,1,3), padding ='valid')
#or
depth_pool = keras.layers.Lambda(lambda X: tf.nn.max_pool(X, ksize = (1,1,1,3),
strides = (1,1,1,3), padding = 'valid')
model = keras.model.Sequential([
keras.layers.Conv2D(64,7, activation = 'relu', padding = 'same', input_shape=[28,28,1]),
keras.layers.MaxPooling2D(2),
keras.layers.Conv2D(128,3, activation ='relu', padding = 'same'),
keras.layers.Conv2D(128,3, activation ='relu', padding = 'same'),
keras.layers.MaxPooling2D(2),
keras.layers.Conv2D(256,3, activation ='relu', padding = 'same'),
keras.layers.Conv2D(256,3, activation ='relu', padding = 'same'),
keras.layers.MaxPooling2D(2),
keras.layers.Flatten(),
keras.layers.Dense(128, activation = 'relu),
keras.layers.Dropout(0.5)
keras.layers.Dense(10, activation = 'softmax')])