将pytorch 2d填充转换为张量流keras

时间:2020-05-24 23:35:46

标签: python tensorflow keras pytorch

这等效于什么:

nn.ReflectionPad2d(1)
在TensorFlow 2中是

吗?上一行来自PyTorch。

在TensorFlow 2 Keras中,我目前正在考虑将tf.pad()用作TF版本,但PyTorch似乎能够使用该单个整数1处理尺寸变化。例如,形状的输入[批处理大小,1、1、100],nn.ReflectionPad2D可以很好地处理此问题,但是在TensorFlow中,如果尝试使用,则会出现错误

tf.pad(t, tf.constant([0,0], [1,1], [1,1], [0,0]]), 'REFLECT')

关于如何在TensorFlow 2 keras中复制nn.ReflectinPad2d的任何建议?谢谢!

1 个答案:

答案 0 :(得分:0)

当我在 TF2 上训练 CycleGan 时,我为自己创建了这个自定义层:

class ReflectionPad2D(tf.keras.layers.Layer):
  def __init__(self, paddings=(1,1,1,1)):
    super(ReflectionPad2D, self).__init__()
    self.paddings = paddings

  def call(self, input):
    l, r, t, b = self.paddings

    return tf.pad(input, paddings=[[0,0], [t,b], [l,r], [0,0]], mode='REFLECT')

您可以通过将其放入模型/序列中来按原样使用它,例如:

model = Sequential([
    ReflectionPad2D((3, 3, 3, 3)),
    Conv2D(64, kernel_size=7, strides=1, padding='valid', use_bias=False),
    BatchNormalization()
])

model.build(input_shape=(8, 128, 128, 3))
model.summary()

示例输出:

Model: "sequential_13"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
reflection_pad2d_198 (Reflec (8, 134, 134, 3)          0         
_________________________________________________________________
conv2d_474 (Conv2D)          (8, 128, 128, 64)         9408      
_________________________________________________________________
batch_normalization_41 (Batc (8, 128, 128, 64)         256       
=================================================================
Total params: 9,664
Trainable params: 9,536
Non-trainable params: 128
_________________________________________________________________