1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class I3D_Network(nn.Module): """ 简化版 I3D 网络(基于 Inception-V1 结构简化) """ def __init__(self, num_classes=400, dropout=0.5, in_channels=3): super(I3D_Network, self).__init__() self.num_classes = num_classes self.conv1 = nn.Sequential( nn.Conv3d(in_channels, 64, kernel_size=(7, 7, 7), stride=(2, 2, 2), padding=(3, 3, 3)), nn.BatchNorm3d(64), nn.ReLU(True), nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(1, 2, 2), padding=(0, 1, 1)) ) self.conv2 = nn.Sequential( nn.Conv3d(64, 64, kernel_size=(1, 1, 1)), nn.BatchNorm3d(64), nn.ReLU(True), nn.Conv3d(64, 192, kernel_size=(3, 3, 3), padding=(1, 1, 1)), nn.BatchNorm3d(192), nn.ReLU(True), nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(1, 2, 2), padding=(0, 1, 1)) ) self.inception3a = I3D_Inception(192, 64, 96, 128, 16, 32, 32) self.inception3b = I3D_Inception(256, 128, 128, 192, 32, 96, 64) self.maxpool3 = nn.MaxPool3d(kernel_size=(3, 3, 3), stride=(2, 2, 2), padding=(1, 1, 1)) self.inception4a = I3D_Inception(480, 192, 96, 208, 16, 48, 64) self.inception4b = I3D_Inception(512, 160, 112, 224, 24, 64, 64) self.inception4c = I3D_Inception(512, 128, 128, 256, 24, 64, 64) self.inception4d = I3D_Inception(512, 112, 144, 288, 32, 64, 64) self.inception4e = I3D_Inception(528, 256, 160, 320, 32, 128, 128) self.maxpool4 = nn.MaxPool3d(kernel_size=(2, 2, 2), stride=(2, 2, 2)) self.inception5a = I3D_Inception(832, 256, 160, 320, 32, 128, 128) self.inception5b = I3D_Inception(832, 384, 192, 384, 48, 128, 128) self.global_avgpool = nn.AdaptiveAvgPool3d(1) self.dropout = nn.Dropout(dropout) self.fc = nn.Linear(1024, num_classes) self._initialize_weights()
|