Keras Custom Layer ValueError:一个操作对渐变有“无”

我创建了一个自定义 Keras 层。该模型编译得很好,但在训练时给了我以下错误:


ValueError:一个操作有None梯度。请确保您的所有操作都定义了渐变(即可微分)。没有梯度的常见操作:K.argmax、K.round、K.eval。


我的自定义层中是否有任何实现错误?


class SpatialLayer(Layer):


    def __init__(self, output_dim, **kwargs):

        self.output_dim = output_dim

        super(SpatialLayer, self).__init__(**kwargs)


    def build(self, input_shape):

        self.bias = None

        self.built = True

        self.kernelA = self.add_weight(name='kernelA', shape=(input_shape[1]-2, self.output_dim), initializer='uniform', trainable=True)


    def compute_output_shape(self, input_shape):

        return (input_shape[0], input_shape[1]-2, input_shape[1]-2, self.output_dim)



    def call(self, inputs):

        x_shape = tf.shape(inputs)

        top_values, top_indices = tf.nn.top_k(tf.reshape(inputs, (-1,)), 10, sorted=True,)

        top_indices = tf.stack(((top_indices // x_shape[1]), (top_indices % x_shape[1])), -1)

        top_indices = tf.cast(top_indices, dtype=tf.float32)

        t1 = tf.reshape(top_indices, (1,10,2))

        t2 = tf.reshape(top_indices, (10,1,2))

        result = tf.norm(t1-t2, ord='euclidean', axis=2)

        x = tf.placeholder(tf.float32, shape=[None, 10, 10, 1])

        tensor_zeros = tf.zeros_like(x)

        matrix = tensor_zeros + result

        return K.dot(matrix, self.kernelA)



    model = applications.VGG16(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))

    model.layers.pop()

    new_custom_layers = model.layers[-1].output

    model.layers[-1].trainable = False


    new_custom_layers = Conv2D(filters=1, kernel_size=(3, 3))(new_custom_layers)

    new_custom_layers = SpatialLayer(output_dim=1)(new_custom_layers)

    new_custom_layers = Flatten()(new_custom_layers)

    new_custom_layers = Dense(1024, activation="relu")(new_custom_layers)

    new_custom_layers = Dropout(0.5)(new_custom_layers)

    new_custom_layers = Dense(1024, activation="relu")(new_custom_layers)

任何帮助,将不胜感激。


回首忆惘然
浏览 61回答 1
1回答

FFIVE

您不能通过不可微分的函数进行反向传播。而且你的功能是不可微的。您丢弃了这些值top_values,只保留了整数常量top_indices。在模型中使用这一层的唯一方法是,如果之前的所有内容都不可训练。(或者,如果您找到另一种以可微分方式计算所需内容的方法 - 这意味着:必须涉及输入值的操作)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python