Tensorflow:我如何将numpy预先训练的权重分配给图的子部分?

Tensorflow:我如何将numpy预先训练的权重分配给图的子部分?,numpy,tensorflow,Numpy,Tensorflow,这是一件简单的事情,我就是不知道怎么做 我使用来自的github代码将预先训练好的VGG caffe模型转换为tensorflow,并将其保存到vgg16.npy 然后,我使用以下方式将网络加载到sess默认会话中,即“网络”: 在net.load之后,我得到一个带有张量列表的图。我可以使用net.layers['conv1_1']访问每个层的单个张量。。。获取第一个VGG卷积层的权重和偏差等 现在假设我制作了另一个图形,它的第一层是“h_conv1_b”: 我的问题是——如何将预先训练好的权重

这是一件简单的事情,我就是不知道怎么做

我使用来自的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”应创建为与“data”相同的形状。因此,如果您可以在创建“var”之前获取“data”,我建议您通过方法
    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)