tensorflow中的自定义层,以输出其输入的最大运行值
我试图在tensorflow中创建一个自定义层,以输出其输入的最大值。该层具有内存变量和比较功能。我写了以下内容tensorflow中的自定义层,以输出其输入的最大运行值,tensorflow,keras,Tensorflow,Keras,我试图在tensorflow中创建一个自定义层,以输出其输入的最大值。该层具有内存变量和比较功能。我写了以下内容 class ComputeMax(tf.keras.layers.Layer): def __init__(self): super(ComputeMax, self).__init__() def build(self, input_shape): self.maxval = tf.Variable(initial_value=tf.ze
class ComputeMax(tf.keras.layers.Layer):
def __init__(self):
super(ComputeMax, self).__init__()
def build(self, input_shape):
self.maxval = tf.Variable(initial_value=tf.zeros((input_shape)),
trainable=False)
def call(self, inputs):
self.maxval.assign(tf.maximum(inputs, self.maxval))
return self.maxval
my_sum = ComputeMax()
x = tf.ones((1,2))
y = my_sum(x)
print(y.numpy()) # [1, 1]
y = my_sum(x)
print(y.numpy()) # [1, 1]
它的工作原理如上所述。当我在测试模型中尝试时:
model = Sequential()
model.add(tf.keras.Input(shape=(2)))
model.add(Dense(1, activation='relu'))
model.add(ComputeMax())
model.compile(optimizer='adam', loss='mse')
我在编译时遇到错误:
ValueError: Cannot convert a partially known TensorShape to a Tensor: (None, 1)
我遗漏了什么?实际上,该层需要知道上一层的输入神经元,这是
input\u shape
中的最后一个值。您正在按原样使用input_shape
,这实际上是批处理形状,导致批处理形状的一层
这个实现可能会有所帮助
class ComputeMax(tf.keras.layers.Layer):
def __init__(self):
super(ComputeMax, self).__init__()
def build(self, input_shape):
self.maxval = tf.Variable(initial_value=tf.zeros((input_shape[-1])),
trainable=False)
def call(self, inputs):
self.maxval.assign(tf.maximum(inputs, self.maxval))
return self.maxval
但它可能不会给你numpy 1d数组的答案。我尝试了你建议的更改,在编译时,在上面的模型中,它给了我一个错误,ValueError:无法分配给变量compute\u max\u 29/变量:0,因为变量形状(1)和值形状(无,1)不兼容。是的,我知道。问题在于
调用方法。但肯定的是,构建方法是正确的,因为您需要指定来自上一层的输入形状。