keras conv1d 层自定义填充

问题描述 投票:0回答:1

我想自定义 conv1d 层的填充值,但是唯一接受的值似乎是“相同”和“有效”,在 PyTorch 中可以指定所需的填充值。 是否有解决方法可以使用 Tensorflow 实现这一目标?

python tensorflow keras keras-layer
1个回答
0
投票

如果我理解正确,您不想更改用于填充的值,而是更改输入张量之前和之后填充的值的数量。为此,您应该使用 ZeroPadding 层之一,它存在于 1D、2D 和 3D 变体中,例如 ZeroPadding1D 层 1。所以这意味着你需要两层而不是一层,第一层进行填充,第二层进行卷积。如果您想更改填充值,则需要使用 Tensorflow tf.pad 函数,您可以将其封装到自定义层中:


class TFPadLayer(keras.layers.Layer):
    """Padding layer. access to tf.pad function
    """

    def __init__(self, paddings, padding_type="REFLECT", name="PadLayer", 
                 constant_value=0.,    
                 **kwargs):
        super().__init__(name=name, **kwargs)
        # convert padding_size into 1D array
        self.paddings = paddings
        self.padding_type = padding_type.upper()
        self.constant_value = constant_value

    def call(self, inputs):

        return tf.pad(inputs,
                          paddings=self.paddings,
                          mode=self.padding_type,
                          constant_values=tf.cast(self.constant_value, inputs.dtype))

print(TFPadLayer([[0,0], [1, 2], [0,0]], padding_type="CONSTANT", constant_value=1.)(tf.zeros((1, 3, 1))))
print(TFPadLayer([[0,0], [1, 2], [0,0]], padding_type="REFLECT")(tf.range(4, dtype=tf.float32)[tf.newaxis, :, tf.newaxis]))

结果

tf.Tensor(
[[[1.]
  [0.]
  [0.]
  [0.]
  [1.]
  [1.]]], shape=(1, 6, 1), dtype=float32)
tf.Tensor(
[[[1.]
  [0.]
  [1.]
  [2.]
  [3.]
  [2.]
  [1.]]], shape=(1, 7, 1), dtype=float32)
© www.soinside.com 2019 - 2024. All rights reserved.