当使用tensorflow.keras.layers中的TimeDistributed应用于自定义层在时间维度进行扩展时,使输入数据在时间维度上的每个数据应用于相同的自定义层(或base_model),如:
model = Sequential()
model.add(TimeDistributed(base_model, input_shape=(15, 244, 244, 3)))
训练时出现如下错误:
File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/layers/wrappers.py", line 210, in compute_output_shape
child_output_shape = self.layer.compute_output_shape(child_input_shape)
File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer.py", line 639, in compute_output_shape
raise NotImplementedError
NotImplementedError
该提示表明,没有重写如下compute_output_shape函数,从而引起NotImplementedError。
def compute_output_shape(self, input_shape):
... ...
return tuple(output_shape)
即从写compute_output_shape()函数,确定其输出形状,实现这个方法是自定义层(或模型)中有需要训练的参数。对于相对简单的自定义操作,可以通过Lambda层进行实现,但该实现方式的局限性只针对我们的自定义层中(或模型)不包含可训练的权重,否则可能出现错误,但是如果该层(或模型)中可训练的参数不进行更新,那个也可用该Lambda层进行实现,其实现方式如下所示:
# 2048 is the output size
model.add(
Lambda(
lambda x: tf.reshape(base_model(tf.reshape(x, [-1, 244, 244,3])),[-1, 15, 2048])
, input_shape=(15, 244, 244, 3))
)
参考资料:
- (39条消息) keras实现自定义层的关键步骤解析_MIss-Y的博客-CSDN博客
- conv neural network - TimeDistributed of a KerasLayer in Tensorflow 2.0 - Stack Overflow
- How to Use the TimeDistributed Layer in Keras (machinelearningmastery.com)
- (39条消息) Keras学习笔记(二)Keras实现自定义层_buchidanhuang的博客-CSDN博客_keras 自定义层
- (39条消息) tensorflow2.x踩坑记录二:加载含Lambda层的模型时,出现name tf is not defined_耐心的小黑的博客-CSDN博客