- 投稿日:2020-02-16T17:42:27+09:00
Tensorflowでpytorchのreflectionpaddingを実現する
詰まったので備忘録です。
まだ動かしていないため、もし間違いなどがあれば教えてくださると嬉しいです。pytorchにおいて、ReflectionPadding2Dは以下のような挙動をします。
詳しいことについては公式ドキュメントを見るとわかると思います。>>> m = nn.ReflectionPad2d(2) >>> input = torch.arange(9, dtype=torch.float).reshape(1, 1, 3, 3) >>> input tensor([[[[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]]]]) >>> m(input) tensor([[[[8., 7., 6., 7., 8., 7., 6.], [5., 4., 3., 4., 5., 4., 3.], [2., 1., 0., 1., 2., 1., 0.], [5., 4., 3., 4., 5., 4., 3.], [8., 7., 6., 7., 8., 7., 6.], [5., 4., 3., 4., 5., 4., 3.], [2., 1., 0., 1., 2., 1., 0.]]]]) >>> # using different paddings for different sides >>> m = nn.ReflectionPad2d((1, 1, 2, 0)) >>> m(input) tensor([[[[7., 6., 7., 8., 7.], [4., 3., 4., 5., 4.], [1., 0., 1., 2., 1.], [4., 3., 4., 5., 4.], [7., 6., 7., 8., 7.]]]])pytorch 公式ドキュメント https://pytorch.org/docs/stable/nn.html
これをtensorflowで実現しようとすると、tensorflowのpadを使うこととなります。
(公式ドキュメントに書いてあるんですけどね・・・)
自分のググりかたじゃなかなか出なかったので記事にしました。tf.pad( tensor, paddings, mode='REFLECT', constant_values=0, name=None )例としては以下のようになります。
t = tf.constant([[1, 2, 3], [4, 5, 6]]) paddings = tf.constant([[1, 1,], [2, 2]]) tf.pad(t, paddings, "REFLECT") # [[6, 5, 4, 5, 6, 5, 4], # [3, 2, 1, 2, 3, 2, 1], # [6, 5, 4, 5, 6, 5, 4], # [3, 2, 1, 2, 3, 2, 1]]以上2例公式ドキュメントより https://www.tensorflow.org/api_docs/python/tf/pad