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

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

by 소한보 2020. 8. 20.

Part4-69. 효과적으로 사용할 수 있는 기법 - 09. (STEP 2) 정규화 기법의 이해 - 2

Lasso vs Ridge


1/2은 미분할때 깔끔하게 하기 위한 관습적인거
Lasso는 미분했을 때 양수는 1 음수일때 -1로 일정하게 나타남
Ridge는 미분했을때 가중치 값이 그대로 나옴
Ridge는 큰 가중치는 더 빨리 줄이고 작은 가중치는 더 느리게 줄여줌
Lasso 중요한 특징을 선택하는 효과가 있으며 Sparsity(0이 아닌게 희박하게 나타남)를 가함

L1 Loss, L2 Loss

MSE Loss / MAE Loss 특성까지 비교

MSE Loss


에러가 클수록 더 큰 패널티를 부여
데이터의 평균을 구하는 특징을 갖음
데이터를 스무딩해주는 효과
아웃라이어에 취약한 특징이 있음
아웃라이어에 적용하기 위해 잘못된 추세선을 만드는 경향이 있음

MAE Loss


에러가 커져도 동일한 패널티를 부여
아웃라이어가 있다고해도 더 많이 몰려 있는 데이터에 집중됨
데이터의 중간값인 존재하는 정확한 값에 집중
L1은 0이 되는 값이 존재하기 때문에 에러가 최소가 되는 값이 타겟팅됨
아웃라이어를 무시하는 특징을 갖음

Part4-70. 효과적으로 사용할 수 있는 기법 - 10. (STEP 3) 실전 문제 해결 - 과적합

cifa10 데이터 사용 32x32x3 의크기 이며 10개의 클레스를 구분하는 문제

데이터셋

cifar10 = tf.keras.datasets.cifar10 # 32x32x3 ->10 class

(x_train, y_train), (x_test, y_test) = cifar10.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)

train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32).prefetch(1024)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32).prefetch(1024)

모델 정의

class ConvLNReluBlock(tf.keras.Model):
    def __init__(self, fliters, kernal_size):
        super(ConvLNReluBlock, self).__init__()
        self.conv = tf.keras.layers.Conv2D(fliters, kernel_size, padding = 'same', use_bins = False)
        self.ln = tf.keras.layers.LayerNormalization() #트레인/테스트 구분없이 진행함 오히려 넣어주면 에러남

    def call(self, x, training=False, mask=None):
        x = self.conv(x)
        y = self.ln(x)
        return tf.nn.relu(x)

# Define network architecture
class MyModel(tf.keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1_1 = ConvLNReluBlock(16, (3, 3))
        self.conv1_2 = ConvLNReluBlock(16, (3, 3))
        self.pool1 = tf.keras.layers.MaxPool2D((2, 2))

        self.conv2_1 = ConvLNReluBlock(16, (3, 3))
        self.conv2_2 = ConvLNReluBlock(32, (3, 3))
        self.pool2 = tf.keras.layers.MaxPool2D((2, 2))

        self.conv3_1 = ConvLNReluBlock(64, (3, 3))
        self.conv3_2 = ConvLNReluBlock(64, (3, 3))

        self.flatten = tf.keras.layers.Flatten()
        #kernel_regularizers 추가
        self.dense1 = tf.keras.layers.Dense(1024, activation='relu', 
                                            kernel_regularizers = tf.keras.regularizers.l2(0.01))
        self.dense2 = tf.keras.layers.Dense(10, activation='softmax',
                                            kernel_regularizers = tf.keras.regularizers.l2(0.01)))

    def call(self, x, training=False, mask=None):
        x = self.conv1_1(x)
        x = self.conv1_2(x)
        x = self.pool1(x)

        x = self.conv2_1(x)
        x = self.conv2_2(x)
        x = self.pool2(x)

        x = self.conv3_1(x)
        x = self.conv3_2(x)

        x = self.flatten(x)
        x = self.dense1(x)
        return self.dense2(x)

모델학습

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

댓글