save/restore 时,带有 Tensorflow Hub 的 Keras 模型不会给出相同的结果
Keras model with Tensorflow Hub does not give same result when save/restore
我有一个使用 Tensorflow 中心层的 Keras 模型。然而,该模型在原始模型和恢复模型之间没有给出相同的预测。
我的 Keras 模型:
hub_layer = hub.KerasLayer("https://tfhub.dev/google/remote_sensing/eurosat-resnet50/1", tags=['train'], input_shape=(64,64,3))
original_model = Sequential()
original_model.add(hub_layer)
original_model add(Dense(32, activation='relu'))
original_model.add(Dense(1, activation='sigmoid'))
original_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = original_model.fit(train_generator, epochs=100)
img_batch = ... # Image batch of shape (32, 64, 64, 3)
original_model.predict(img_batch)
原始模型输出:
Out[1] : array([[0.803754 ],
[0.2758078 ],
...
[0.26074764],
[0.6190501 ]]
保存和恢复模型时,预测不一样:
orignial_model.save("model.hd5")
restored_model = tf.keras.models.load_model("model.hd5", custom_objects={'KerasLayer': hub.KerasLayer})
restored_model.predict(img_batch) # The image batch used is exactly the same as before
输出恢复模型:
Out[2] : array([[0.9999999 ],
[1. ],
...
[1. ],
[1. ]]
结果与原来的模型不一样。
我尝试了同样的实验,但没有 Tensorflow 层,问题没有出现。所以我猜问题出在这个Tensorflow hub层。
我也试着比较了这两款机型的配置,它们是一样的:
original_model.get_config() == restored_model.get_config() # Return true
我也比较了两个模型的权重,它们是相同的。
版本:
- 张量流:2.0.0
- 凯拉斯:2.3.1
- Tensorflow 中心:0.8.0
- Python : 3.7.10
我找不到问题的根源,但我找到了替代解决方案。
此解决方案包括从模型中删除 tensorflow hub 层。由这一层完成的转换可以像这样在外面完成:
hub_layer = hub.KerasLayer("https://tfhub.dev/google/remote_sensing/eurosat-resnet50/1", tags=['train'], input_shape=(64,64,3))
original_model = Sequential()
original_model.add(Input(2048))
original_model add(Dense(32, activation='relu'))
original_model.add(Dense(1, activation='sigmoid'))
original_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
X_transformed = hub_layer(X)
history = original_model.fit(X_transformed, y, epochs=100)
通过这样做,原始模型和恢复模型之间的模型预测是相同的。
我有一个使用 Tensorflow 中心层的 Keras 模型。然而,该模型在原始模型和恢复模型之间没有给出相同的预测。
我的 Keras 模型:
hub_layer = hub.KerasLayer("https://tfhub.dev/google/remote_sensing/eurosat-resnet50/1", tags=['train'], input_shape=(64,64,3))
original_model = Sequential()
original_model.add(hub_layer)
original_model add(Dense(32, activation='relu'))
original_model.add(Dense(1, activation='sigmoid'))
original_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = original_model.fit(train_generator, epochs=100)
img_batch = ... # Image batch of shape (32, 64, 64, 3)
original_model.predict(img_batch)
原始模型输出:
Out[1] : array([[0.803754 ],
[0.2758078 ],
...
[0.26074764],
[0.6190501 ]]
保存和恢复模型时,预测不一样:
orignial_model.save("model.hd5")
restored_model = tf.keras.models.load_model("model.hd5", custom_objects={'KerasLayer': hub.KerasLayer})
restored_model.predict(img_batch) # The image batch used is exactly the same as before
输出恢复模型:
Out[2] : array([[0.9999999 ],
[1. ],
...
[1. ],
[1. ]]
结果与原来的模型不一样。
我尝试了同样的实验,但没有 Tensorflow 层,问题没有出现。所以我猜问题出在这个Tensorflow hub层。
我也试着比较了这两款机型的配置,它们是一样的:
original_model.get_config() == restored_model.get_config() # Return true
我也比较了两个模型的权重,它们是相同的。
版本:
- 张量流:2.0.0
- 凯拉斯:2.3.1
- Tensorflow 中心:0.8.0
- Python : 3.7.10
我找不到问题的根源,但我找到了替代解决方案。
此解决方案包括从模型中删除 tensorflow hub 层。由这一层完成的转换可以像这样在外面完成:
hub_layer = hub.KerasLayer("https://tfhub.dev/google/remote_sensing/eurosat-resnet50/1", tags=['train'], input_shape=(64,64,3))
original_model = Sequential()
original_model.add(Input(2048))
original_model add(Dense(32, activation='relu'))
original_model.add(Dense(1, activation='sigmoid'))
original_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
X_transformed = hub_layer(X)
history = original_model.fit(X_transformed, y, epochs=100)
通过这样做,原始模型和恢复模型之间的模型预测是相同的。