#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. Точно. После загрузки модели я получил это предупреждение. Затем я попытался изменить входные данные, чтобы избежать предупреждения, но я все равно получил те же результаты (без предупреждения)