Keras自定义图层ValueError:操作没有"None"用于渐变 [英] Keras Custom Layer ValueError: An operation has `None` for gradient

查看:71
本文介绍了Keras自定义图层ValueError:操作没有"None"用于渐变的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个自定义的Keras图层.该模型编译良好,但是在训练时却出现以下错误:

I have created a custom Keras Layer. The model compiles fine, but gives me the following error while training:

ValueError:操作没有 None 进行渐变.请确定您所有的操作都定义了渐变(即可区分的).不带渐变的常见操作:K.argmax,K.round,埃瓦尔.

ValueError: An operation has None for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

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

Is there any implementation error in my custom layer?

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)

任何帮助将不胜感激.

说明

我的自定义Keras图层的输入是张量(?,12,12,1),它表示给定图像中的特征图.例如:

The input to my custom Keras Layer is a tensor (?, 12,12,1) that represents a feature map from a given image. For example:

[[147.00  20.14 ... 0 34.2  0   ]
 [ 12.00  10.14 ... 0 45.2  0   ]
 ...
 [100.00  60.14 ... 0 34.2  99.1]
 [ 90.00  65.14 ... 0 12.2  00.1]]

我想从该张量中获取前10个值的坐标,例如:(0,0),(10,0)....,(10,11),即10个坐标.

I want to get the coordinates of the top 10 values from this tensor, for example: (0,0), (10,0) ...., (10,11), i.e., 10 coordinates.

最后,我想计算坐标之间的距离矩阵.我正在使用欧几里得距离.例如:

Finally, I want to calculate a distance matrix between the coordinates. I am using euclidean distance. For example:

       coord1 coord2 ... coord9 cood10
coord1   0     12.3       13.1   2.3
coord2  1.3      0        3.2    9.1
  .
  .
  .
coord9  4.2     5.2        0     4.2
coor10  1.1     5.6       9.1     0

此矩阵(?,10,10,1)将作为图层输出.

This matrix (?, 10,10,1) will be the layer output.

推荐答案

您无法通过不可微分的函数向后传播.并且您的功能是不可区分的.

You cannot backpropagate through functions that are not differentiable. And your function is not differentiable.

您舍弃了值 top_values ,而只保留了整数常量 top_indices .

You discarded the values top_values and kept only integer constants top_indices.

在模型中使用此层的唯一方法是,如果之前的所有内容都不可训练.(或者,如果您找到另一种以可微分的方式计算您想要的东西的方法,这意味着:必须涉及输入值的操作)

The only way to use this layer in a model is if everything before it is not trainable. (Or if you find another way of calculating what you want in a differentiable way - this means: operations that must involve the input values)

这篇关于Keras自定义图层ValueError:操作没有"None"用于渐变的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆