tensorflow:与theano相比卷积的奇怪结果(尽管不是翻转)

时间:2017-03-15 17:23:52

标签: python tensorflow theano

我正在尝试用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不会翻转内核(实现互相关)。

你知道为什么没有给出相同的结果吗?

提前致谢,

罗马

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个解决方案,即使它不是真的,因为我自己也不了解它。 首先,似乎对于我试图解决的任务,TheanoTensorflow使用不同的卷积。 手头的任务是" 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版本。