전체 보기
🍀

VGG16 모델로 이미지 분류 (훈련)

작성일자
2023/03/22
태그
DIARY_DEVELOP
프로젝트
BeachCombine
책 종류
1 more property

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메소드가 구현 안 되어 있어 발생한 에러임
해결 방법) 모델 객체를 다시 구현하거나, inputsoutputs 인수를 명시하여 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 모델 학습시키기