3

我需要在我的内部创建一个随机变量model_fn(),具有形状[batch_size, 20]

我不想batch_size作为参数传递,因为那样我就不能使用不同的批量大小进行预测。

删除与此问题无关的部分,我的 model_fn() 是:

def model(inp, out):
    eps = tf.random_normal([batch_size, 20], 0, 1, name="eps"))) # batch_size is the 
    # value I do not want to hardcode

    # dummy example
    predictions = tf.add(inp, eps)
    return predictions, 1

如果我替换[batch_size, 20]inp.get_shape(),我得到

ValueError: Cannot convert a partially known TensorShape to a Tensor: (?, 20)

运行时myclf.setup_training()

如果我尝试

def model(inp, out):
    batch_size = tf.placeholder("float", [])
    eps = tf.random_normal([batch_size.eval(), 20], 0, 1, name="eps")))

    # dummy example
    predictions = tf.add(inp, eps)
    return predictions, 1

我得到ValueError: Cannot evaluate tensor using eval(): No default session is registered. Use了 sess.as_default() or pass an explicit session to eval(session=sess)(可以理解,因为我没有提供 feed_dict)

如何访问batch_sizeinside的值model_fn(),同时在预测期间保持能够更改它?

4

1 回答 1

2

Tensor.get_shape()我不知道和之间的区别tf.shape(Tensor)。后者有效:

eps = tf.random_normal(tf.shape(inp), 0, 1, name="eps")))

正如 Tensorflow 0.8 FAQ 中提到的:

如何构建适用于可变批量大小的图表?

构建一个适用于可变批量大小的图通常很有用,例如,相同的代码可以用于(小)批量训练和单实例推理。生成的图形可以保存为协议缓冲区并导入另一个程序。

在构建可变大小图时,要记住的最重要的事情是不要将批量大小编码为 Python 常量,而是使用符号张量来表示它。以下提示可能有用:

使用 batch_size = tf.shape(input)[0] 从名为 input 的 Tensor 中提取批量维度,并将其存储在名为 batch_size 的 Tensor 中。

使用 tf.reduce_mean() 代替 tf.reduce_sum(...) / batch_size。

如果您使用占位符来提供输入,您可以通过使用 tf.placeholder(..., shape=[None, ...]) 创建占位符来指定可变批次尺寸。形状的 None 元素对应于可变大小的维度。

于 2016-04-29T12:37:16.017 回答