2016-09-18 13 views
11

Bu, nasıl yapılacağını anlayamadığım basit bir şey. Tensorflow: Grafiğin alt bölümlerine önceden eğitilmiş numara ağırlıklarını nasıl atayabilirim?

ben "net" ın kullanılması gibi

o zaman benim sess varsayılan oturumuna ağı yük ... https://github.com/ethereon/caffe-tensorflow gelen github kodunu kullanarak tensorflow için önceden eğitilmiş VGG caffe modelini dönüştürülmüş ve vgg16.npy kaydedildi :

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 sonra tensörler listesiyle bir grafik elde ederim. İlk VGG konvolüsyon katmanı için ağırlık ve önyargılar elde etmek için net.layers ['conv1_1'] ... 'ı kullanarak katman başına tek tek tensörlere erişebilirim.

Şimdi ilk katmanı olan başka bir grafik çiziyorum. "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) 

Benim soru - sen net.layers önceden eğitilmiş ağırlıkları atamak nasıl elde edersiniz [ 'conv1_1'] h_conv1_b için ??

+0

'net.load()' öğenizin zaten bir şeyi TF tensörlerine yüklediğini söylüyorsunuz. Yani sadece W_conv1_b = net.layers ['conv1_1'] .sights 'ya da bunun gibi bir şey yapmanın tam olarak ne önler? –

cevap

3

için load yöntemi (tf.Variable da usul kullanılarak), ikinci ağın değişkenleri değerleri birinci ağ ve yükten tf.Variable -s eval yöntemi kullanılarak değişken değerlerini elde edilebilir (her ikisi de şu anda tansörleri vardır).

11

Özellikle işlev yükü() https://github.com/ethereon/caffe-tensorflow, network.py ayrıntılı bir göz atmanızı öneririz. Net.load (weight_path, session) dediğinizde ne olduğunu anlamanıza yardımcı olur.

FYI, Tensorflow'daki değişkenler, oturumda yürütülen var.assign (np_array) kullanılarak numpy dizisine atanabilir.

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) 

Ben muhtemelen nazik size aşağıdaki noktaları hatırlatmak istiyoruz::

  1. var.assign (veri) 'veri' numpy dizisi ve 'var' İşte sorunuzun çözümdür Aynı oturumda tensorflow değişkeni çalıştırılmalı ve ağınızı yürütmeyi veya antrenmanı devam ettirmek isteyeceksiniz.
  2. 'var', varsayılan olarak 'veriler' ile aynı şekilde oluşturulmalıdır. Bu nedenle, 'var' oluşturmadan önce 'verileri' elde ederseniz, var=tf.Variable(shape=data.shape) yöntemiyle 'var' oluşturmanızı öneririm. Aksi halde, var=tf.Variable(validate_shape=False) yöntemiyle 'var' oluşturmanız gerekir, bu da değişken şeklinin mümkün olduğu anlamına gelir. Detaylı açıklamalar Tensorflow'un API dokümanı içinde bulunabilir.

Aynı repo caffe-tensorflow'u, Theano'daki dönüştürülmüş modeli yükleyebileceğim kaffe içindeki teano'yu desteklemek için uzatıyorum. Bu nedenle, bu repo'nun kodu için makul bir uzmanım. Başka sorularınız varsa lütfen benimle iletişim kurmaktan çekinmeyin.