为什么在TensorFlow会话中访问Keras模型时参数值会发生变化?

我在实现迁移学习时遇到了麻烦。我认为我找到了根本原因,但我不明白为什么会这样。这里是我的解释…

如果我创建了一个模型(例如来自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中另一个问题的重复。请查看以下问题以获取答案:

将Keras模型集成到TensorFlow中

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注