我的损失函数在训练期间没有得到更小的值
Posted
技术标签:
【中文标题】我的损失函数在训练期间没有得到更小的值【英文标题】:My Loss Function doesn't get smaller values during training 【发布时间】:2021-09-20 22:09:24 【问题描述】:我正在尝试预测我手掌的中心
我的神经网络结构由 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)
但正如您在下面看到的,我的损失函数在每个时期都有完全相同的结果,并且根本没有减少。我能为此做些什么?我尝试了不同的学习率值,但仍然相同。
【问题讨论】:
【参考方案1】:如您所见,您的损失值非常高。我建议您使用 sigmoid 激活函数来标准化您的输出。现在坐标在 0-1 范围内,稍后可以通过将它们乘以 720 将其转换为图像。要计算损失,您必须将目标坐标除以 720。然后您应该在范围 0-1。 另外:
要么降低你的学习率,要么尝试更小的学习率 缩小图片(我不知道图片长什么样,但720x720
很大)
使用三个具有较小内核的卷积
添加第二个线性层
【讨论】:
以上是关于我的损失函数在训练期间没有得到更小的值的主要内容,如果未能解决你的问题,请参考以下文章
如何在训练 tensorflow.keras 期间替换损失函数