2017-01-07 15 views
0

私はVGGを微調整する必要があります.5つの畳み込みレイヤーと3つの完全に接続されたレイヤーがあります。最後に完全に接続された層からの出力は損失関数の入力である。以下は私のコードです:損失の出力はありません

class vgg16: 
    def __init__(self, imgs1,imgs2, weights=None, sess=None): 

     self.imgs1 = imgs1 
     self.imgs2 = imgs2 

     with tf.variable_scope("siamese") as scope: 
      self.o1 = self.convlayers(imgs1) 
     self.fc_layers() 

     self.loss() 

     if weights is not None and sess is not None: 
       self.load_weights(weights, sess) 
      scope.reuse_variables() 
      self.o2 = self.convlayers(imgs2) 
     self.fc_layers() 
     self.loss() 

     if weights is not None and sess is not None: 
      self.load_weights(weights, sess) 
     #create loss function 


    def convlayers(self,imgs): 
     .... 

     # conv1_2 
     with tf.name_scope('conv1_2') as scope: 
      ...... 
     # pool1 


    .. 
) 

     ..... 

     # pool5 
     self.pool5 = tf.nn.max_pool(self.conv5_3, 
           ksize=[1, 2, 2, 1], 
           strides=[1, 2, 2, 1], 
           padding='SAME', 
           name='pool4') 

    def fc_layers(self): 
     # fc1 
     with tf.name_scope('fc1') as scope: 
      .... 
     # fc2 
     with tf.name_scope('fc2') as scope: 
      ... 

     # fc3 
     with tf.name_scope('fc3') as scope: 
      fc3w = tf.Variable(tf.truncated_normal([4096, 1000], 
                dtype=tf.float32, 
                stddev=1e-1), name='weights') 
     fc3b = tf.Variable(tf.constant(1.0, shape=[1000], dtype=tf.float32), 
          trainable=True, name='biases') 
     self.fc3l = tf.nn.bias_add(tf.matmul(self.fc2, fc3w), fc3b) 
    def load_weights(self, weight_file, sess): 
     weights = np.load(weight_file) 
     keys = sorted(weights.keys()) 
     for i, k in enumerate(keys): 
      print i, k, np.shape(weights[k]) 
      sess.run(self.parameters[i].assign(weights[k])) 
    def loss(self): 

    loss=tf.nn.l2_loss(self.fc3l) 


    self.train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 



if __name__ == '__main__': 
    sess = tf.Session() 
    imgs1 = tf.placeholder(tf.float32, [None, 224, 224, 3])#jis size ka bhi imaeg hai usko 224x224 may kar diya or RGB chaeay hmay 
    imgs2 = tf.placeholder(tf.float32, [None, 224, 224, 3]) 
    vgg = vgg16(imgs1,imgs2, 'vgg16_weights.npz', sess) 


    img1 = imread('laska.png', mode='RGB') 
    img1 = imresize(img1, (224, 224)) 
    img2 = imread('laska2.jpg', mode='RGB') 
    img2 = imresize(img2,(224, 224)) 

    prob = sess.run(vgg.train_step, feed_dict={vgg.imgs1: [img1],vgg.imgs2: [img2]}) 
    print('loss is:') 
    print(prob) 

問題の出力はなしです。親切に私が間違っていることを示します。

PS:私はsiameseアーキテクチャに従っています。両方のブランチへの入力は、ここでは異なる画像です。

答えて

1

op self.train_stepは何も返さず、グラデーションを計算して変数を更新するだけです。 hereを参照してください。

self.loss=tf.nn.l2_loss(self.fc3l) 

、その後、単一sess.runの両方train_stepと損失の操作を実行します:あなたがする必要がどのような

は、このようなあなたのvgg16クラスのlossテンソルへの参照を保存することです

_, loss_value = sess.run([vgg.train_step, vgg.loss], feed_dict=...) 
print('loss is:') 
print(loss_value) 
関連する問題