def __init__(self, in_channels, out_channels, kernel_size, stride=1, dropout=0, residual=True): super().__init__() assert len( kernel_size ) == 2 # 断言:当表达式为真时,程序继续往下执行;当表达式为假时,抛出AssertionError错误,并将参数输出 assert kernel_size[0] % 2 == 1 padding = ((kernel_size[0] - 1) // 2, 0) self.gcn = ConvTemporalGraphical(in_channels, out_channels, kernel_size[1]) # 使用卷积核的第二维即 3 组 self.tcn = nn.Sequential( # 一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行 nn.BatchNorm2d( out_channels ), # 在卷积神经网络的卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定 nn.ReLU(inplace=True), nn.Conv2d( # TCN,用的二维卷积,####这是一个1D卷积,卷积的维度是时间维度,他的卷积核一行多列 out_channels, out_channels, (kernel_size[0], 1), # 卷积核在第一位度大小为kernel_size[0]:卷积核的第一维即 9 帧,第二维度大小为1 (stride, 1), # 步长 padding, # 填充 ), nn.BatchNorm2d(out_channels), nn.Dropout(dropout, inplace=True), ) if not residual: # 每一个st-gcn层都用residual残差模块来改进 self.residual = lambda x: 0 elif (in_channels == out_channels) and (stride == 1): self.residual = lambda x: x else: self.residual = nn.Sequential( nn.Conv2d( in_channels, out_channels, kernel_size=1, # 当通道数要增加时,使用1x1conv来进行通道的翻倍 stride=(stride, 1)), nn.BatchNorm2d(out_channels), ) self.relu = nn.ReLU(inplace=True)
def __init__(self, in_channels, out_channels, kernel_size, stride=1, dropout=0, residual=True, stage=False, dilation=1): super().__init__() assert len(kernel_size) == 2 assert kernel_size[0] % 2 == 1 padding = ((kernel_size[0] - 1) // 2, 0) print('===') print(padding) self.stage = stage self.gcn = ConvTemporalGraphical(in_channels, out_channels, kernel_size[1]) self.tcn = nn.Sequential( nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d( out_channels, out_channels, (kernel_size[0], 1), (stride, 1), padding, dilation=(1, dilation), ), nn.BatchNorm2d(out_channels), nn.Dropout(dropout, inplace=True), ) if not residual: self.residual = lambda x: 0 elif (in_channels == out_channels) and (stride == 1): self.residual = lambda x: x else: self.residual = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=(stride, 1)), nn.BatchNorm2d(out_channels), ) self.relu = nn.ReLU(inplace=True)
def __init__(self, in_channels, out_channels, kernel_size, #维度是时域9*空域邻域数 stride=1, dropout=0, residual=True): super().__init__() assert len(kernel_size) == 2 assert kernel_size[0] % 2 == 1 padding = ((kernel_size[0] - 1) // 2, 0) #空域图卷积 self.gcn = ConvTemporalGraphical(in_channels, out_channels, kernel_size[1]) #[1]是空域邻居数 #时间域上的普通卷积 #接收来自空域图卷积的数据,维度是n,c,t,w,其中n:batch, c:channels, t:时间维度,w:节点 self.tcn = nn.Sequential( nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d( out_channels, out_channels, (kernel_size[0], 1), #[0]是时域长度,这么做是把同一个节点在一个时间范围内的位置卷积,如果第二维不为1,而同样是相邻节点 (stride, 1), padding, ), nn.BatchNorm2d(out_channels), nn.Dropout(dropout, inplace=True), ) if not residual: self.residual = lambda x: 0 elif (in_channels == out_channels) and (stride == 1): self.residual = lambda x: x else: self.residual = nn.Sequential( nn.Conv2d( in_channels, out_channels, kernel_size=1, stride=(stride, 1)), nn.BatchNorm2d(out_channels), ) self.relu = nn.ReLU(inplace=True)
def __init__(self, in_channels, out_channels, kernel_size, device, stride=1, dropout=0.5, residual=True, batch_size=64): super().__init__() print("Dropout={}".format(dropout)) assert len(kernel_size) == 2 assert kernel_size[0] % 2 == 1 padding = ((kernel_size[0] - 1) // 2, 0) self.gcn = ConvTemporalGraphical(in_channels, out_channels, kernel_size[1]) self.lstm_layer = fMRI_LSTM(64, 64, 1, batch_size=batch_size) self.batch_size = batch_size self.tcn = nn.Sequential( nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d( out_channels, out_channels, (kernel_size[0], 1), (stride, 1), padding, ), nn.BatchNorm2d(out_channels), nn.Dropout(dropout, inplace=True), ) self.device = device if not residual: self.residual = lambda x: 0 elif (in_channels == out_channels) and (stride == 1): self.residual = lambda x: x else: self.residual = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=(stride, 1)), nn.BatchNorm2d(out_channels), ) self.relu = nn.ReLU(inplace=True)
def __init__(self, in_channels, out_channels, kernel_size, stride=1, dropout=0.2, residual=True): super().__init__() assert len(kernel_size) == 2 assert kernel_size[0] % 2 == 1 padding = ((kernel_size[0] - 1) // 2, 0) self.gcn = ConvTemporalGraphical(in_channels, out_channels, kernel_size[1]) self.tcn = nn.Sequential( nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d( out_channels, out_channels, (kernel_size[0], 1), (stride, 1), padding, ), #nn.MaxPool2d(kernel_size=(stride, 1)), nn.BatchNorm2d(out_channels), nn.Dropout(dropout, inplace=True), ) if not residual: self.residual = lambda x: 0 elif (in_channels == out_channels) and (stride == 1): self.residual = lambda x: x else: self.residual = nn.Sequential( nn.Conv2d( in_channels, out_channels, kernel_size=1, #kernel_size=(kernel_size[0], 1), stride=(stride, 1)), nn.BatchNorm2d(out_channels), ) self.relu = nn.ReLU(inplace=True)