『开发技巧』Keras自定义对象(层、评价函数与损失)
1.自定义层
对于简单、无状态的自定义操作,你也许可以通过 layers.core.Lambda
层来实现。但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层。
这是一个 Keras2.0 中,Keras 层的骨架(如果你用的是旧的版本,请更新到新版)。你只需要实现三个方法即可:
build(input_shape)
: 这是你定义权重的地方。这个方法必须设self.built = True
,可以通过调用super([Layer], self).build()
完成。call(x)
: 这里是编写层的功能逻辑的地方。你只需要关注传入call
的第一个参数:输入张量,除非你希望你的层支持masking。compute_output_shape(input_shape)
: 如果你的层更改了输入张量的形状,你应该在这里定义形状变化的逻辑,这让Keras能够自动推断各层的形状。
还可以定义具有多个输入张量和多个输出张量的 Keras 层。 为此,你应该假设方法 build(input_shape)
,call(x)
和 compute_output_shape(input_shape)
的输入输出都是列表。 这里是一个例子,与上面那个相似:
已有的 Keras 层就是实现任何层的很好例子。不要犹豫阅读源码!
2.自定义评价函数
自定义评价函数应该在编译的时候(compile)传递进去。该函数需要以 (y_true, y_pred)
作为输入参数,并返回一个张量作为输出结果。
3.自定义损失函数
自定义损失函数也应该在编译的时候(compile)传递进去。该函数需要以 (y_true, y_pred)
作为输入参数,并返回一个张量作为输出结果。
4.处理已保存模型中的自定义层(或其他自定义对象)
如果要加载的模型包含自定义层或其他自定义类或函数,则可以通过 custom_objects
参数将它们传递给加载机制:
或者,你可以使用 自定义对象作用域: