Несоответствие сохранения и загрузки TensorFlow

#python #tensorflow #machine-learning #save #load

#python #tensorflow #машинное обучение #Сохранить #загрузка

Вопрос:

Я обучил и сохранил нейронную сеть прямой связи для задачи классификации пикселей, используя TensorFlow с точностью тестирования 95%. В этой модели у меня есть 11 функций для каждого пикселя. Проблема возникает, когда я сохраняю, а затем загружаю модель. При тех же входных данных X и Y, которые я использовал в исходной модели, я получаю точность почти 0% для загруженной модели. Но я ожидаю получить ту же точность 95%! вот пример кода, который я использовал:

 model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(1, 11))) # my input shape (13851000, 11) 
model.add(keras.layers.Dense(32, activation = 'relu'))
model.add(keras.layers.Dense(7))
model.summary()
optim = tf.keras.optimizers.Adam(learning_rate=0.01, beta_1=0.9,
                                     beta_2=0.999, epsilon=1e-07,
                                     amsgrad=False, name='Adam') 

call1 = tf.keras.callbacks.EarlyStopping(
    monitor='val_loss', min_delta=0, patience=3, verbose=0, mode='auto',
    baseline=None, restore_best_weights=False)

model.compile(optimizer=optim,
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
history = model.fit(X_train, Y_train, epochs=100, validation_split = 0.2,
                    callbacks=[call1])
  

Вот точность исходной модели:

 print('nTest accuracy:', test_acc)

> Test accuracy: 0.9543394446372986
  

Теперь, когда я сохраняю и загружаю модель:

 model.save('saved_model/my_model')
new_model = tf.keras.models.load_model('saved_model/my_model')
loss, acc = new_model.evaluate(X_test,  Y_test, verbose=2)
print('Restored model, accuracy: {:5.2f}%'.format(100*acc))

> 432844/432844 - 439s - loss: 0.1413 - accuracy: 7.2197e-08
  

Как вы можете видеть, точность значительно снизилась. Некоторая дополнительная информация:

информация 1: Model.summary() возвращает одну и ту же архитектуру в обоих случаях.

информация 2: X_test.shape возвращает матрицу с формой (13851000, 11), что означает 13851000 пикселей, каждый из которых содержит 11 объектов

информация 3: я получаю следующее предупреждение при загрузке, а затем оцениваю модель:

ПРЕДУПРЕЖДЕНИЕ: tensorflow:модель была построена с использованием формы (None, 1, 11) для тензора ввода («flatten_input_4:0», shape = (None, 1, 11), dtype = float32), но она была вызвана для ввода с несовместимой формой (None, 11).

Чтобы устранить это предупреждение, я изменил X_Test, Y_Test, чтобы они были трехмерными ((13851000, 1, 11), (13851000, 1)) и предупреждение исчезло. Тем не менее, я все еще получил точность 0%.

информация 4: print(tf.__version__) возвращает 2.3.0 .

информация 5: ls saved_model возврат my_model и ls saved_modelmy_model возврат assets variables saved_model.pb

Примечание: я работаю над Windows 10.

Ответ №1:

Если вы выполняли какую-либо предварительную обработку обучающих данных, убедитесь, что вы выполняете точно такую же предварительную обработку своих тестовых данных. Например, если вы изменили масштаб значения ваших пикселей в обучающих выборках, сделайте то же самое для тестовых выборок.

Комментарии:

1. Я сделал. Точно такой же ввод в исходной модели дает точность 95%, но загруженная модель дает точность 0%!

2. Я предполагаю, что перед сохранением модели вы оценили ее по тестовому набору и получили точность 95% без каких-либо предупреждений. Затем вы сохранили модель, перезагрузили ее, а затем попытались оценить ее, используя тот же набор тестов, и получили предупреждение. Это правильно?

3. Точно. После загрузки модели я получил это предупреждение. Затем я попытался изменить входные данные, чтобы избежать предупреждения, но я все равно получил те же результаты (без предупреждения)