【问题标题】:Tensorflow: building graph with batch sizes varying in dimension 1?Tensorflow:构建批量大小在维度 1 上变化的图?
【发布时间】:2017-09-26 19:10:53
【问题描述】:

我正在尝试在 Tensorflow 中构建一个 CNN 模型,其中批次中的所有输入形状相同,但批次之间的输入在维度 1 上有所不同(即小批量大小相同,但小批量形状不同)。

为了更清楚地说明这一点,我有各种值 N 的数据 (Nx23x1),我首先按升序排序。在每批(50 个样本)中,我对每个样本进行零填充,以便每个 N_i 等于其小批量中的最大 N。现在我已经为批量输入定义了 Tensorflow 占位符:

input = tf.placeholder(tf.float32, shape=(batch_size, None, IMAGE_WIDTH, NUM_CHANNELS))

我在输入占位符中使用“无”,因为在批次之间,该值会有所不同,即使在批次中它不会。在运行我的训练代码时,我使用 feed_dict 来传递教程中定义的输入值(numpy 矩阵)。

我的 CNN 代码接受了这个输入;但是,这是我遇到问题的地方。尝试在完全连接的层之前展平输入时出现 ValueError。它试图展平阵列,但其中一个维度仍然是“无”。于是我尝试了:

length = tf.shape(input)[1]
reshaped = tf.reshape(input, [batch_size, length, IMAGE_WIDTH, NUM_CHANNELS])

但该值仍然是“无”,并且在最初尝试构建图表时遇到了问题。我的 FC 层(在展平中)在构建权重和偏置张量时明确采用了“input_to_layer.get_shape()[1]”,但它无法处理 None 输入。

我完全不知道如何进行!非常感谢您的帮助,谢谢:)

## 编辑##

Danevskyi 在下面指出,这可能是不可能的。如果不是全连接层,我想在整个标题上进行池化(即对于从前一个卷积层输出的 1024 个大小为 (D) 的平面过滤器,我想通过均值池化创建一个 1024 维向量呢?在每个过滤器的长度 D 上)? 1D Global Avg Pooling 可以做到这一点吗?同样在批次之间,D 的值会有所不同......

## 更新##

来自 tflearn (tflearn.layers.conv.global_avg_pool) 的全局平均池化方法不需要指定的窗口大小,它使用完整的输入维度,因此即使与 TensorFlow 中未知的“无”维度也兼容。

【问题讨论】:

    标签: tensorflow conv-neural-network


    【解决方案1】:

    没有办法做到这一点,因为您想为每个不同的批次使用不同形状的矩阵(对于全连接层)。

    一种可能的解决方案是使用全局平均池化(沿所有空间维度)来获得形状为 (batch_size, 1, 1, NUM_CHANNELS) 的张量,而不考虑第二个维度。

    【讨论】:

    • 如果不是全连接层,我想在整个标题上池化(即对于从最后一个卷积层输出的 1024 个过滤器,我想创建一个 1024 维向量)汇集每个过滤器的长度)?这可能吗?
    【解决方案2】:

    您可以指定可变形状的占位符并使用它们来存储可变长度的批次。如果您查看 TensorFlow 的基本 MNIST 教程,他们使用以下行作为输入数据占位符 x = tf.placeholder(tf.float32, [None, 784]) 在形状列表中,784 是单个 MNIST 图像的大小(展平为 1D),但 None 是批量大小.这是教程的链接 https://www.tensorflow.org/get_started/mnist/beginners所以你可以看看剩下的代码

    【讨论】:

    • 嗨,Mad,批次中的样本数量没有变化,而是批次之间的数据形状有所不同。
    • 正如 Danevsky 所说,如果你在不同大小的样本上运行卷积然后将它们展平,你会在密集层中得到不同大小的平面输入,这是一个问题。您可以尝试解决一些问题,但由于我对您的模型的用途一无所知,所以我不知道什么对您有用。想到的最简单的解决方案是对样本进行预处理,以将所有样本填充到最大 N 并使用一些中性值(零或其他值)。
    • 嗨,Mad,这就是我最初所做的,模型的表现超出了偶然性,但我的直觉是,由于我的数据长度在 80-400+ 之间变化,因此零填充会导致问题。因此,如果我像以前一样填充到 400 宽度,许多较短的样本都被大量填充。正在尝试根据排序数据和 minibatch 的最大值进行填充,以查看是否可以提高准确性。
    • 也许您可以使用超出样本中可能遇到的任何范围的填充值来代替零
    猜你喜欢
    • 2017-12-22
    • 2018-06-27
    • 2016-02-26
    • 2018-11-11
    • 2020-04-26
    • 2018-06-11
    • 2023-03-29
    • 2018-12-24
    相关资源
    最近更新 更多