我根据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']