class ConvTranspose2d(nn.ConvTranspose2d):
def __init__(self, in_channels, out_channels, kernel_size, stride=1,
padding=0, output_padding=1, groups=1, bias=True, dilation=1):
super(ConvTranspose2d, self).__init__(in_channels, out_channels, kernel_size, stride,
padding, output_padding, groups, bias, dilation)
def forward(self, x):
weight = self.weight
weight_mean = weight.mean(dim=1, keepdim=True).mean(dim=2,
keepdim=True).mean(dim=3, keepdim=True)
weight = weight - weight_mean
std = weight.view(weight.size(0), -1).std(dim=1).view(-1, 1, 1, 1) + 1e-5
weight = weight / std.expand_as(weight)
return F.conv_transpose2d(x, weight, self.bias, self.stride,
self.padding, self.output_padding, self.groups, self.dilation)
Y2xhc3MgQ29udlRyYW5zcG9zZTJkKG5uLkNvbnZUcmFuc3Bvc2UyZCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluX2NoYW5uZWxzLCBvdXRfY2hhbm5lbHMsIGtlcm5lbF9zaXplLCBzdHJpZGU9MSwKICAgICAgICAgICAgICAgICBwYWRkaW5nPTAsIG91dHB1dF9wYWRkaW5nPTEsIGdyb3Vwcz0xLCBiaWFzPVRydWUsIGRpbGF0aW9uPTEpOgogICAgICAgIHN1cGVyKENvbnZUcmFuc3Bvc2UyZCwgc2VsZikuX19pbml0X18oaW5fY2hhbm5lbHMsIG91dF9jaGFubmVscywga2VybmVsX3NpemUsIHN0cmlkZSwKICAgICAgICAgICAgICAgICBwYWRkaW5nLCBvdXRwdXRfcGFkZGluZywgZ3JvdXBzLCBiaWFzLCBkaWxhdGlvbikKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4KToKICAgICAgICB3ZWlnaHQgPSBzZWxmLndlaWdodAogICAgICAgIHdlaWdodF9tZWFuID0gd2VpZ2h0Lm1lYW4oZGltPTEsIGtlZXBkaW09VHJ1ZSkubWVhbihkaW09MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBkaW09VHJ1ZSkubWVhbihkaW09Mywga2VlcGRpbT1UcnVlKQogICAgICAgIHdlaWdodCA9IHdlaWdodCAtIHdlaWdodF9tZWFuCiAgICAgICAgc3RkID0gd2VpZ2h0LnZpZXcod2VpZ2h0LnNpemUoMCksIC0xKS5zdGQoZGltPTEpLnZpZXcoLTEsIDEsIDEsIDEpICsgMWUtNQogICAgICAgIHdlaWdodCA9IHdlaWdodCAvIHN0ZC5leHBhbmRfYXMod2VpZ2h0KQogICAgICAgIHJldHVybiBGLmNvbnZfdHJhbnNwb3NlMmQoeCwgd2VpZ2h0LCBzZWxmLmJpYXMsIHNlbGYuc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZGRpbmcsIHNlbGYub3V0cHV0X3BhZGRpbmcsIHNlbGYuZ3JvdXBzLCBzZWxmLmRpbGF0aW9uKQ==