首页 > 解决方案 > 张量流中的自定义层以输出其输入的运行最大值

问题描述

我正在尝试在 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)

我错过了什么?

标签: tensorflowkeras

解决方案


实际上,该层需要知道上一层的输入神经元,即 中的最后一个值input_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 数组给你答案。


推荐阅读