如何修复 TensorFlow 中的维度错误?

How do I fix a dimension error in 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 的空列。我想要得到的是空列中该列等于 1 的概率。

您用于过滤器的维度与隐藏层的输出不匹配。

让我看看我是否理解你:你的输入由 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])

您必须对输入进行整形,使其与训练张量和输出兼容。如果您输入的是长度 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] 的。这会将输出与一维输入相匹配,并防止出现错误。

当你定义你的权重变量时(见下面的代码)-

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)

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

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

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

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

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

注意中间的 1 和 10- ...1,10,...。再一次,这些数字对应于你的特征张量的维度。

对于每个偏差变量,您选择先前定义的变量的最终编号。例如,如果 W_conv1 = weight_variable([1, 10, 1, 1]) 看起来像这样,您将得到最终数字并将其放入偏差变量中,以便它可以匹配输入的维度。这是这样做的 - b_conv1 = bias_variable([1]).

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