tensorflow - 为什么在 tensorflow 会话中访问 keras 模型参数值会发生变化?
问题描述
我的迁移学习实施遇到了麻烦。我想我找到了根本原因,但我不清楚它为什么会这样。这里是解释...
如果我创建一个模型(例如来自 keras.applications 的 resnet50),然后尝试在 tensorflow 会话中使用它,权重会突然发生变化。这是一个简单的例子:
首先导入必要的库:
import tensorflow as tf
from keras.applications.resnet50 import ResNet50
from 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 的数据集 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 中另一个问题的复制品。请查看此问题以获取答案:
推荐阅读
- c++ - DirectXTK SoundEffect->CreateInstance() 返回 NULL
- android - 尝试将其读入字节数组时,意图选择的文件路径为空
- c# - if 语句自行清除面板中的控件
- docker - 有没有办法从同一网络上的另一台计算机 ssh 到 docker 机器
- java - Java中的异常和数组问题
- powershell - 带通配符的变量
- python - 如何过滤列表中出现在同一列表python中较长元素中的字符串元素?
- arrays - Python/curve_fit:无法通过初始化猜测传递数组
- java - 为什么我在使用带有片段的 RecyclerView 时不断收到空引用错误
- java - 为什么按任意键方法不会循环停止?