“class ResConv1DLayer(object):
def __init__(self, rng, input, n_in=0, n_out=0, halfWinSize=0,
dilation=1, activation=T.nnet.relu, mask=None):
self.input = input
self.n_in = n_in
self.n_out = n_out
self.halfWinSize = halfWinSize
windowSize = 2*halfWinSize + 1
self.filter_size = windowSize
self.dilation = (1, dilation)
in4conv2D = input.dimshuffle(0, 1, 'x', 2)
w_shp = (n_out, n_in, 1, windowSize)
if activation == T.nnet.relu:
W_values = np.asarray(rng.normal(scale=np.sqrt(2. / (n_in*windowSize + n_out)), size = w_shp), dtype=theano.config.floatX )
else:
W_values = np.asarray(
rng.uniform(low = - np.sqrt(6. / (n_in*windowSize + n_out)), high = np.sqrt(6. / (n_in*windowSize + n_out)), size = w_shp),
dtype=theano.config.floatX
)
if activation == T.nnet.sigmoid:
W_values *= 4
self.W = theano.shared(value=W_values, name='ResConv1d_W', borrow=True)
b_shp = (n_out,)
self.b = theano.shared(np.asarray( rng.uniform(low=-.0, high=.0, size=b_shp), dtype=input.dtype), name ='ResConv1d_b', borrow=True)
if dilation > 1:
conv_out = T.nnet.conv2d(in4conv2D, self.W, filter_shape=w_shp, border_mode='half', filter_dilation=(1, dilation) )
else:
conv_out = T.nnet.conv2d(in4conv2D, self.W, filter_shape=w_shp, border_mode='half')
if activation is not None:
conv_out_bias = activation(conv_out + self.b.dimshuffle('x', 0, 'x', 'x'))
else:
conv_out_bias = (conv_out + self.b.dimshuffle('x', 0, 'x', 'x'))
out2 = conv_out_bias.dimshuffle(0, 1, 3, 2)[:, :, :, 0]
if mask is not None:
out2_sub = out2[:, :, :mask.shape[1] ]
mask_new = mask.dimshuffle(0, 'x', 1)
self.output = T.set_subtensor(out2_sub, T.mul(out2_sub, mask_new) )
else:
self.output = out2
self.params=[self.W, self.b]
self.paramL1 = abs(self.W).sum() + abs(self.b).sum()
self.paramL2 = (self.W**2).sum() + (self.b**2).sum()”这段代码对应的“class ResConv1DLayer(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=1, dilation=1, activation=F.relu, batch_norm=True):
super().__init__()
self.activation = activation
self.conv = nn.Conv1d(
in_channels=in_channels,
out_channels=out_channels,
kernel_size=kernel_size,
stride=stride,
padding=(kernel_size - 1) // 2 * dilation, # 适应 dilation
dilation=dilation,
bias=False
)
self.shortcut = nn.Conv1d(
in_channels=in_channels,
out_channels=out_channels,
kernel_size=1,
stride=stride,
bias=False
) if (in_channels != out_channels or stride != 1) else nn.Identity()
self.bn = nn.BatchNorm1d(out_channels) if batch_norm else None
nn.init.kaiming_normal_(self.conv.weight, mode='fan_out', nonlinearity='relu')
if isinstance(self.shortcut, nn.Conv1d):
nn.init.kaiming_normal_(self.shortcut.weight, mode='fan_out', nonlinearity='relu')
def forward(self, x):
residual = self.shortcut(x)
out = self.conv(x)
if self.bn is not None:
out = self.bn(out)
if self.activation is not None:
out = self.activation(out)
return out + residual”这段代码,有没有地方没有对应上还是怎么说,感觉怎么样