我在实现迁移学习时遇到了麻烦。我认为我找到了根本原因,但我不明白为什么会这样。这里是我的解释…
如果我创建了一个模型(例如来自keras.applications的resnet50),然后尝试在TensorFlow会话中使用它,权重突然就会发生变化。这里是一个简单的例子:
首先导入必要的库:
import tensorflow as tffrom keras.applications.resnet50 import ResNet50from keras.models import Model
然后按以下方式定义模型:
model = ResNet50(weights='imagenet')
现在按以下方式打印出某一层的参数:
model.get_layer('conv1').get_weights()
输出很长,但开头如下:
[array([[[[ 2.82526277e-02, -1.18737184e-02, 1.51488732e-03, ..., -1.07003953e-02, -5.27982824e-02, -1.36667420e-03], [ 5.86827798e-03, 5.04415408e-02, 3.46324709e-03, ..., 1.01423981e-02, 1.39493728e-02, 1.67549420e-02], [-2.44090753e-03, -4.86173332e-02, 2.69966386e-03, ..., -3.44439060e-04, 3.48098315e-02, 6.28910400e-03]],
在程序的后续部分,我需要从CSV文件中读取一些数据。我尝试使用TensorFlow的dataset API来读取数据。为此,我创建了一个TensorFlow会话。如果我在TensorFlow会话中使用模型,我发现模型参数发生了变化。
这里是一个代码示例:
init_global_var = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_global_var) print(model.get_layer('conv1').get_weights())
输出开头如下:
[array([[[[ 3.95432524e-02, -2.38095019e-02, -1.64129660e-02, ..., -2.83494107e-02, 2.25975104e-02, -1.48569904e-02], [ 2.40861587e-02, 1.48933977e-02, -4.10864130e-02, ..., -3.18703875e-02, -9.43836942e-03, 1.18204653e-02], [ 2.99405716e-02, 1.69009715e-03, -1.43084712e-02, ..., -2.93575712e-02, 2.70796008e-02, -3.17203328e-02]],
由于我还没有训练模型,我期望看到相同的参数值,但它们并不相同!
所以问题是:我是否必须在TensorFlow会话中创建我的模型?为什么我的resnet50模型在TensorFlow会话中可以访问但参数值却不同?
回答:
显然,这个问题是TensorFlow中另一个问题的重复。请查看以下问题以获取答案: