part3 Encoder
class encoder_block(nn.Module):
''' encoder with CNN '''
def __init__(self, input_channels, hidden_channels, input_kernel_size,
input_stride, input_padding):
super(encoder_block, self).__init__()
self.input_channels = input_channels
self.hidden_channels = hidden_channels
self.input_kernel_size = input_kernel_size
self.input_stride = input_stride
self.input_padding = input_padding
self.conv = weight_norm(nn.Conv2d(self.input_channels,
self.hidden_channels, self.input_kernel_size, self.input_stride,
self.input_padding, bias=True, padding_mode='circular'))
self.act = nn.ReLU()
nn.init.zeros_(self.conv.bias)
def forward(self, x):
return self.act(self.conv(x))
初始化的参数
conv.bias
conv.weight_g
conv.weight_v
包含三个卷积层,用于输入状态变量 u i , ( i = 1 , 2 , . . . , T ) u_i,(i=1,2,...,T) ui,(i=1,2,...,T)T表示时间步数的总和,卷积层的激活函数 R e L U ReLU ReLU。
part4 PhyCRNet
任务:
1、实例化encoder_block和ConvLSTM
encoder_block0=cell()
encoder_block1=cell()
encoder_block2=cell()
ConvLSTM3=cell()
class PhyCRNet(nn.Module):
''' physics-informed convolutional-recurrent neural networks '''
def __init__(self, input_channels, hidden_channels,
input_kernel_size, input_stride, input_padding, dt,
num_layers, upscale_factor, step=1, effective_step=[1]):
super(PhyCRNet, self).__init__()
# input channels of layer includes input_channels and hidden_channels of cells
self.input_channels = [input_channels] + hidden_channels
self.hidden_channels = hidden_channels
self.input_kernel_size = input_kernel_size
self.input_stride = input_stride
self.input_padding = input_padding
self.step = step
self.effective_step = effective_step
self._all_layers = []
self.dt = dt
self.upscale_factor = upscale_factor
# number of layers
self.num_encoder = num_layers[0]
self.num_convlstm = num_layers[1]
# encoder - downsampling
for i in range(self.num_encoder):
name = 'encoder{}'.format(i)
cell = encoder_block(
input_channels = self.input_channels[i],
hidden_channels = self.hidden_channels[i],
input_kernel_size = self.input_kernel_size[i],
input_stride = self.input_stride[i],
input_padding = self.input_padding[i])
setattr(self, name, cell)
self._all_layers.append(cell)
# ConvLSTM
for i in range(self.num_encoder, self.num_encoder + self.num_convlstm):
name = 'convlstm{}'.format(i)
cell = ConvLSTMCell(
input_channels = self.input_channels[i],
hidden_channels = self.hidden_channels[i],
input_kernel_size = self.input_kernel_size[i],
input_stride = self.input_stride[i],
input_padding = self.input_padding[i])
setattr(self, name, cell)
self._all_layers.append(cell)
# output layer
self.output_layer = nn.Conv2d(2, 2, kernel_size = 5, stride = 1,
padding=2, padding_mode='circular')
# pixelshuffle - upscale
self.pixelshuffle = nn.PixelShuffle(self.upscale_factor)
# initialize weights
self.apply(initialize_weights)
nn.init.zeros_(self.output_layer.bias)
def forward(self, initial_state, x):
self.initial_state = initial_state
internal_state = []
outputs = []
second_last_state = []
for step in range(self.step):
xt = x
# encoder
for i in range(self.num_encoder):
name = 'encoder{}'.format(i)