Tensorflow:我如何将numpy预先训练的权重分配给图的子部分?
这是一件简单的事情,我就是不知道怎么做 我使用来自的github代码将预先训练好的VGG caffe模型转换为tensorflow,并将其保存到vgg16.npy 然后,我使用以下方式将网络加载到sess默认会话中,即“网络”: 在net.load之后,我得到一个带有张量列表的图。我可以使用net.layers['conv1_1']访问每个层的单个张量。。。获取第一个VGG卷积层的权重和偏差等 现在假设我制作了另一个图形,它的第一层是“h_conv1_b”:Tensorflow:我如何将numpy预先训练的权重分配给图的子部分?,numpy,tensorflow,Numpy,Tensorflow,这是一件简单的事情,我就是不知道怎么做 我使用来自的github代码将预先训练好的VGG caffe模型转换为tensorflow,并将其保存到vgg16.npy 然后,我使用以下方式将网络加载到sess默认会话中,即“网络”: 在net.load之后,我得到一个带有张量列表的图。我可以使用net.layers['conv1_1']访问每个层的单个张量。。。获取第一个VGG卷积层的权重和偏差等 现在假设我制作了另一个图形,它的第一层是“h_conv1_b”: 我的问题是——如何将预先训练好的权重
我的问题是——如何将预先训练好的权重从net.layers['conv1_1']分配给h_conv1_b??(两个现在都是张量)您可以使用
tf.variable
-s方法从第一个网络获取变量值,并使用方法(也是tf.variable
方法)将这些值加载到第二个网络的变量中。我建议您从中详细查看,尤其是函数load()
。它将帮助您了解调用net.load(weight\u path,session)
时发生了什么
仅供参考,可以使用会话中执行的var.assign(np\u数组)
将Tensorflow中的变量分配给numpy数组。以下是您问题的解决方案:
with tf.Session() as sess:
W_conv1_b = weight_variable([3,3,3,64])
sess.run(W_conv1_b.assign(net.layers['conv1_1'].weights))
b_conv1_b = bias_variable([64])
sess.run(b_conv1_b.assign(net.layers['conv1_1'].biases))
h_conv1_b = tf.nn.relu(conv2d(im_batch, W_conv1_b) + b_conv1_b)
我谨提醒你以下几点:
var.assign(data)
其中“data”是一个numpy数组,“var”是一个TensorFlow变量,应在您希望继续执行网络推理或训练的同一会话中执行李>
var=tf.Variable(shape=data.shape)
创建“var”。否则,您需要通过方法var=tf.Variable(validate\u shape=False)
创建“var”,这意味着变量形状是可行的。详细的解释可以在Tensorflow的API文档中找到我扩展了相同的repo-caffe-tensorflow,以支持caffe中的theano,从而可以在theano中加载来自caffe的转换模型。因此,我是一个合理的专家w.r.t这回购的代码。如果您有任何进一步的问题,请随时与我联系。您似乎在说您的
net.load()
已将内容加载到TF张量中。那么,到底是什么阻止您简单地执行W_conv1_b=net.layers['conv1_1'].weights
之类的操作呢?
W_conv1_b = weight_variable([3,3,3,64])
b_conv1_b = bias_variable([64])
h_conv1_b = tf.nn.relu(conv2d(im_batch, W_conv1_b) + b_conv1_b)
with tf.Session() as sess:
W_conv1_b = weight_variable([3,3,3,64])
sess.run(W_conv1_b.assign(net.layers['conv1_1'].weights))
b_conv1_b = bias_variable([64])
sess.run(b_conv1_b.assign(net.layers['conv1_1'].biases))
h_conv1_b = tf.nn.relu(conv2d(im_batch, W_conv1_b) + b_conv1_b)