首页 > 解决方案 > 3D CNN 模型只输出正值

问题描述

我正在使用 3D 编码器-解码器模型。我对模型的输入是添加了噪声的 3D 网格。网格中包含的值既有正值也有负值。我想对模型进行降噪。我不知道为什么,但我的模型只输出正值。我正在使用 L1 损失函数。我的训练和验证损失也随着时代的推移而减少。但是当我测试模型时,它只输出正值。但是,它应该只对输入进行降噪并输出正数和负数。我正在使用 PyTorch 自动混合精度进行训练。有人可以帮我解决这个问题。我已经在这上面花费了太多时间。但我无法修复它。如果需要培训脚本,我也可以提供。

pytorch 模型如下:

import torch
import torch.nn as nn


class Model_ED(nn.Module):

    def __init__(self, bn=True):
        super(Model_ED, self).__init__()

        #### ENCODER ####
        self.en_1 = nn.Sequential(
            nn.Conv3d(1, 16, kernel_size=3, stride=1, padding=1),
            #nn.Tanh(),
            nn.ReLU(),
            nn.Conv3d(16, 32, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
        )

        self.en_2 = nn.Sequential(
            nn.Conv3d(32, 32, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
            nn.Conv3d(32, 64, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
        )

        self.en_3 = nn.Sequential(
            nn.Conv3d(64, 64, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
            nn.Conv3d(64, 64, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
            nn.Conv3d(64, 64, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
        )

        #### DECODER ####
        self.de_3 = nn.Sequential(
            nn.Conv3d(128, 32, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
            nn.Conv3d(32, 32, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
        )

        self.de_2 = nn.Sequential(
            nn.Conv3d(64, 16, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
            nn.Conv3d(16, 16, kernel_size=3, stride=1, padding=1),
            # nn.Tanh(),
            nn.ReLU(),
        )

        self.de_1 = nn.Sequential(
            nn.Conv3d(16, 1, kernel_size=3, stride=1, padding=1),
        )

        self.mp = nn.MaxPool3d(kernel_size=2, stride=2)
        self.upsample = nn.Upsample(scale_factor=2)

    def forward(self, input_tsdf_vol):

        # feature encoding
        en_1 = self.en_1(input_tsdf_vol)
        en_2 = self.mp(self.en_2(en_1))
        en_3 = self.mp(self.en_3(en_2))

        # feature decoding
        up_3 = self.upsample(en_3)
        f_cat_3 = torch.cat([up_3, en_2], dim=1)
        de_3 = self.de_3(f_cat_3)

        up_2 = self.upsample(de_3)
        f_cat_2 = torch.cat([up_2, en_1], dim=1)
        de_2 = self.de_2(f_cat_2)

        de_1 = self.de_1(de_2)

        return de_1

标签: pythondeep-learningpytorchconv-neural-networkencoder-decoder

解决方案


推荐阅读