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_modells saved_model\my_model 返回 assets variables saved_model.pb

注意:我正在使用 Windows 10。

【问题讨论】:

【参考方案1】:

如果您对训练数据进行了任何预处理,请确保您对测试数据进行完全相同的预处理。例如,如果您重新调整了训练样本中像素的值,则对测试样本执行相同操作。

【讨论】:

我做到了。原始模型上完全相同的输入给出了 95% 的准确度,但加载的模型产生了 0% 的准确度! 我假设在您保存模型之前,您根据测试集对其进行了评估,并且在没有任何警告的情况下获得了 95% 的准确度。然后您保存模型,重新加载它,然后尝试使用完全相同的测试集对其进行评估并收到警告。对吗? 没错。加载模型后,我收到了警告。然后,我尝试重塑输入以消除警告,但我仍然得到相同的结果(没有警告)

以上是关于TensorFlow 保存和加载不一致的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow saver 保存和恢复指定 tensor

pytorch的Tensor的操作

tensorflow

如何保存Tensorflow中的Tensor参数,保存训练中的中间参数,存储卷积层的数据

tensorflow 训练好的模型,怎么 调用

tensorflow基础知识