Part4-71. 효과적으로 사용할 수 있는 기법 - 11. (STEP 3) 실전 문제 해결 - 과소적합
모델정의
dense_net의 연산량은 감소
구조를 변경하면서 모델의 성능향상
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.flatten = tf.keras.layers.Flatten()
self.dense1 = tf.keras.layers.Dense(32, activation='relu')
self.batch1 = tf.keras.layers.BatchNormalization()
self.batch2 = tf.keras.layers.BatchNormalization()
self.dense2 = tf.keras.layers.Dense(32, activation='relu')
self.batch3 = tf.keras.layers.BatchNormalization()
self.dense3 = tf.keras.layers.Dense(64, activation='relu')
self.batch4 = tf.keras.layers.BatchNormalization()
self.dense4 = tf.keras.layers.Dense(128, activation='relu')
self.dense5 = tf.keras.layers.Dense(10, activation='softmax')
def call(self, x, training=False, mask=None):
x = self.flatten(x)
x = self.dense1(x)
x = self.batch1(x, training)
x = tf.nn.relu(x)
x = self.batch2(x, training)
x = tf.nn.relu(x)
x = self.dense2(x)
x = tf.concat([x,h], axis = 1)
x = self.batch3(x, training)
x = tf.nn.relu(x)
x = self.dense3(x)
x = tf.concat([x,h], axis = 1)
x = self.batch4(x, training)
x = tf.nn.relu(x)
x = self.dense4(x)
x = tf.concat([x,h], axis = 1)
return self.dense5(x)
데이터셋 준비
fashion_mnist = tf.keras.datasets.fashion_mnist # 28x28 ->10 class
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train = x_train.astype(np.float32)
x_test = x_test.astype(np.float32)
# prefetch를 사용하면 하드디스크에서 바로 가져오므로 속도가 빠름
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32).prefetch(2048)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32).prefetch(2048)
keras API 학습
model = MyModel()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_ds, validation_data=test_ds, epochs=EPOCHS)
이전결과

이후결과

Part4-72. 효과적으로 사용할 수 있는 기법 - 12. (STEP 3) 실전 문제 해결 - 부족한 데이터셋
모델정의
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.flatten = tf.keras.layers.Flatten()
self.dense1 = tf.keras.layers.Dense(1024, activation='relu')
self.dense2 = tf.keras.layers.Dense(1, activation='sigmoid')
def call(self, x, training=False, mask=None):
x = self.flatten(x)
x = self.dense1(x)
return self.dense2(x)
데이터셋준비
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# TODO: 학습 데이터를 Imbalanced small dataset으로 변형하기
x_train_small = list()
y_train_small = lits()
for x, y in zip(x_train, y_train):
if (y == 0 and random.ranint(0,100) < 10) or y == 1:
x_train_small.append(x[:])
y_train_small.append(y)
x_test_small = list()
y_test_small = lits()
for x, y in zip(x_train, y_train):
if y == 0 or y == 1:
x_test_small.append(x[:])
y_tes_small.append(y)
x_train = np.stack(x_train_small, axis = 0)
y_train = np.stack(y_train_small, axis = 0)
x_test = np.stack(x_test_small, axis = 0)
y_test = np.stack(y_test_small, axis = 0)
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32).prefetch(2048)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32).prefetch(2048)
Keras API 모델 학습 (불균형한 데이터셋)
model = MyModel()
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy',
tf.keras.metrics.Precision(name='precision'),
tf.keras.metrics.Recall(name='recall')])
model.fit(train_ds, validation_data=test_ds, epochs=EPOCHS)
0번 클레스에 대해서 전혀 학습되지 않고 있음
데이터셋 준비 (BorderlineSMOTE)
pip install imblearn 설치
# TODO: BorderlineSMOTE 적용하기
x_train = x_train.reshape((x_train.shape[0],x_train.shape[1] * x_train.shape[2] * x_train.shape[3])).astype(np.float32)
x_test = x_test.reshape((x_test.shape[0],x_test.shape[1] * x_test.shape[2] * x_test.shape[3])).astype(np.float32)
smote = BorderlinSMOTE()
x_train, y_train = smote.fit_resample(x_train, y_train)
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32).prefetch(2048)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32).prefetch(2048)
Keras API 모델 학습 (BorderlineSMOTE)
model = MyModel()
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy',
tf.keras.metrics.Precision(name='precision'),
tf.keras.metrics.Recall(name='recall')])
model.fit(train_ds, validation_data=test_ds, epochs=EPOCHS)

'책&강의 학습 > 올인원 패키지 :딥러닝&인공지능' 카테고리의 다른 글
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 56회차 미션 (0) | 2020.08.23 |
|---|---|
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 55회차 미션 (0) | 2020.08.22 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 53회차 미션 (0) | 2020.08.20 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 52회차 미션 (0) | 2020.08.19 |
| [패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 51회차 미션 (0) | 2020.08.18 |
댓글