2016-05-17 7 views
1

私は、イメージパッチを同じコンボリューションカーネルnum_unrollings回で畳み込んだ小さなTensorflowプログラムを作成してから、結果の値とターゲット出力の平均二乗差を最小限に抑えようとします。しかしテンソルフローグラジエントは常にゼロです

、私は1より大きいnum_unrollingsでモデルを実行し、私の私の損失の勾配畳み込みカーネル(tf_kernel)に対する(tf_loss)項はゼロなので、何も学習が発生しません。ここで

は、長さについては申し訳ありません、私は、問題を再現しているを考え出すことができる最小のコード(のpython 3)である。

import tensorflow as tf 
import numpy as np 

batch_size = 1 
kernel_size = 3 
num_unrollings = 2 

input_image_size = (kernel_size//2 * num_unrollings)*2 + 1 

graph = tf.Graph() 

with graph.as_default(): 
    # Input data 
    tf_input_images = tf.random_normal(
     [batch_size, input_image_size, input_image_size, 1] 
    ) 

    tf_outputs = tf.random_normal(
     [batch_size] 
    ) 

    # Convolution kernel 
    tf_kernel = tf.Variable(
     tf.zeros([kernel_size, kernel_size, 1, 1]) 
    ) 

    # Perform convolution(s) 
    _convolved_input = tf_input_images 
    for _ in range(num_unrollings): 
     _convolved_input = tf.nn.conv2d(
      _convolved_input, 
      tf_kernel, 
      [1, 1, 1, 1], 
      padding="VALID" 
     ) 

    tf_prediction = tf.reshape(_convolved_input, shape=[batch_size]) 

    tf_loss = tf.reduce_mean(
     tf.squared_difference(
      tf_prediction, 
      tf_outputs 
     ) 
    ) 

    # FIXME: why is this gradient zero when num_unrollings > 1?? 
    tf_gradient = tf.concat(0, tf.gradients(tf_loss, tf_kernel)) 

# Calculate and report gradient 
with tf.Session(graph=graph) as session: 

    tf.initialize_all_variables().run() 

    gradient = session.run(tf_gradient) 

    print(gradient.reshape(kernel_size**2)) 
    #prints [ 0. 0. 0. 0. 0. 0. 0. 0. 0.] 

はあなたの助けをありがとう!

+0

0の勾配にこの場合のリードになります良いアイデアではありませんと。 – etarion

答えて

1

のようなもので

# Convolution kernel 
tf_kernel = tf.Variable(
    tf.zeros([kernel_size, kernel_size, 1, 1]) 
) 

を交換してみてください:すべてゼロでカーネルの初期化

# Convolution kernel 
tf_kernel = tf.Variable(
    tf.random_normal([kernel_size, kernel_size, 1, 1]) 
) 
関連する問題