Почему веса можно использовать только на тренировках?

0

Вопрос

После вызова функции подгонки я вижу, что модель сходится в обучении, но после того, как я перехожу к вызову метода оценки, он действует так, как будто модель вообще не выполняла подгонку. Лучший пример приведен ниже, где я использую обучающий генератор для обучения и проверки и получаю разные результаты.

import tensorflow as tf
from tensorflow.keras.callbacks import ModelCheckpoint

from ImageGenerator import ImageGenerator

if __name__== "__main__":

    batch_size=64

    train_gen = ImageGenerator('synthetic3/train/open/*.png', 'synthetic3/train/closed/*.png', batch_size=batch_size)

    model = tf.keras.applications.mobilenet_v2.MobileNetV2(weights=None, classes=2, input_shape=(256, 256, 3))

    model.compile(optimizer='adam', 
                loss=tf.keras.losses.CategoricalCrossentropy(),
                metrics=['accuracy'])

    history = model.fit(
        train_gen,
        validation_data=train_gen,
        epochs=5,
        verbose=1
    )
    
    model.evaluate(train_gen)

Результаты

Epoch 1/5
19/19 [==============================] - 11s 600ms/step - loss: 0.7707 - accuracy: 0.5016 - val_loss: 0.6932 - val_accuracy: 0.5016
Epoch 2/5
19/19 [==============================] - 10s 533ms/step - loss: 0.6991 - accuracy: 0.5855 - val_loss: 0.6935 - val_accuracy: 0.4975
Epoch 3/5
19/19 [==============================] - 10s 509ms/step - loss: 0.6213 - accuracy: 0.6637 - val_loss: 0.6932 - val_accuracy: 0.4992
Epoch 4/5
19/19 [==============================] - 10s 514ms/step - loss: 0.4407 - accuracy: 0.8158 - val_loss: 0.6934 - val_accuracy: 0.5008
Epoch 5/5
19/19 [==============================] - 10s 504ms/step - loss: 0.3200 - accuracy: 0.8643 - val_loss: 0.6949 - val_accuracy: 0.5000
19/19 [==============================] - 3s 159ms/step - loss: 0.6953 - accuracy: 0.4967

Это проблематично, потому что даже при сохранении веса это экономит, как если бы модель не выполняла подгонку.

keras machine-learning python tensorflow
2021-11-24 04:34:14
2
0

функция evaluate() принимает набор данных проверки в качестве входных данных для оценки уже обученной модели.

Судя по всему, вы используете учебный набор данных (train_gen) для проверки данных_данных и передаете тот же набор данных в качестве входных данных в модель.

2021-11-24 11:43:27

Да, я сделал это специально, чтобы показать, что, хотя точность поезда улучшается, проверка-нет. Даже в одном и том же наборе данных
ac4824

Лучший ответ

0

Привет всем после многих дней боли, наконец, нашел решение этой проблемы. Это связано со слоями пакетной нормализации в модели. Параметр momentum необходимо изменить в соответствии с размером пакета, если вы планируете обучение в качестве пользовательского набора данных.

for layer in model.layers:
    if type(layer)==type(tf.keras.layers.BatchNormalization()):
        # renorm=True, Can have renomalization for smaller batch sizes
        layer.momentum=new_momentum

Источники: https://github.com/tensorflow/tensorflow/issues/36065

2021-12-10 04:30:31

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................