2016-09-18 10 views
11

Jest to prosta rzecz, której po prostu nie umiałem wymyślić.Tensorflow: Jak przypisać zdumiewająco wyćwiczone ciężary do podrozdziałów wykresu?

konwertowane wstępnie przeszkolony VGG caffe model tensorflow używając kodu GitHub z https://github.com/ethereon/caffe-tensorflow i zapisaniu go vgg16.npy ...

I następnie załadować do mojej sieci domyślnej sesji Sesja jako „netto” za pomocą :

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) 

Po net.load, otrzymuję wykres z listą tensorów. Mogę uzyskać dostęp do poszczególnych tensorów na warstwę za pomocą net.layers ['conv1_1'] ... aby uzyskać wagi i odchylenia dla pierwszej warstwy splotu VGG, itp.

Załóżmy teraz, że wykonuję inny wykres, który ma jako pierwszą warstwę "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) 

Moje pytanie jest - jak można dostać się do przypisania wstępnie przeszkolony ciężarów od net.layers [ 'conv1_1'] do h_conv1_b ?? (Oba są teraz tensory)

+0

Wydaje się, że mówisz, że twoje 'net.load()' już ładuje rzeczy do tensorów TF. Co dokładnie uniemożliwia po prostu zrobienie 'W_conv1_b = net.layers ['conv1_1'] .waga ?, czy coś w tym stylu? –

Odpowiedz

3

można uzyskać wartości zmiennych za pomocą eval metodę tf.Variable -s z pierwszej sieci i obciążenia, które wartości do zmiennych drugiej sieci z wykorzystaniem load metody (także sposobu tf.Variable).

11

Proponuję szczegółowo zapoznać się z network.py z https://github.com/ethereon/caffe-tensorflow, zwłaszcza funkcji load(). Pomoże ci zrozumieć, co się stało, gdy wywołałeś net.load (weight_path, session).

FYI, zmienne w Tensorflow można przypisać do tablicy numpy za pomocą var.assign (np_array), która jest wykonywana w sesji. Oto rozwiązanie Twojego pytania:

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) 

bym prawdopodobnie Przypominamy Państwu następujące punkty:

  1. var.assign (dane), w którym „dane” jest numpy tablicy i „var” to zmienna tensorflow powinna być wykonywana w tej samej sesji, w której chcesz kontynuować wykonywanie swojej sieci wnioskowania lub szkolenia.
  2. "Zmienna" powinna być domyślnie utworzona jako ten sam kształt co "dane". Dlatego jeśli możesz uzyskać "dane" przed utworzeniem "var", proponuję utworzyć "var" metodą var=tf.Variable(shape=data.shape). W przeciwnym razie musisz utworzyć "var" metodą var=tf.Variable(validate_shape=False), co oznacza, że ​​zmienny kształt jest możliwy. Szczegółowe objaśnienia można znaleźć w dokumencie Tensorflow API.

Wydłużam ten sam repo caffe-tensorflow, aby wesprzeć theano w kaffe, że mogę załadować transformowany model z caffe w Theano. Dlatego jestem rozsądnym ekspertem od tego kodu repo. Jeśli masz dalsze pytania, skontaktuj się ze mną.

Powiązane problemy