我如何将这个tensoflow代码转换为pytorch?



如何将此tensoflow代码转换为pytorch?

#tensoflow
Conv2D(
self.filter_1, (1, 64), 
activation='elu', 
padding="same",
kernel_constraint=max_norm(2., axis=(0, 1, 2))
)
nn.Sequential(
nn.Conv2D(16, (1, 64),
padding="same",
kernel_constraint=max_norm(2., axis=(0, 1, 2)),
nn.ELU()
)

您需要两件事:

  1. 你需要知道输入通道的大小是多少。在您的示例中,您只给出了输出通道的数量16。Keras在运行时自己计算这个,但是你必须在制作torch nn.Conv2d时指定输入通道。
  2. 你需要自己在conv内核上实现max_norm约束。

考虑到这一点,让我们在nn.Conv2d周围编写一个简单的包装器,它只在每次调用forward时强制对权重的约束:

import torch
from torch import nn
import torch.nn.functional as F
class Conv2D_Norm_Constrained(nn.Conv2d):
def __init__(self, max_norm_val, norm_dim, **kwargs):
super().__init__(**kwargs)
self.max_norm_val = max_norm_val
self.norm_dim = norm_dim
def get_constrained_weights(self, epsilon=1e-8):
norm = self.weight.norm(2, dim=self.norm_dim, keepdim=True)
return self.weight * (torch.clamp(norm, 0, self.max_norm_val) / (norm + epsilon))
def forward(self, input):
return F.conv2d(input, self.get_constrained_weights(), self.bias, self.stride, self.padding, self.dilation, self.groups)

假设你的输入通道是8,我们可以这样写:

nn.Sequential(
Conv2D_Norm_Constrained(in_channels=8, out_channels=16, kernel_size=(1, 64), padding="same", max_norm_val=2.0, norm_dim=(0, 1, 2)),
nn.ELU()
)

相关内容

  • 没有找到相关文章

最新更新