【问题标题】:Use placeholder as shape of pooling in tensorflow在张量流中使用占位符作为池的形状
【发布时间】:2017-11-18 14:42:15
【问题描述】:

我正在使用 tensorflow 中的神经网络,我有一个名为 CNN_model 的函数,该函数将三个占位符作为输入:

X = tf.placeholder(tf.float32, [1, None, 13])
Y = tf.placeholder(tf.int32, [None])

pool_shape = tf.placeholder(tf.int32, [1])

我使用以下值运行会话:

feed_dict={X: x, Y: y, MFCCS: x.shape[0]}

在会话中,我想做一个最大池化层,其形状由占位符定义,如下所示:

pool_window_size = [pool_shape, pool_shape]

pool = tf.layers.max_pooling2d(
        inputs = conv,
        pool_size = pool_window_size,
        strides = pool_window_size,
        name = "pool"
)

但我得到了错误:

TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是“张量”

我的假设是因为此时“pool_shape”是一个张量而不仅仅是一个整数,有没有办法获得当时张量中的任何值?

【问题讨论】:

  • 如果我可以问,你为什么要改变池内核的大小?你能想出一种不做就完成任务的方法吗?
  • 我想使用动态池化,因为我有可变大小的输入示例,所以我希望池化层根据示例的形状生成固定大小的输出。我一直在使用零填充使所有示例都具有相同的形状,但我担心这会影响准确性。

标签: python tensorflow


【解决方案1】:

您可以尝试使用您当前的会话sess 并在您的feed_dict 中添加pool_shape 所需的相关输入

dimension = pool_shape.eval(sess, feed_dict = {inputs})[0]
pool_window_size = [dimension , dimension]

希望这会有所帮助!

编辑 我假设这是您当前的代码:

pool_shape = tf.placeholder(tf.int32, [1])
pool_window_size = [pool_shape, pool_shape]

#...

for i in range(iterations):
    sess.run(Optimizer, feed_dict = {X:x, Y:y, pool_shape:value} 
    #value is the length/width you want to set for the pool_window_size

相反,我认为这可能有效。

pool_window_size = [pool_shape, pool_shape]

#...

for i in range(iterations):
    pool_shape = value
    sess.run(Optimizer, feed_dict = {X:x, Y:y} 

我不太确定maxpooling层会不会更新pool_size,你可以试试告诉我。

【讨论】:

  • 嗨乔希,感谢您的回答。不幸的是,我仍然没有任何运气在训练期间从张量中获得价值。当我想获得我已经在运行会话的值时:
  • 嗨乔希,感谢您的回答。不幸的是,我仍然没有任何运气在训练期间从张量中获得价值。当我想获得值时,我已经在运行一个会话:sess.run(train_op, feed_dict={X: x, Y: y, MFCCS: x.shape[1]}) train_op 然后调用我的函数,我想在其中获取我作为x.shape[1] 传递的值,它具有变量名pool_shape,但试图运行另一个使用print(input_mfcc_count.eval(feed_dict = {input_mfcc_count: input_mfcc_count})) 获取其价值的会话说我不能将张量“input_mfcc_count”传递给 feed_dict。
  • 如果假设你在代码中写了print(input_mfcc_count.eval(feed_dict = {input_mfcc_count: input_mfcc_count})),那么这可能是你理解的问题。为了获得pool_window_size 的长度/宽度,它从变量pool_shape 中确定其值。您可能必须观察获得pool_window_size 是否也依赖于其他值,通过观察其与层次结构中更高的变量的连接,直到占位符输入级别。在这种情况下,您的 feed_dict 应该只是 feed_dict= {pool_shape:value} 其中 value 是长度/宽度
  • 如果每个训练批次具有相同的图像尺寸,您还可以使用全局变量并将其分配给图像大小,而不是通过会话解析它们。
  • 谢谢@joshua,但我还是遇到了麻烦。当我试图获得价值时,我已经在一个会话中。每次运行会话时,我都会向会话传递一个整数(通过占位符和 feed_dict),然后我想在会话调用的函数中以整数形式访问该值。所以我不知道在你的例子中为value 放什么,我的函数只接收张量input_mfcc_count,此时我想找到它的值。抱歉,如果我解释得不好,我是 TensorFlow 新手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2018-06-06
  • 2018-12-13
相关资源
最近更新 更多