python - TPU 上自定义 Keras 层的 XLA 编译错误
问题描述
我已经编写了自己的自定义层,但在训练它时遇到了问题。训练开始时,我收到以下错误:
编译失败:XLA 无法推断跨步切片的编译时间常数输出形状:[?,512,512,3],输出形状必须是编译时间常数
我的自定义图层看起来像这样(将在后期脚本中提供完整的图层):
class MyCustomLayer(Layer):
def __init__(self, name=None):
super(MyCustomLayer, self).__init__(name=name)
@tf.function
def call(self, inputs):
"""
inputs has two tensors : [images, image_dependent_params]
"""
images, image_dependent_params = inputs
outputs = tf.zeros_like(images)
for i in tf.range(tf.shape(images)[0]):
# compute outputs[i] based on images[i] and image_dependent_params[i]
# set outputs[i] by doing zero padded concatenation
return outputs
该循环是针对 TPU 不支持的crop_and_resize操作的解决方法。
PS:如果你有兴趣,这里是它的完整代码:
class AttentionLocalization(Layer):
def __init__(self, name=None):
super(AttentionLocalization, self).__init__(name=name)
@tf.function
def call(self, inputs):
"""
inputs has two tensors : [images, rois]
"""
images, rois = inputs
tx, ty, tl = rois[:,0], rois[:,1], rois[:,2]
tl = tf.clip_by_value(tl, 1/3, 1)
tx = tf.clip_by_value(tx, 0, 1 - tl)
ty = tf.clip_by_value(ty, 0, 1 - tl)
size = tf.cast(tf.shape(images)[1], tf.float32)
tx, ty, tl = rois[:,0], rois[:,1], rois[:,2]
tl = tf.clip_by_value(tl, 1/3, 1)
tx = tf.clip_by_value(tx, 0, 1 - tl)
ty = tf.clip_by_value(ty, 0, 1 - tl)
tl = tf.cast(tl * size, tf.int32)
tx = tf.cast(tx * size, tf.int32)
ty = tf.cast(ty * size, tf.int32)
outputs = tf.zeros_like(images)
batch_size = tf.shape(images)[0]
for i in tf.range(batch_size):
resized = tf.image.resize(images[i][tx[i]:tx[i]+tl[i], ty[i]:ty[i]+tl[i], :], tf.shape(images)[1:3])
padding = tf.zeros([batch_size - 1 - i, tf.shape(images)[1], tf.shape(images)[2], tf.shape(images)[3]])
outputs = tf.concat([outputs[:i], [resized], padding], axis=0)
return outputs
编辑
我意识到我的自定义层确实可以在 CPU 上工作,但不能在我尝试训练模型的 TPU 上工作。
解决方案
推荐阅读
- java - 在 java 中上传和读取 text/csv 文件
- openstack - 启动命令“openstack orchestration service list”时,Openstack 上的 Heat 服务不起作用
- c# - WebAPI中的加密JsonConvertor
- obd-ii - 如何解码现代 Ioniq EV 的 OBD-2 数据
- c++ - 在 Eclipse 中设置 boost 库路径时出错
- java - 从原始字符串中删除子字符串
- c# - ExcelDna,重命名现有项目中的输出 XXX-packed.xll
- python - 单击下一页按钮时无法从网站上抓取标题
- r - 按特定值分面,按组着色和组织
- reactjs - 当我尝试将 React 应用程序部署到 GitHub Pages 时,为什么会出现错误?