2016-09-18 52 views
11

這是一件簡單的事情,我只是無法弄清楚該怎麼做。Tensorflow:我如何將圖形的小節分配給numpy預訓練的權重?

我轉換預先訓練VGG朱古力模型中使用來自https://github.com/ethereon/caffe-tensorflow GitHub的代碼tensorflow並保存它vgg16.npy ...

我那麼網絡加載到我的SESS默認會話爲「網」使用:

images = tf.placeholder(tf.float32, [1, 224, 224, 3]) 
net = VGGNet_xavier({'data': images, 'label' : 1}) 
with tf.Session() as sess: 
    net.load("vgg16.npy", sess) 

在net.load之後,我得到一張張量列表圖。我可以使用net.layers ['conv1_1'] ...來獲取每個層的單獨張量,以獲得第一個VGG卷積層的權重和偏差等。

現在假設我製作了另一個圖形作爲其第一層「h_conv1_b」:

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) 

我的問題是 - 你怎麼從net.layers分配預訓練的權重[「conv1_1」]到h_conv1_b? (均爲現在張量)

+0

你似乎在說你的'net.load()'已經把東西加載到TF張量中了。那麼究竟是什麼阻止你簡單地做'W_conv1_b = net.layers ['conv1_1']。weights'或類似的東西呢? –

回答

3

可以使用的tf.Variable -s eval方法從該值到使用load方法(也是tf.Variable的方法)所述第二網絡的變量的第一網絡和負載獲得的變量值。

11

我建議你仔細看看https://github.com/ethereon/caffe-tensorflownetwork.py,特別是函數load()。它會幫助你理解當你調用net.load(weight_path,session)時發生了什麼。

僅供參考,在Tensorflow變量可以通過使用var.assign(np_array),其在會話中執行被分配給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) 

我想可能好心提醒你以下幾點:

  1. var.assign(數據),其中「數據」是一個numpy的陣列和「變種」是一個tensorflow變量,應該在您想要繼續執行網絡推理或培訓的同一會話中執行。
  2. 默認情況下,應該將'var'創建爲與'data'相同的形狀。因此,如果您在創建'var'之前可以獲取'數據',我建議您通過方法var=tf.Variable(shape=data.shape)創建'var'。否則,您需要通過方法var=tf.Variable(validate_shape=False)創建'var',這意味着變量形狀是可行的。詳細的解釋可以在Tensorflow的API文檔中找到。

我擴展了相同的回購咖啡張量流來支持kaano中的theano,我可以從Theano中的咖啡中加載轉換後的模型。因此,我是這個回購代碼的合理專家。如有任何疑問,請隨時與我聯繫。

相關問題