Part4-41. 합성곱 신경망(CNN) - 11. (STEP 3) Residual Network 구현 및 학습
이전에 사용했던 데이터셋 학습방법을 사용
모델정의는 바뀜
Residual Unit
grdient highway를 발생하는 pre_activation feature를 뽑아내는
class ResidualUnit(tf.keras.Model):
def __init__(self, filter_in, filter_out, kernel_size):
super(ResidualUnit, self).__init__()
self.bn1 = tf.keras.layers.BatchNormalization()
#pre-activation이므로 activation은 적어주지 않음
self.conv1 = tf.keras.layers.Conv2D(filter_out, kernel_size, padding='same')
self.bn2 = tf.keras.layers.BatchNormalization()
self.conv2 = tf.keras.layers.Conv2D(filter_out, kernel_size, padding='same')
#채널이 같아야만 그대로 덧셈이 가능, 다른 경우 필터개수를 맞춰줌
if filter_in == filter_out:
self.identity = lambda x: x
else:
self.identity = tf.keras.layers.Conv2D(filter_out, (1,1), padding='same')
def call(self, x, training=False, mask=None):
#train과 test가 달라져야 함
h = self.bn1(x, training=training)
h = tf.nn.relu(h)
h = self.conv1(h)
h = self.bn2(h, training=training)
h = tf.nn.relu(h)
h = self.conv2(h)
return self.identity(x) + hResidual Layer 구현
Residual Unit여러개를 연결하여 Residual Layer 구현
class ResnetLayer(tf.keras.Model):
# filters는 Residual Unit이 여러개가 있게끔 하므로 list형태로 받음 [32,32,32,32]
def __init__(self, filter_in, filters, kernel_size):
super(ResnetLayer, self).__init__()
self.sequence = list()
# [16] + [32,32,32]
# zip([16,32,32,32], [32,32,32]) 하나더 남는 것은 무시되고 각각 짝으로 구현
for f_in, f_out in zip([filter_in] + list(filters), filters):
self.sequence.append(ResidualUnit(f_in, f_out, kernel_size))
def call(self, x, training=False, mask=None):
for unit in self.sequence:
x = unit(x, training=training) #배치노말라이제이션때 training을 받았으므로 똑같이 받아줘야함
return x모델정의
처음의 입력에서 conv를 한번해서 초기 피쳐를 뽑아주는 것이 중요
그피쳐로부터 RseNet을 사용해야 더 효과적
class ResNet(tf.keras.Model):
def __init__(self):
super(ResNet, self).__init__()
self.conv1 = tf.keras.layers.Conv2D(8, (3, 3), padding='same', activation='relu') # 28x28x8
self.res1 = ResnetLayer(8, (16, 16), (3, 3)) # 28x28x16
self.pool1 = tf.keras.layers.MaxPool2D((2, 2)) # 14x14x16
self.res2 = ResnetLayer(16, (32, 32), (3, 3)) # 14x14x32
self.pool2 = tf.keras.layers.MaxPool2D((2, 2)) # 7x7x32
self.res3 = ResnetLayer(32, (64, 64), (3, 3)) # 7x7x64
self.flatten = tf.keras.layers.Flatten()
#Fully connected layer 단계
self.dense1 = tf.keras.layers.Dense(128, activation='relu')
self.dense2 = tf.keras.layers.Dense(10, activation='softmax')
def call(self, x, training=False, mask=None):
x = self.conv1(x)
# training을 빼면 성능이 저하됨. 원인파악하기 어려우므로 잘 넣어줄것
x = self.res1(x, training=training)
x = self.pool1(x)
x = self.res2(x, training=training)
x = self.pool2(x)
x = self.res3(x, training=training)
x = self.flatten(x)
x = self.dense1(x)
return self.dense2(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, training=True)
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, training=False)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)테스트 루프에서는 training =False로 하는것을 잊지 말기
데이터셋준비
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
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 = ResNet()
# 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()
Part4-42. 합성곱 신경망(CNN) - 12. (STEP 3) DensNet 구현 및 학습
ResNet과 유사 Transition Layer가 추가됨
DenseUnit구현
pre-activation형태는 유지하되 Concatenation 진행
class DenseUnit(tf.keras.Model):
def __init__(self, filter_out, kernel_size):
super(DenseUnit, self).__init__()
self.bn = tf.keras.layers.BatchNormalization()
self.conv = tf.keras.layers.Conv2D(filter_out, kernel_size, padding='same')
self.concat = tf.keras.layers.Concatenate() # ResNet과 달라진점
def call(self, x, training=False, mask=None): # x: (Batch, H, W, Ch_in)
h = self.bn(x, training=training)
h = tf.nn.relu(h)
h = self.conv(h) # h: (Batch, H, W, filter_output)
return self.concat([x, h]) # (Batch, H, W, (Ch_in + filter_output)) 채널을 쌓아올리는 형태 DenseLayer 구현
class DenseLayer(tf.keras.Model):
# growth_rate dense unit이 한번 call될때마다 채널이 쌓아올라지기 때문에 growth_rate
def __init__(self, num_unit, growth_rate, kernel_size):
super(DenseLayer, self).__init__()
self.sequence = list()
for idx in range(num_unit):
self.sequence.append(DenseUnit(growth_rate, kernel_size))
def call(self, x, training=False, mask=None):
for unit in self.sequence:
x = unit(x, training=training)
return xTransition Layer 구현
Maxpooling할때 필요
class TransitionLayer(tf.keras.Model):
def __init__(self, filters, kernel_size):
super(TransitionLayer, self).__init__()
self.conv = tf.keras.layers.Conv2D(filters, kernel_size, padding='same')
self.pool = tf.keras.layers.MaxPool2D()
def call(self, x, training=False, mask=None):
x = self.conv(x)
return self.pool(x)모델정의
class DenseNet(tf.keras.Model):
def __init__(self):
super(DenseNet, self).__init__()
self.conv1 = tf.keras.layers.Conv2D(8, (3, 3), padding='same', activation='relu') # 28x28x8
self.dl1 = DenseLayer(2, 4, (3, 3)) # 28x28x16
self.tr1 = TransitionLayer(16, (3, 3)) # 14x14x16
self.dl2 = DenseLayer(2, 8, (3, 3)) # 14x14x32
self.tr2 = TransitionLayer(32, (3, 3)) # 7x7x32
self.dl3 = DenseLayer(2, 16, (3, 3)) # 7x7x64
self.flatten = tf.keras.layers.Flatten()
self.dense1 = tf.keras.layers.Dense(128, activation='relu')
self.dense2 = tf.keras.layers.Dense(10, activation='softmax')
def call(self, x, training=False, mask=None):
x = self.conv1(x)
x = self.dl1(x, training=training)
x = self.tr1(x)
x = self.dl2(x, training=training)
x = self.tr2(x)
x = self.dl3(x, training=training)
x = self.flatten(x)
x = self.dense1(x)
return self.dense2(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, training=True)
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, training=False)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)데이터셋 준비
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
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 = DenseNet()
# 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')학습루프 정의
application에 따라 성능의 차이가 있을수 있으며
파라미터에 따라 차이가 있을 수 있음
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()ResNet보다 성능이 다소 떨어졌는데 튜닝을 통해 올려볼 필요가 있음
'책&강의 학습 > 올인원 패키지 :딥러닝&인공지능' 카테고리의 다른 글
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 42회차 미션 (0) | 2020.08.09 |
|---|---|
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 41회차 미션 (0) | 2020.08.08 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 39회차 미션 (0) | 2020.08.06 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 38회차 미션 (0) | 2020.08.05 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 37회차 미션 (0) | 2020.08.04 |
댓글