Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tensorflow中的自定义层,以输出其输入的最大运行值_Tensorflow_Keras - Fatal编程技术网

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

我试图在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.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)不兼容。是的,我知道。问题在于
调用
方法。但肯定的是,构建方法是正确的,因为您需要指定来自上一层的输入形状。