python - 我的损失函数在训练期间没有得到更小的值

我正在尝试预测我手掌的中心

我的神经网络结构由 2 个 cnn 组成,后跟最大池化层和一个具有 2 个输出的线性层,一个用于 x,另一个用于 y。输入是 720x720 图像。

class MyNeuralNetwork(torch.nn.Module):
    def __init__(self):
        super(MyNeuralNetwork, self).__init__()
        self.conv1 = torch.nn.Conv2d(4, 5, 5)
        self.conv2 = torch.nn.Conv2d(5, 5, 5)
        self.pool = torch.nn.MaxPool2d(3, 3)
        self.linear = torch.nn.Linear(5 * 78 * 78, 2)

    def forward(self, x):
        x = self.conv1(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = self.pool(x)
        x = x.view(x.size(0), -1)
        x = self.linear(x)
    return x

我将图像的路径名保存在一个 csv 文件中。 x 和 y 坐标保存在不同的 csv 文件中。这是我的数据集的代码。

class MyHand(Dataset):
 """Creating the proper dataset to feed my neural network"""
    def __init__(self, name_path, root_dir, results_path, transform=None):
       self.names = pd.read_csv(name_path)
       self.rootdir = root_dir
       self.transform = transform
       self.results = pd.read_csv(results_path)

    def __len__(self):
        length = len(self.names.columns)
        return length

    def __getitem__(self, index):
        img_path = os.path.join(self.rootdir, self.names.columns[index])
        image = pl.imread(img_path)
        x_top_left_corner = torch.tensor(self.results.iloc[index, 0])
        y_top_left_corner = torch.tensor(self.results.iloc[index, 1])
        width = torch.tensor(self.results.iloc[index, 2])
        height = torch.tensor(self.results.iloc[index, 3])


        # calculating the x and y center of my palm
        x_center = x_top_left_corner + width/2
        y_center = y_top_left_corner - height/2

        if self.transform:
            image = self.transform(image)

        return image, x_center, y_center

训练网络的代码是

dataset = MyHand(name_path='path to the names of the images csv', 
results_path='path to the results cvs', 
transform=torchvision.transforms.ToTensor( ))
loader = DataLoader(dataset=dataset, batch_size=4)
model = MyNeuralNetwork()
criterion = torch.nn.MSELoss()
EPOCHS = 5
LEARNING_RATE = 0.001
optimizer = optim.SGD(model.parameters(), LEARNING_RATE)

for epoch in range(EPOCHS):
    print("epoch:", epoch)
    for data in dataset:
        pic, x, y = data
        model.zero_grad()
        outpout = model(pic[None, :, :, :])
        loss1 = criterion(outpout[0, 0], x)
        loss2 = criterion(outpout[0, 1], y)
        loss = loss1 + loss2
        loss.backward()
        print(loss)

但正如您在下面看到的,我的损失函数在每个时期的结果完全相同,而且根本没有减少。我能为此做什么?我尝试了不同的学习率值,但仍然相同。

最佳答案

如您所见,您的损失值非常高。我建议您使用 sigmoid 激活函数来规范化您的输出。现在坐标在 0-1 范围内,稍后可以通过将它们乘以 720 转换为图像。要计算损失,您必须将目标坐标除以 720。然后您应该在范围 0-1。 还有:

  • 要么降低你的学习率,要么尝试一个更小的学习率
  • 缩小你的图片(我不知道图片看起来如何,但 720x720 相当大)
  • 使用较小内核的三个卷积
  • 添加第二个线性层

https://stackoverflow.com/questions/68335560/

相关文章:

azure-devops - Azure Devops 管道 NPM 审计

schema - Protocol Buffer 架构无效。导入 "google/protobuf/

python - 多次拟合时 keras fit() 的历史

sql - 如何获得日期 + 时间的确定性计算值

javascript - 如何减少 GridStack 网格元素的最小高度和重量?

c - 为什么 GTK 4 报告 "assertion ' GTK_IS_WIDGET(部件 )'

node.js - 修复创建新 Angular 项目时的上游依赖冲突

chainlink - 布朗尼安装疑难解答

scala - Spark : Why execution is carried by a mast

javascript - A 帧动画框在特定区域随机移动