我正在尝试用tensorflow实现一些深度神经网络。但我在第一步就已经遇到了问题。
当我使用theano.tensor.nnet.conv2d键入以下内容时,我得到了预期的结果:
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
然而,当我在tf.nn.conv2d中做同样的假设时,我的结果却不同:
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 :(得分:0)
好的,我找到了一个解决方案,即使它不是真的,因为我自己也不了解它。
首先,似乎对于我试图解决的任务,Theano
和Tensorflow
使用不同的卷积。
手头的任务是" 1.5 D卷积"这意味着在输入上只在一个方向上滑动内核(这里是DNA序列)。
在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
此代码生成NaN
,直到我将Tensorflow更新为版本1.0.1
,从那时起,它产生预期的输出。
总而言之,我的问题部分通过使用一维卷积而不是二维卷积来解决,但仍然需要更新框架。对于第二部分,我根本不知道可能导致错误行为的原因。
编辑:我在原始问题中发布的代码现在也正常工作。所以不同的行为只来自一个旧的(可能是腐败的)TF版本。