如何在TensorFlow中修复尺寸错误?

时间:2015-12-04 16:24:23

标签: python tensorflow

我试图将教程的专家部分应用到我自己的数据中,但我一直在遇到维度错误。这是导致错误的代码。

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

W_conv1 = weight_variable([1, 8, 1, 4])
b_conv1 = bias_variable([4])

x_image = tf.reshape(tf_in, [-1,2,8,1])

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

然后当我尝试运行此命令时:

W_conv2 = weight_variable([1, 4, 4, 8])
b_conv2 = bias_variable([8])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

我收到以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-41-7ab0d7765f8c> in <module>()
      3 
      4 h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
----> 5 h_pool2 = max_pool_2x2(h_conv2)

ValueError: ('filter must not be larger than the input: ', 'Filter: [', Dimension(2), 'x', Dimension(2), '] ', 'Input: [', Dimension(1), 'x', Dimension(4), '] ')

仅仅为了一些背景信息,我正在处理的数据是一个CSV文件,其中每行包含10个要素和1个空列,可以是1或0.我想尝试的是什么get是空列中的概率,该列将等于1。

2 个答案:

答案 0 :(得分:6)

您必须对输入进行整形,使其与训练张量和输出兼容。如果输入长度为1,则输出应为长度1(长度代替尺寸)。

当你处理 -

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 1, 1, 1],
                    strides=[1, 1, 1, 1], padding='SAME')

注意我如何将步幅和ksize更改为[1, 1, 1, 1]。这将使输出与1维输入相匹配,并防止出现错误。

当您定义体重变量时(参见下面的代码) -

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

你必须让前2个数字符合你用来训练模型的特征张量,最后两个数字将是预测输出的维度(与输入的维度相同)

W_conv1 = weight_variable([1, 10, 1, 1])
b_conv1 = bias_variable([1])

注意开头的[1, 10,表示特征张量将是1x10特征张量;最后两个数字1, 1]对应于输入和输出张量/预测值的维度。

当您重塑x_foo张量(我称之为x_ [x prime])时,无论出于何种原因,您必须像这样定义它 -

x_ = tf.reshape(x, [-1,1,10,1])

注意中间的{1}和...1,10,...。再一次,这些数字对应于要素张量的维度。

对于每个偏差变量,您可以选择先前定义的变量的最终编号。例如,如果W_conv1 = weight_variable([1, 10, 1, 1])如此显示,则取最终数字并将其放入偏差变量中,以便它可以匹配输入的尺寸。这样做就像b_conv1 = bias_variable([1])一样。

如果您需要更多解释,请在下面发表评论。

答案 1 :(得分:3)

您用于过滤器的尺寸与隐藏图层的输出不匹配。

让我看看我是否理解你:你的输入由8个特征组成,你想将它重塑为2x4矩阵,对吗?

使用weight_variable([1, 8, 1, 4])创建的权重期望在一个通道中输入1x8,并在4个通道(或隐藏单位)中生成1x8输出。您使用的过滤器以2x2方格扫描输入。但是,由于权重的结果是1x8,它们将不匹配。

您应该将输入重新整形为

x_image = tf.reshape(tf_in, [-1,2,4,1])

现在,您的输入实际上是2x4而不是1x8。然后,您需要将权重形状更改为(2, 4, 1, hidden_units)以处理2x4输出。它还将产生2x4输出,现在可以应用2x2滤波器。

之后,过滤器将匹配权重的输出。另请注意,您必须将第二个权重矩阵的形状更改为weight_variable([2, 4, hidden_units, hidden2_units])