首页 文章

Tensorflow形状推断静态RNN编译器错误

提问于
浏览
0

我正在研究针对手机摄像头图像优化的OCR软件 .

目前,每个300 x 1000 x 3(RGB)图像被重新格式化为900 x 1000 numpy阵列 . 我有一个更复杂的模型架构的计划,但是现在我只想让基线工作 . 我想通过在我生成的数据上训练静态RNN来开始 .

形式上,我在每个时间步t输入n_t达T个时间步,其中n_t是900矢量而T = 1000(类似于从左到右读取整个图像) . 以下是Tensorflow代码,我在其中创建用于培训的批处理:

sequence_dataset = tf.data.Dataset.from_generator(example_generator, (tf.int32, 
tf.int32))
sequence_dataset = sequence_dataset.batch(experiment_params['batch_size'])
iterator = sequence_dataset.make_initializable_iterator() 
x_batch, y_batch = iterator.get_next()

tf.nn.static_bidirectional_rnn文档声称输入必须是“输入的长度T列表,每个都是形状的张量[batch_size,input_size],或者是这些元素的嵌套元组 . ”因此,我将执行以下步骤,以便将数据转换为正确的格式 .

# Dimensions go from [batch, n , t] -> [t, batch, n]
x_batch = tf.transpose(x_batch, [2, 0, 1])

# Unpack such that x_batch is a length T list with element dims [batch_size, n]
x_batch = tf.unstack(x_batch, experiment_params['example_t'], 0)

在不进一步改变批次的情况下,我进行以下调用:

output, _, _ = tf.nn.static_rnn(lstm_fw_cell, x_batch, dtype=tf.int32)

请注意,我没有明确告诉Tensorflow矩阵的大小(这可能是问题) . 它们都具有相同的维度,但我得到以下错误:

ValueError: Input size (dimension 0 of inputs) must be accessible via shape 
inference, but saw value None.

在我的堆栈中的哪一点,我应该声明输入的尺寸?因为我使用数据集并希望将其批量直接发送到RNN,所以我不确定“占位符 - > feed_dict”路由是否有意义 . 如果这实际上是最有意义的方法,让我知道它看起来像什么(我绝对不知道) . 否则,如果您对此问题有任何其他见解,请与我们联系 . 谢谢!

1 回答

  • 0

    没有静态形状信息的原因是TensorFlow对 example_generator 函数不够了解以确定它产生的数组的形状,因此它假设形状可以完全不同于一个元素到下一个元素 . 约束这个的最好方法是为tf.data.Dataset.from_generator()指定可选的 output_shapes 参数,该参数接受与所产生元素(和 output_types 参数)的结构匹配的嵌套结构形状 .

    在这种情况下,您将传递两个形状的元组,可以部分指定 . 例如,如果 x 元素是 900 x 1000 数组且 y 元素是标量:

    sequence_dataset = tf.data.Dataset.from_generator(
        example_generator, (tf.int32, tf.int32),
        output_shapes=([900, 1000], []))
    

相关问题