在skflow中的model_fn中使用batch_size

时间:2016-04-27 09:17:42

标签: python tensorflow skflow

我需要在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()的值,同时可以在预测期间更改它?

1 个答案:

答案 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   可变大小的维度。