TensorFlow 保存和加载不一致
Posted
技术标签:
【中文标题】TensorFlow 保存和加载不一致【英文标题】:TensorFlow save & load inconsistency 【发布时间】:2020-10-18 15:56:21 【问题描述】:我使用 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
如您所见,准确度显着下降。一些附加信息:
info 1: Model.summary()
在两种情况下都返回相同的架构。
info 2: X_test.shape
返回一个形状为 (13851000, 11) 的矩阵,意思是 13851000 个像素,每个像素有 11 个特征
信息 3:我在加载并评估模型时收到以下警告:
WARNING:tensorflow:Model 是用 shape (None, 1, 11) 作为输入 Tensor("flatten_input_4:0", shape=(None, 1, 11), dtype=float32) 构建的,但它是在一个形状不兼容的输入(无,11)。
为了解决这个警告,我将 X_Test、Y_Test 重新调整为 3 维((13851000, 1, 11), (13851000, 1))并且警告消失了。但是,我的准确率仍然是 0%。
信息 4: print(tf.__version__)
返回 2.3.0
。
信息 5: ls saved_model
返回 my_model
和 ls saved_model\my_model
返回 assets variables saved_model.pb
注意:我正在使用 Windows 10。
【问题讨论】:
【参考方案1】:如果您对训练数据进行了任何预处理,请确保您对测试数据进行完全相同的预处理。例如,如果您重新调整了训练样本中像素的值,则对测试样本执行相同操作。
【讨论】:
我做到了。原始模型上完全相同的输入给出了 95% 的准确度,但加载的模型产生了 0% 的准确度! 我假设在您保存模型之前,您根据测试集对其进行了评估,并且在没有任何警告的情况下获得了 95% 的准确度。然后您保存模型,重新加载它,然后尝试使用完全相同的测试集对其进行评估并收到警告。对吗? 没错。加载模型后,我收到了警告。然后,我尝试重塑输入以消除警告,但我仍然得到相同的结果(没有警告)以上是关于TensorFlow 保存和加载不一致的主要内容,如果未能解决你的问题,请参考以下文章
tensorflow saver 保存和恢复指定 tensor