본문 바로가기
책&강의 학습/올인원 패키지 :딥러닝&인공지능

[패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 39회차 미션

by 소한보 2020. 8. 6.

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()

데이터셋만 변경하면서 모델 활용 가능

딥러닝/인공지능 올인원 패키지 Online

댓글