【问题标题】:Convert a simple cnn from keras to pytorch将简单的 cnn 从 keras 转换为 pytorch
【发布时间】:2020-12-08 17:45:02
【问题描述】:

谁能帮我把这个模型转换成 PyTorch?我已经尝试像 How can I convert this keras cnn model to pytorch version 这样从 Keras 转换为 PyTorch,但训练结果不同。谢谢。

input_3d = (1, 64, 96, 96)
pool_3d = (2, 2, 2)
model = Sequential()
model.add(Convolution3D(8, 3, 3, 3, name='conv1', input_shape=input_3d,
                          data_format='channels_first'))
model.add(MaxPooling3D(pool_size=pool_3d, name='pool1'))
model.add(Convolution3D(8, 3, 3, 3, name='conv2',data_format='channels_first'))
model.add(MaxPooling3D(pool_size=pool_3d, name='pool2'))
model.add(Convolution3D(8, 3, 3, 3, name='conv3',data_format='channels_first'))
model.add(MaxPooling3D(pool_size=pool_3d, name='pool3'))
model.add(Flatten())
model.add(Dense(2000, activation='relu', name='dense1'))
model.add(Dropout(0.5, name='dropout1'))
model.add(Dense(500, activation='relu', name='dense2'))
model.add(Dropout(0.5, name='dropout2'))
model.add(Dense(3, activation='softmax', name='softmax'))


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1 (Conv3D)               (None, 8, 60, 94, 94)     224       
_________________________________________________________________
pool1 (MaxPooling3D)         (None, 8, 30, 47, 47)     0         
_________________________________________________________________
conv2 (Conv3D)               (None, 8, 28, 45, 45)     1736      
_________________________________________________________________
pool2 (MaxPooling3D)         (None, 8, 14, 22, 22)     0         
_________________________________________________________________
conv3 (Conv3D)               (None, 8, 12, 20, 20)     1736      
_________________________________________________________________
pool3 (MaxPooling3D)         (None, 8, 6, 10, 10)      0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 4800)              0         
_________________________________________________________________
dense1 (Dense)               (None, 2000)              9602000   
_________________________________________________________________
dropout1 (Dropout)           (None, 2000)              0         
_________________________________________________________________
dense2 (Dense)               (None, 500)               1000500   
_________________________________________________________________
dropout2 (Dropout)           (None, 500)               0         
_________________________________________________________________
softmax (Dense)              (None, 3)                 1503      
=================================================================

【问题讨论】:

    标签: keras pytorch


    【解决方案1】:

    Keras 模型的 PyTorch 等效项如下所示:

    class CNN(nn.Module):
        
        def __init__(self, ):
            super(CNN, self).__init__()
            
            self.maxpool = nn.MaxPool3d((2, 2, 2))
            
            self.conv1 = nn.Conv3d(in_channels=1, out_channels=8, kernel_size=3)
            self.conv2 = nn.Conv3d(in_channels=8, out_channels=8, kernel_size=3)
            self.conv3 = nn.Conv3d(in_channels=8, out_channels=8, kernel_size=3)
            
            self.linear1 = nn.Linear(4800, 2000)
            self.dropout1 = nn.Dropout3d(0.5)
            
            self.linear2 = nn.Linear(2000, 500)
            self.dropout2 = nn.Dropout3d(0.5)
            
            self.linear3 = nn.Linear(500, 3)
            
        def forward(self, x):
            
            out = self.maxpool(self.conv1(x))
            out = self.maxpool(self.conv2(out))
            out = self.maxpool(self.conv3(out))
            
            # Flattening process
            b, c, d, h, w = out.size() # batch_size, channels, depth, height, width
            out = out.view(-1, c * d * h * w)
            
            out = self.dropout1(self.linear1(out))
            out = self.dropout2(self.linear2(out))
            out = self.linear3(out)
            
            out = torch.softmax(out, 1)
            
            return out
    

    用于测试模型的驱动程序:

    inputs = torch.randn(8, 1, 64, 96, 96)
    model = CNN()
    outputs = model(inputs)
    print(outputs.shape) # torch.Size([8, 3])
    

    【讨论】:

      【解决方案2】:

      您可以节省 keras 的重量,然后在 pytorch 中重新加载。 步骤是
      第 0 步:在 Keras 中训练模型。 ...
      第 1 步:在 PyTorch 中重新创建和初始化您的模型架构。 ...
      第 2 步:导入您的 Keras 模型并复制权重。 ...
      第 3 步:将这些权重加载到您的 PyTorch 模型中。 ...
      第 4 步:测试并保存您的 Pytorch 模型。
      你可以在这里https://gereshes.com/2019/06/24/how-to-transfer-a-simple-keras-model-to-pytorch-the-hard-way/

      【讨论】:

        猜你喜欢
        • 2021-04-27
        • 2022-01-02
        • 2021-07-01
        • 1970-01-01
        • 2020-05-27
        • 2021-07-10
        • 1970-01-01
        • 2021-10-29
        • 2021-03-19
        相关资源
        最近更新 更多