我需要在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
我使用sess.as_default()ValueError: Cannot evaluate tensor using eval(): No default session is registered. Use
得到or pass an explicit session to eval(session=sess)
(可以理解,因为我没有提供feed_dict)
如何在batch_size
内访问model_fn()
的值,同时可以在预测期间更改它?
答案 0 :(得分:2)
我不知道Tensor.get_shape()
和tf.shape(Tensor)
之间的区别。后者有效:
eps = tf.random_normal(tf.shape(inp), 0, 1, name="eps")))
正如Tensorflow 0.8常见问题解答中提到的那样:
如何构建适用于可变批量大小的图表?
构建适用于变量批处理的图形通常很有用 例如,使得相同的代码可以用于(小)批次 培训和单实例推理。结果图可以是 保存为协议缓冲区并导入另一个程序。
构建可变大小的图时,最重要的是 记住不要将批量大小编码为Python常量,但是 而是使用符号Tensor来表示它。以下提示 可能有用:
使用batch_size = tf.shape(输入)[0]提取批量维度 从Tensor调用输入,并将其存储在Tensor中 的batch_size。
使用tf.reduce_mean()代替tf.reduce_sum(...)/ batch_size。
如果使用占位符输入输入,则可以指定变量 通过使用tf.placeholder创建占位符(...,批处理维度 shape = [None,...])。形状的None元素对应于a 可变大小的维度。