Part4-39. 합성곱 신경망(CNN) - 09. (STEP 2) 심화 합성곱 신경망 - 3
Densely Conneted ConvNets (DenseNet)

각 레이어가 모든 레이어에 연결되는 구조
DenseNet 구조

Input영상이 들어가면 conv레이어에서 피쳐를 추출하여 피쳐맵을 만들고
Dense Block을 이용해서 피쳐를 뽑아내고
conv레이어를 통해서 채널개수 조절하고 max_pooling으로 영상크기를 줄어주고
이과정을 반복
ResNet아이디어의 연장선에 있음. Dense Block를 제안하는 것이 특징
Dense Block은 ResNet과 같이 pre_activation구조를 사용
Dense Block

concatenate하는 결과로 볼수 있음
Growth Rate가 도입되는 이유는
첫 피쳐맵에서 나오는 출력은 3X3XCX4과 같음
첫 피쳐맵과 출력결과를 연결후 다음 출력은 3X3X(C+4)X4
이를 반복해가면서
3X3X(C+8)X4
3X3X(C+16)X4을 최종 out으로 내보냄
Skip conenect과 동일한 효과를 나타냄
(계속 값을 누적했기 때문)
Bottleneck 구조

일반 Dense Block은
3X3X(C+k *l)XK
C 처음입력된 채널개수
k Growth Rate
l 반복횟수
Bottleneck의 경우 2개의 conv로 쪼개짐
1X1X(C+k *l)XCbn 3X3X(C+k *l)XCbn
값이 지나치게 커졌을때 줄여주는 역할을 함
DenseNet 구현

논문을 보고 구현할 수 있는 능력을 키우게 되면 자신만의 네트워크 설계가능
채널이 커지는 것을 방지하기 위해 Bottleneck 구조를 활용한 것을 확인할 수 있음
Part4-40. 합성곱 신경망(CNN) - 10. (STEP 3) 기본 합성곱 신경망 구현
첫시간 템플릿 활용하여 진행
학습환경, 학습루프는 동일하게 유지
하이퍼파라미터
EPOCHS = 10
모델정의
class ConvNet(tf.keras.Model):
def __init__(self):
super(ConvNet, self).__init__()
conv2d = tf.keras.layers.Conv2D
maxpool = tf.keras.layers.MaxPool2D
self.sequence = list()
#sequence.append(conv2d(출력채널개수, 사용될 커널 크기))
#conv를 지나면서 크기를 줄여나가고 있기 때문 줄여나가는 형태로 진행
self.sequence.append(conv2d(16, (3, 3), padding='same', activation='relu')) # 28x28x16
self.sequence.append(conv2d(16, (3, 3), padding='same', activation='relu')) # 28x28x16
self.sequence.append(maxpool((2,2))) # 14x14x16 #maxpooling에 의해 줄어듬
self.sequence.append(conv2d(32, (3, 3), padding='same', activation='relu')) # 14x14x32
self.sequence.append(conv2d(32, (3, 3), padding='same', activation='relu')) # 14x14x32
self.sequence.append(maxpool((2,2))) # 7x7x32
self.sequence.append(conv2d(64, (3, 3), padding='same', activation='relu')) # 7x7x64
self.sequence.append(conv2d(64, (3, 3), padding='same', activation='relu')) # 7x7x64
self.sequence.append(tf.keras.layers.Flatten()) # 1568 #feature vetor로 변환
self.sequence.append(tf.keras.layers.Dense(2048, activation='relu'))
self.sequence.append(tf.keras.layers.Dense(10, activation='softmax'))
def call(self, x, training=False, mask=None):
for layer in self.sequence:
x = layer(x)
return x
학습, 테스트 루프 정의
이미되어있음
# Implement training loop
@tf.function
def train_step(model, images, labels, loss_object, optimizer, train_loss, train_accuracy):
with tf.GradientTape() as tape:
predictions = model(images)
loss = loss_object(labels, predictions)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
train_loss(loss)
train_accuracy(labels, predictions)
# Implement algorithm test
@tf.function
def test_step(model, images, labels, loss_object, test_loss, test_accuracy):
predictions = model(images)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)
데이터셋 준비
mnist = tf.keras.datasets.mnist
#train, test셋 쌍으로 되어 있음
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 #0~1사이로 정규화
# x_train : (NUM_SAMPLE, 28, 28) -> (NUM_SAMPLE, 28, 28, 1)
x_train = x_train[..., tf.newaxis].astype(np.float32) #채널추가
x_test = x_test[..., tf.newaxis].astype(np.float32)
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)
학습 환경 정의
# Create model
model = ConvNet()
# Define loss and optimizer
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam()
# Define performance metrics
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')
학습루프 동작
for epoch in range(EPOCHS):
for images, labels in train_ds:
train_step(model, images, labels, loss_object, optimizer, train_loss, train_accuracy)
for test_images, test_labels in test_ds:
test_step(model, test_images, test_labels, loss_object, test_loss, test_accuracy)
template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
print(template.format(epoch + 1,
train_loss.result(),
train_accuracy.result() * 100,
test_loss.result(),
test_accuracy.result() * 100))
train_loss.reset_states()
train_accuracy.reset_states()
test_loss.reset_states()
test_accuracy.reset_states()
데이터셋만 변경하면서 모델 활용 가능
'책&강의 학습 > 올인원 패키지 :딥러닝&인공지능' 카테고리의 다른 글
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 41회차 미션 (0) | 2020.08.08 |
|---|---|
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 40회차 미션 (0) | 2020.08.07 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 38회차 미션 (0) | 2020.08.05 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 37회차 미션 (0) | 2020.08.04 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 36회차 미션 (0) | 2020.08.03 |
댓글