我们正在尝试使用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)
感谢任何帮助。
答案 0 :(得分:1)
Google最近发布了a tutorial on getting Mask R-CNN going on their TPUs。为此,他们正在Google TPU github存储库(位于models/experimental/mask_rcnn下)的Mask RCNN实验模型中。浏览code时,似乎他们用固定的输入大小定义了模型,以解决您遇到的问题。
有关更多说明,请参见下文
正如@ aman2930指出的那样,输入张量的形状不是静态的。这是行不通的,因为Tensorflow compiles models with XLA to use a TPU和XLA必须在编译时定义所有张量形状。在上面的链接中,网站专门指出了这一点:
静态形状
在常规使用期间,TensorFlow会尝试在图形构建期间确定每个tf.Tensor的形状。中 执行任何未知的形状尺寸是动态确定的,请参见 张量形状以获取更多详细信息。
要在Cloud TPU上运行,请使用XLA编译TensorFlow模型。 XLA 使用类似的系统在编译时确定形状。 XLA 要求在编译时静态定义所有张量尺寸 时间。所有形状都必须求一个常数,而不是依赖于 外部数据或有状态操作(例如变量或随机变量) 数字生成器。
在文档的下侧,他们提到输入功能在CPU上运行,因此不受静态XLA大小的限制。他们指出问题是批次大小,而不是图像大小:
静态形状和批次大小
由您生成的输入管道 input_fn在CPU上运行。因此它基本上不受严格的静态限制 XLA / TPU环境施加的形状要求。唯一的那个 要求是从您的输入管道馈送的成批数据 根据标准确定,TPU的形状是静态的 TensorFlow形状推断算法。中间张量可自由 具有动态形状。如果形状推断失败,但形状为 已知可以使用tf.set_shape()施加正确的形状。
因此,您可以通过将模型重新设置为具有固定的批次大小或按照他们的建议使用 tf.contrib.data.batch_and_drop_remainder来解决此问题。
答案 1 :(得分:0)
请您共享输入数据功能。很难说出确切的问题,但是代表输入样本的张量的形状似乎不是静态的。