为什么keras模型参数值在tensorflow会话中访问时会更改?

为什么keras模型参数值在tensorflow会话中访问时会更改?,tensorflow,machine-learning,keras,conv-neural-network,Tensorflow,Machine Learning,Keras,Conv Neural Network,我在迁移学习的实施上遇到了问题。我想我找到了根本原因,但我不清楚为什么会这样。下面是解释 如果我创建一个模型(例如keras.applications中的resnet50),然后尝试在tensorflow会话中使用它,权重会突然发生变化。 下面是一个简单的例子: init_global_var = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_global_var) print(mo

我在迁移学习的实施上遇到了问题。我想我找到了根本原因,但我不清楚为什么会这样。下面是解释

如果我创建一个模型(例如keras.applications中的resnet50),然后尝试在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())
首先导入必要的库:

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]],
[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]],
现在,按如下方式打印其中一个图层的参数:

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]],
[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]],
输出很长,但其开始如下所示:

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]],
[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]],
在程序的后面,我需要从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())
输出如下所示开始:

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]],
[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中另一个问题的复制品。请检查此问题以获得答案:


所有权重都保存在
保存权重中
。如果您能提供错误消息和示例代码来重现错误,那就更好了。@Yu Yang,谢谢您的回答!我一直在研究这个问题,并在很大程度上更新了上述问题。您的新评论非常受欢迎。我认为您不应该运行
global\u variables\u initializer
。这会重新初始化权重。是的,我发现运行初始化器会破坏一切。但一般的建议似乎是在这种情况下不要创建新的tf会话。在Stackoverflow中有一个类似的问题与此相关。我在下面的答案中添加了链接。