尝试在Keras(Tensorflow后端)中实现自定义“切换”图层时遇到问题。该层需要3个输入:前两个输入是图像,第三个是一些数据,可用于确定要使用的前两个输入中的哪一个,然后将该输入传递给下一层不变。
将此图层插入模型中,所有内容都可以毫无问题地编译,但是当我适应模型时,我会收到以下消息:
ValueError:对于渐变,操作具有
None
。请确保您的所有操作都定义了渐变(即可区分)。没有渐变的常见操作:K.argmax,K.round,K.eval。
我已将问题与我的模型中包含此自定义图层分开;如果我离开图层,我可以训练(虽然不使用第二和第三个输入,因为这是它们输入的唯一层。)
以下是代码:
import numpy as np
from keras.engine.topology import Layer
class SwitchLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(SwitchLayer, self).__init__(**kwargs)
def build(self, input_shape):
super(SwitchLayer, self).build(input_shape)
self.trainable = False
def call(self, inputs, mask=None):
img_one = inputs[0]
img_two = inputs[1]
if (np.array(inputs[2]) == np.array([1, 0])).all():
return img_one
return img_two
有趣的是,如果我只是在不执行检查的情况下返回img_one
或img_two
,那么一切正常(但当然,我会失去所需的切换)。