【发布时间】:2019-12-26 22:09:28
【问题描述】:
我需要一个神经网络,它将为相同输入的任何排列提供相同的输出。正在尝试搜索解决方案(“排列不变性”),找到了一些层,但未能使它们工作。
我选择了不同的方法:我想创建一个层,在模型中添加我的第一个,这将随机打乱输入(每行独立) - 请按照这种方法,我知道它可以在模型之外完成,但我希望它作为模型的一部分。我试过了:
class ShuffleLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super(ShuffleLayer, self).__init__(**kwargs)
def call(self, inputs):
batchSize = tf.shape(inputs)[0]
cols = tf.shape(inputs)[-1]
order0 = tf.tile(tf.expand_dims(tf.range(0, batchSize), -1), [1, cols])
order1 = tf.argsort(tf.random.uniform(shape=(batchSize, cols)))
indices = tf.stack([tf.reshape(order0, [-1]), tf.reshape(order1, [-1])], axis=-1)
outputs = tf.reshape(tf.gather_nd(inputs, indices), [batchSize, cols])
return outputs
我收到以下错误:
ValueError: 变量有
None用于渐变。请确保您的所有操作都定义了渐变(即可微分)。没有的常见操作 梯度:K.argmax、K.round、K.eval。
如何避免??我尝试使用tf.stop_gradient,但没有成功。
【问题讨论】:
-
我添加了一个答案,但是为了解决这个错误,你需要展示你的整个模型以及它包含的所有自定义操作,包括损失函数。不是你的层造成的。
标签: python keras gradient shuffle tensorflow2.0