VGG16 모델로 이미지 분류
Train에서 발생한 에러
•
아래 코드를 돌렸을 때
checkpoint = ModelCheckpoint(filepath = 'mymodel.h5',
verbose = 2, save_best_only=True)
callbacks = [checkpoint]
start = datetime.now()
model_history = model.fit_generator(
train_set,
validation_data = test_set,
epochs = 10,
steps_per_epoch = 5,
validation_steps = 32,
callbacks = callbacks,
verbose = 2)
duration = datetime.now() - start
print("Training completed in time: ", duration)
Python
복사
•
아래와 같이 에러 로그가 떴다.
<ipython-input-25-3f749319f16e>:11: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
model_history = model.fit_generator(
Epoch 1/10
WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 50 batches). You may need to use the repeat() function when building your dataset.
WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 32 batches). You may need to use the repeat() function when building your dataset.
Epoch 1: val_loss improved from inf to 0.83437, saving model to mymodel.h5
5/5 - 113s - loss: 1.8010 - accuracy: 0.8019 - val_loss: 0.8344 - val_accuracy: 0.9130 - 113s/epoch - 23s/step
Training completed in time: 0:02:22.439870
YAML
복사
•
해결
◦
이 에러는 fit_generator()함수가 더 이상 지원되지 않기 때문에 발생함. 대신, fit()
함수를 사용해야 함.
◦
에러 메시지에서 "Your input ran out of data"와 같은 메시지가 표시될 때, 주로 데이터셋이나 데이터 제너레이터에서 문제가 발생한 경우임. 이 에러 메시지는 데이터셋 또는 데이터 제너레이터에서 생성된 배치(batch)의 수가 모델이 지정한 배치 수보다 적어서 발생함. → 나는 train, test_set의 batch_size와 validation_steps를 32에서 10으로 줄여주어 해결함
◦
수정한 코드
checkpoint = ModelCheckpoint(filepath='mymodel.h5', verbose=2, save_best_only=True)
callbacks = [checkpoint]
start = datetime.now()
model_history = model.fit(
train_set,
validation_data=test_set,
epochs=10,
steps_per_epoch=5,
validation_steps=10,
callbacks=callbacks,
verbose=2
)
duration = datetime.now() - start
print("Training completed in time: ", duration)
Python
복사
모델 Train 결과 - 이상 있음
•
loss가…. 감소하다가 갑자기 에포크 8쯤에서 증가한다. 감소하는 거 보고 좋아했는데 잠시 눈 뗐다가 다시 보니,, 배신,,
•
손실함수가 감소하다가 갑자기 커지는 건 오버피팅 떄문일 확률이 높다고 한다,,,
•
해결하기 위한 방법은 일단 정규화를 해보고 안되면 데이터 더 찾아 넣음 된다,,
Test 진행 중 발생한 에러
•
preds = model.predict(x) 코드 실행 시 하단 에러 발생
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
<ipython-input-27-074b2fc7e75c> in <module>
1 # 이미지 예측
----> 2 preds = model.predict(x)
1 frames
/usr/local/lib/python3.9/dist-packages/keras/engine/training.py in tf__predict_function(iterator)
13 try:
14 do_return = True
---> 15 retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)
16 except:
17 do_return = False
NotImplementedError: in user code:
File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 2137, in predict_function *
return step_function(self, iterator)
File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 2123, in step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 2111, in run_step **
outputs = model.predict_step(data)
File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 2079, in predict_step
return self(x, training=False)
File "/usr/local/lib/python3.9/dist-packages/keras/utils/traceback_utils.py", line 70, in error_handler
raise e.with_traceback(filtered_tb) from None
File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 588, in call
raise NotImplementedError(
NotImplementedError: Exception encountered when calling layer 'model_1' (type Model).
Unimplemented `tf.keras.Model.call()`: if you intend to create a `Model` with the Functional API, please provide `inputs` and `outputs` arguments. Otherwise, subclass `Model` with an overridden `call()` method.
Call arguments received by layer 'model_1' (type Model):
• inputs=tf.Tensor(shape=(None, 224, 224, 3), dtype=float32)
• training=False
• mask=None
Python
복사
•
해결
◦
원인) 모델 객체의 call메소드가 구현 안 되어 있어 발생한 에러임
◦
해결 방법) 모델 객체를 다시 구현하거나, inputs및 outputs 인수를 명시하여 Functional API를 사용하여 모델 객체를 생성하면 됨
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
inputs = Input(shape=(224, 224, 3))
x = Dense(64, activation='relu')(inputs)
outputs = Dense(10, activation='softmax')(x)
model = Model(inputs=inputs, outputs=outputs)
Python
복사
하루 정리
TIL 작성하기
BeachCombine
클라 수정사항 반영
ML 모델 학습시키기