【问题标题】:TensorFlow feed an integerTensorFlow 输入一个整数
【发布时间】:2016-10-02 21:36:57
【问题描述】:

我正在尝试对可变输入大小进行卷积。为了实现这一点,我使用了 1 的批量大小。但是,其中一个节点是一个最大池节点,它需要输入的形状作为列表 ksize

 pooled = tf.nn.max_pool(
                h,
                ksize=[1, self.input_size - filter_size + 1, 1, 1],
                strides=[1, 1, 1, 1],
                padding='VALID',
                name="pool")

现在,显然 input_size 可以从输入(这是一个占位符)中推断出来:

self.input_x = tf.placeholder(tf.int32, [None, None], name="input_x")

但我不能使用self.input_x.get_shape()[0],因为形状是动态的。所以我打算在每一步将输入大小作为 feed_dict 传递。但是,我不知道如何在 feed_dict 中传递一个整数。每个占位符都是张量,所以如果我这样做:

self.input_size = tf.placeholder(tf.int32, shape=(), name="input_size")

我必须执行 self.input_size.eval() 才能获得 int 值,这给了我一个错误,我需要输入 input_size。我猜这是因为 eval 在训练步骤发生之前触发了计算,此时 input_size 没有值。

有没有一种方法可以动态获取计算输入形状的操作,或者有一种方法可以将整数传递给训练步骤?

【问题讨论】:

    标签: python neural-network tensorflow convolution conv-neural-network


    【解决方案1】:

    我不确定这是不是最好的方法,但您可以在列表中动态获取 self.input_x 的形状:

    input_shape = tf.unpack(tf.shape(self.input_x))
    

    tf.shape(self.input_x) 为您提供一个表示 self.input_x 形状的张量,f.unpack 将其转换为张量列表。

    现在您可以使用以下命令创建最大池节点:

    pooled = tf.nn.max_pool(
                    h,
                    ksize=tf.pack([1, input_size[1] - filter_size + 1, 1, 1]),
                    strides=[1, 1, 1, 1],
                    padding='VALID',
                    name="pool")
    

    (如果您需要 input_x 的第二维)

    【讨论】:

    • 它仍然返回张量列表。我需要第二维的实际值(整数),并且在运行时。这就是为什么我考虑将其作为参数“馈送”,但是,看起来我只能馈送张量?
    • 你能用“input_size = tf.placeholder(tf.int32)”输入一个整数吗?它适用于我,但我在 TF r0.8 上,我没有尝试使用最新版本。对于张量列表的问题,我修改了我的答案。我不明白为什么,但是 tf.pack ksize 数组应该可以工作...
    • 这是 TF 中的一个问题。无论您做什么 - ksize 都会在构建时进行评估,因此这是无法实现的。
    • 好吧,抱歉。我通常为 tf.reshape 或 tf.image.resize_images 函数动态获取张量的形状。我希望它适用于 tf.nn.max_pool...
    • 请注意:tf.pack 在 Tensorflow 1.0 中被重命名为 tf.stack
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多