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

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

by 소한보 2020. 8. 21.

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)

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

댓글