2017-03-15 7 views
0

私はtensorflowでいくつかの深いニューラルネットワークを実装しようとしています。しかし、私はすでに最初のステップで問題があります。tensorflow:畳み込みによる奇妙な結果がtheanoに比べて(フリップしていないが)

私はtheano.tensor.nnet.conv2dを使用して次のように入力すると、私は期待した結果を得る:私はtf.nn.conv2dにpresumingly同じことを行うとき

import theano.tensor as T 
import theano 
import numpy as np 
# Theano expects input of shape (batch_size, channels, height, width) 
# and filters of shape (out_channel, in_channel, height, width) 
x = T.tensor4() 
w = T.tensor4() 
c = T.nnet.conv2d(x, w, filter_flip=False) 
f = theano.function([x, w], [c], allow_input_downcast=True) 
base = np.array([[1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]).T 
i = base[np.newaxis, np.newaxis, :, :] 
print f(i, i) # -> results in 3 as expected because np.sum(i*i) = 3 

をしかし、私の結果は異なります。

import tensorflow as tf 
import numpy as np 
# TF expects input of (batch_size, height, width, channels) 
# and filters of shape (height, width, in_channel, out_channel) 
x = tf.placeholder(tf.float32, shape=(1, 4, 3, 1), name="input") 
w = tf.placeholder(tf.float32, shape=(4, 3, 1, 1), name="weights") 
c = tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='VALID') 
with tf.Session() as sess: 
    base = np.array([[1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]).T 
    i = base[np.newaxis, :, :, np.newaxis] 
    weights = base[:, :, np.newaxis, np.newaxis] 
    res = sess.run(c, feed_dict={x: i, w: weights}) 
    print res # -> results in -5.31794233e+37 

テンソルフローでの畳み込み演算のレイアウトはtheanoとは少し異なります。これは入力が少し違って見える理由です。 しかし、Theanoのストライドはデフォルトで(1,1,1,1)と有効なコンボリューションもデフォルトであるため、これはまったく同じ入力でなければなりません。

さらに、tensorflowはカーネルを反転させません(相互相関を実装します)。

なぜ同じ結果が得られないのかご存じですか?事前に

おかげで、

ローマ

答えて

0

わかりました、私はそれを自分自身を理解していないので、それは本当に1でなくても、解決策を見つけました。 最初に、私が解決しようとしていたタスクのために、TheanoTensorflowは異なる畳み込みを使用するようです。 手元のタスクは、カーネルを入力(ここではDNAシーケンス)上の一方向のみにスライドさせることを意味する「1.5 D畳み込み」です。

Theanoでは、カーネルと同じ行数のconv2d操作でこれを解決し、うまくいきました。

しかし、Tensorflow(おそらく正しく)は、私がconv1dを使用してその行をチャンネルとして解釈することを望んでいます。

ので、以下では動作するはずですが、最初にしませんでした:

import tensorflow as tf 
import numpy as np 

# TF expects input of (batch_size, height, width, channels) 
# and filters of shape (height, width, in_channel, out_channel) 
x = tf.placeholder(tf.float32, shape=(1, 4, 3, 1), name="input") 
w = tf.placeholder(tf.float32, shape=(4, 3, 1, 1), name="weights") 

x_star = tf.reshape(x, [1, 4, 3]) 
w_star = tf.reshape(w, [4, 3, 1]) 
c = tf.nn.conv1d(x_star, w_star, stride=1, padding='VALID') 
with tf.Session() as sess: 
    base = np.array([[1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]).T 
    i = base[np.newaxis, :, :, np.newaxis] 
    weights = base[:, :, np.newaxis, np.newaxis] 
    res = sess.run(c, feed_dict={x: i, w: weights}) 
    print res # -> produces 3 after updating tensorflow 

私はバージョン1.0.1にTensorflowを更新して以来、それが期待される出力を生成するまで、このコードはNaNを生産。要約すると、私の問題は、2D畳み込みの代わりに1D畳み込みを使用することによって部分的に解決されましたが、依然としてフレームワークの更新が必要でした。 2番目の部分については、最初は間違った振る舞いを引き起こしているかもしれないものは全く考えていません。

編集:私のオリジナルの質問に投稿したコードは、今もうまくいきます。だから違う振る舞いはTFの古いバージョン(たぶん壊れているかもしれない)からしか来なかった。

関連する問題