我想自定义 conv1d 层的填充值,但是唯一接受的值似乎是“相同”和“有效”,在 PyTorch 中可以指定所需的填充值。 是否有解决方法可以使用 Tensorflow 实现这一目标?
如果我理解正确,您不想更改用于填充的值,而是更改输入张量之前和之后填充的值的数量。为此,您应该使用 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)