关于get_variable()和variable_scope()

时间:2016-12-14 04:26:35

标签: tensorflow

我根据image_retrain示例重新训练了初始-V3模型,在原始瓶颈层的顶部有一个额外的转换和池层。这两个层用get_variable()函数初始化 在variable_scope()中,经过培训后,图表和参数存储在.pb文件中。 但是,当我阅读刚刚训练过的.pb文件进行测试并想要检索两个层中的变量时,variable_scope()get_variable(,reuse=true)会引发异常

  

变量权重/ W不存在,或者未使用tf.get_variable()创建。你的意思是在VarScope中设置reuse = None吗?'

环境信息 -

操作系统 :Ubuntu 14.04

已安装的CUDA版本和cuDNN : cuda 8.0 cudnn 5.1

  

我的tensorflow / stream_executor / dso_loader.cc:128]成功打开   CUDA库libcublas.so本地

     

我的tensorflow / stream_executor / dso_loader.cc:128]成功打开   CUDA库libcudnn.so本地

     

我的tensorflow / stream_executor / dso_loader.cc:128]成功打开   CUDA库libcufft.so本地

     

我的tensorflow / stream_executor / dso_loader.cc:128]成功打开   CUDA库本地libcuda.so.1

     

我的tensorflow / stream_executor / dso_loader.cc:128]成功打开   CUDA库libcurand.so本地

     

0.12.0-RC0

我将两个额外的图层初始化为:

  with tf.variable_scope('CAM_unit'):
      CAM_conv = new_conv_layer(bottleneck_input,   [3,3,BOTTLENECK_TENSOR_SIZE,BOTTLENECK_TENSOR_SIZE], 'CAM_CONV')
      CAM_pool = tf.reduce_mean(tf.nn.relu(CAM_conv), [1,2], name='CAM_AVG_POOL')
  with tf.variable_scope('weights'):
      layer_weights = tf.get_variable('W', 
                                      shape = [BOTTLENECK_TENSOR_SIZE, class_count], 
                                      initializer = tf.random_normal_initializer(0., 0.01))

并访问权重/ W变量:

with tf.variable_scope('weights', reuse=True):
        label_w = tf.gather(tf.transpose(tf.get_variable('W')), label)

我尝试设置reuse=None,但错误是:

  

必须完全定义新变量的形状(权重/ W),而不是

我怀疑模型以高精度收敛的.pb文件,因为当我再次使用此输出.pb文件重新训练时,精度非常低,就像未经训练的文件一样。但是我导入了模型,新添加的图层按预期存在,只有get_variable()无法访问 我导入.pb文件并使用代码

搜索目标图层
ops = [op.name for op in graph.get_operations() if 'weights/' in op.name]
    pprint.pprint(ops)

并找到权重/ W变量:

[u'weights/W', u'weights/W/read']

0 个答案:

没有答案