모델 크기 조절과 규제
모델의 크기 조절
과대적합이 발생할 경우, 해결 방법 중 하나로 모델의 크기를 줄이는 것이 제시된다.
모델의 크기를 조절하는 것은, 레이어의 유닛 수와 레이어의 수를 조절하는 것이다.
1. 레이어 유닛수를 감소시켜 모델 전체 파라미터 수 감소시키기
2. 레이어 수를 줄여서 더 앝은 신경망으로 만들기
데이터의 규모가 클 때, 더 크고 깊은 모델이 더 좋은 성능을 보여주지만, 데이터에 비해 모델이 너무 크면 과대적합이 발생할 수 있다. 따라서 데이터의 크기에 따라 모델 크기를 적절하게 설정해야 한다.
같이보면 좋을 글
모델 규제
규제
모델의 손실함수에서 큰 가중치에 비용을 추가하는 형태
L1 규제, L2 규제가 있다.
모델에 따라 어떤 규제가 좋은지 실험해봐야한다.
# l1
l1_model = models.Sequential()
l1_model.add(layers.Dense(16,
kernel_regularizer='l1',
activation='relu',
input_shape=(10000, )))
l1_model.add(layers.Dense(16,
kernel_regularizer='l1',
activation='relu'))
l1_model.add(layers.Dense(1, activation='sigmoid'))
l1_model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
l1_model.summary()
# l2
l2_model = models.Sequential()
l2_model.add(layers.Dense(16,
kernel_regularizer='l2',
activation='relu',
input_shape=(10000, )))
l2_model.add(layers.Dense(16,
kernel_regularizer='l2',
activation='relu'))
l2_model.add(layers.Dense(1, activation='sigmoid'))
l2_model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
l2_model.summary()
#l1 & l2: l1과 큰 차이 없음
l1_l2_model = models.Sequential()
l1_l2_model.add(layers.Dense(16,
kernel_regularizer='l1_l2',
activation='relu', input_shape=(10000, )))
l1_l2_model.add(layers.Dense(16,
kernel_regularizer='l1_l2',
activation='relu'))
l1_l2_model.add(layers.Dense(1, activation='sigmoid'))
l1_l2_model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
l1_l2_model.summary()
# L2 규제 기본값 0.01에서 커스터마이징 가능
your_model = models.Sequential()
your_model.add(layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.01, activation='relu', input_shape=(10000, )))
your_model.add(layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.01, activation='relu'))
your_model.add(layers.Dense(1, activation='sigmoid'))
your_model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
your_model.summary()
# 저장
l1_l2_model_hist = l1_l2_model.fit(x_train, y_train,
epochs=30,
batch_size=512,
validation_data=(x_test, y_test))
# 그래프 시각화
your_val_loss = your_model_hist.history['val_loss']
epochs = range(1, 31)
plt.plot(epochs, val_loss, 'k--', label='Model')
plt.plot(epochs, l1_val_loss, 'b--', label='L1-regularized')
plt.plot(epochs, l2_val_loss, 'r--', label='L2-regularized')
plt.plot(epochs, l1_l2_val_loss, 'g--', label='L1_L2-regularized')
plt.plot(epochs, your_val_loss, 'y--', label='Your L2-regularized')
plt.xlabel('Epochs')
plt.ylabel('Validation Loss')
plt.legend()
plt.grid()
plt.show()
dropout
모델이 학습을 진행할 때 일부 노드들만 사용하는 방법이다.
일반적으로 20~50% dropout한다.
테스트 단계에서는 그 어떤 노드도 드롭아웃 되지 않고, 대신 해당 레이어의 출력 노드를 드롭아웃 비율에 맞게 줄인다.
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000, )))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.summary()
drop_20_history = model.fit(x_train, y_train,
epochs=30,
batch_size=512,
validation_data=(x_test, y_test))
'AI Theory > key concept of AI' 카테고리의 다른 글
categorical cross entropy vs sparse cross entropy (0) | 2023.07.31 |
---|---|
가중치 초기화와 배치 정규화 (0) | 2023.07.25 |
딥러닝 구조와 모델 (0) | 2023.07.24 |
텐서 표현과 연산 (0) | 2023.07.24 |
[CV] GAN 과 cGAN (0) | 2023.07.18 |