将一个简单的Keras卷积神经网络转换为PyTorch

4

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

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      
=================================================================
2个回答

4
您的PyTorch等效Keras模型将如下所示:
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])

0
您可以保存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/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接