<aside> 💡 1번 10점 2번 점 3번 9점 4번 10점 5번 10점 ⇒ total : 점

</aside>

이론문제 1번 : 1, 4번

<aside> 👍 잘 풀어주셨습니다!

</aside>

  1. GoogLeNet은 VGG19보다 적은 층으로 구성되어 있고 1x1 크기의 커널을 이용해 특성 개수를 줄여 VGG보다 성능이 더 좋다.

→ GoogLeNet은 22개의 층으로 구성, VGG19는 19층으로 형성되어 더 많은 층으로 구성된다.

  1. CNN의 대표적인 모델은 VGGNet, AlexNet, GoogLeNet, ResNet 순으로 개발되었다. → AlexNet, VGGNet 순입니다. 참고: https://junklee.tistory.com/19

이론문제 2번 : 1,5번

1. convolutional neural network에서 filter와 kernel은 같은 말로 사용하지만 뉴런은 다른 의미로 사용된다.p.425 : 합성곱 신경망에서는 완전연결신경망과 달리 뉴런을 필터라고 부릅니다. 혹은 커널이라고도 부릅니다.

5. 합성곱에서는 활성화 출력이란 표현을 잘 쓴다.p.429 : ...일반적으로 특성맵은 활성화 함수를 통과한 값을 나타냅니다. 합성곱에서는 활성화 출력이란 표현을 잘 쓰지 않습니다.

실습 3번

<aside> 😅 방법 1번은 model에 훈련 시키기 위한 shape가 맞지 않습니다. 모델이 원하는 shape는 (None, 224, 224, 3)으로 2242243의 크기를 가진 이미지 데이터들을 None의 크기로 batch를 나눠주어야합니다. 모델을 fit할 때 batch_size가 16으로 정해져 있으므로 train과 val은 16으로, test는 원하는 크기로 배치를 나눠주면 학습됩니다. 방법 2번은 위 문제 해결을 위해 numpy 배열을 직접 쓰셨네요! 이것도 하나의 방법이지만 tfds는 데이터를 Tensor 데이터로 제공하기 때문에 아주 간단한 방법으로 batch를 지정해줄 수 있습니다. 한번 공부해보세요! 방법 1, 2번 공통으로 softmax 출력층의 unit은 구분하고자 하는 종류의 수와 같습니다. 이 문제는 인간과 말로 나누는 분류 문제이므로 unit은 2로 지정해주세요! 추가로, 배치 사이즈는 크기에 따라 오버피팅에 영향을 주기도 합니다. 그리고 배치 사이즈와 learning rate는 어느정도 규칙적인 관계를 가지고 있습니다. 한번 찾아보시면 좋을 것 같습니다 🙂 정답 코드는 문제 제일 아래에 적어두었으니 참고하시고, 문제 푸시느라 고생 많으셨습니다!

</aside>

방법 1.

#!pip install tensorflow-datasets
import tensorflow as tf
import tensorflow_datasets as tfds
from tensorflow import keras
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

#load dataset
dataset_name = 'horses_or_humans'
(train_raw, val_raw, test_raw), info = tfds.load(name=dataset_name,
                    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
                    with_info=True,
                    as_supervised=True,
                    shuffle_files=True,
                    batch_size = None)

#resize img
def img_resize(image, label):
    image = tf.cast(image, tf.float32)
    image = image / 255.0
    image = tf.image.resize(image, (224, 224))
    return image, label

train = train_raw.map(img_resize)
val = val_raw.map(img_resize)
test = test_raw.map(img_resize)

#model
model = keras.Sequential()
model.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Flatten())
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=1000,activation="relu"))
model.add(Dense(units=1000,activation='softmax'))

model.summary()

#fit model
opt = keras.optimizers.Adam(learning_rate=0.0001)
model.compile(optimizer=opt, loss='sparse_categorical_crossentropy',metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5',
                                               save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
                                                 restore_best_weights=True)

history = model.fit(train, epochs=20,
                   validation_data = val,
                    batch_size=16,
                   callbacks=[checkpoint_cb, early_stopping_cb])

#fit result
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
model.evaluate(test)

방법 2.

#!pip install tensorflow-datasets
import tensorflow as tf
import tensorflow_datasets as tfds
import numpy as np
from tensorflow import keras
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

#load dataset
dataset_name = 'horses_or_humans'
(train_raw, val_raw, test_raw), info = tfds.load(name=dataset_name,
                    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
                    with_info=True,
                    as_supervised=True,
                    shuffle_files=True,
                    batch_size = None)

#resize img
def img_resize(image, label):
    image = tf.cast(image, tf.float32)
    image = image / 255.0
    image = tf.image.resize(image, (224, 224))
    return image, label

train = train_raw.map(img_resize)
val = val_raw.map(img_resize)
test = test_raw.map(img_resize)

print(info)

train_data = np.array([])
train_target = np.array([])
val_data = np.array([])
val_target = np.array([])
test_data = np.array([])
test_target = np.array([])

for inputs in tfds.as_numpy(train):
  data, target = inputs
  train_data = np.append([train_data], data)
  train_target = np.append([train_target], target)

for inputs in tfds.as_numpy(val):
  data, target = inputs
  val_data = np.append([val_data], data)
  val_target = np.append([val_target], target)

for inputs in tfds.as_numpy(test):
  data, target = inputs
  test_data = np.append([test_data], data)
  test_target = np.append([test_target], target)

train_data = train_data.reshape(-1, 224, 224, 3);
val_data = val_data.reshape(-1, 224, 224, 3);
test_data = test_data.reshape(-1, 224, 224, 3);

print(test_data[:3])

#model
model = keras.Sequential()
model.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))
model.add(Flatten())
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=1000,activation="relu"))
model.add(Dense(units=1000,activation='softmax'))

model.summary()

#fit model
opt = keras.optimizers.Adam(learning_rate=0.0001)
model.compile(optimizer=opt, loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5',
                                               save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
                                                 restore_best_weights=True)
history = model.fit(train_data, train_target, epochs=20,
                   validation_data = (val_data, val_target),
                    batch_size=16,
                   callbacks=[checkpoint_cb, early_stopping_cb])

#fit result
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

#model test
model.evaluate(test_data, test_target)

Untitled

#답 코드