3

我们正在尝试使用 Google Colab TPU 构建图像分割深度学习模型。我们的模型是 Mask R-CNN。

TPU_WORKER = 'grpc://' + os.environ['COLAB_TPU_ADDR']

import tensorflow as tf
tpu_model = tf.contrib.tpu.keras_to_tpu_model(
model.keras_model,
strategy=tf.contrib.tpu.TPUDistributionStrategy(
tf.contrib.cluster_resolver.TPUClusterResolver(TPU_WORKER)))

但是,我在将我们的 Mask R-CNN 模型转换为 TPU 模型时遇到了问题,如下所示。

ValueError: 
Layer <keras.engine.topology.InputLayer object at 0x7f58574f1940> has a 
variable shape in a non-batch dimension.  TPU models must
have constant shapes for all operations.

You may have to specify `input_length` for RNN/TimeDistributed layers.

Layer: <keras.engine.topology.InputLayer object at 0x7f58574f1940>
Input shape: (None, None, None, 3)
Output shape: (None, None, None, 3)

感谢任何帮助。

4

2 回答 2

3

谷歌最近发布了一篇关于让 Mask R-CNN 在他们的 TPU 上运行的教程。为此,他们在 Google 的 TPU github 存储库(在models/experimental/mask_rcnn下)上使用了 Mask RCNN 的实验模型。查看代码,看起来他们定义了具有固定输入大小的模型来克服您所看到的问题。

有关更多说明,请参见下文:

正如@aman2930 指出的那样,输入张量的形状不是静态的。这不起作用,因为 Tensorflow使用 XLA 编译模型以使用 TPU,并且 XLA 必须在编译时定义所有张量形状。在上面的链接中,该网站特别指出了这一点:

静态形状

在常规使用期间,TensorFlow 尝试在图构建期间确定每个 tf.Tensor 的形状。在执行期间,任何未知的形状尺寸都是动态确定的,有关更多详细信息,请参阅张量形状。

要在 Cloud TPU 上运行,TensorFlow 模型是使用 XLA 编译的。XLA 使用类似的系统在编译时确定形状。XLA 要求在编译时静态定义所有张量维度。所有形状都必须评估为常数,并且不依赖于外部数据或变量或随机数生成器等有状态操作。

在那一边,在文档的后面,他们提到输入函数在 CPU 上运行,因此不受静态 XLA 大小的限制。他们指出批量大小是问题,而不是图像大小:

静态形状和批量大小

input_fn 生成的输入管道在 CPU 上运行。因此,它基本上不受 XLA/TPU 环境所施加的严格的静态形状要求。一个要求是从输入管道馈送到 TPU 的数据批次具有静态形状,由标准 TensorFlow 形状推理算法确定。中间张量可以自由地具有动态形状。如果形状推断失败,但形状已知,则可以使用 tf.set_shape() 施加正确的形状。

因此,您可以通过重新制定模型以具有固定的批量大小或按照他们的建议使用 tf.contrib.data.batch_and_drop_remainder来解决此问题。

于 2019-01-14T20:53:30.680 回答
0

您能否分享输入数据功能。很难说出确切的问题,但表示输入样本的张量的形状似乎不是静态的。

于 2018-10-21T16:27:00.590 回答