【发布时间】:2020-03-06 16:58:25
【问题描述】:
我正在尝试在 300W 数据集上进行人脸对齐。我正在使用 ResNet50 和 L1 损失进行训练。我的代码看起来像这样。
batch_size = 10
image_size = 128
net = torchvision.models.resnet50(pretrained=True)
num_ftrs = net.fc.in_features
net.fc = nn.Linear(num_ftrs, 136) # 136 because 68 points with 2 dim. so 136= 68*2
def train():
device = torch.device("cuda:0" if torch.cuda.is_available() else
"cpu")
optimiser = optim.Adam(net.parameters(), lr=0.001,
weight_decay=0.0005)
criterion = L1Loss(reduction='sum')
for epoch in range(int(0), 200000):
for batch, data in enumerate(trainloader, 0):
inputs, labels = data
inputs, labels = inputs.to(device), labels.to(device)
optimiser.zero_grad()
outputs = net(inputs).reshape(-1, 68, 2)
loss = criterion(outputs, labels)
loss.backward()
optimiser.step()
running_loss += loss.item()
sys.stdout.write(
'\rTrain Epoch: {} Batch {} avg_Loss_per_batch: {:.2f}
'.format(epoch, batch, running_loss/(batch+1)))
sys.stdout.flush()
trainloader 带有图像和点。基本事实的形状为 (batch, 68, 2)。我们在二维空间上有 68 个点。
论文表明,对于具有 L1 损失的 256*256 图像,ResNet50 应该得到 10(度量:像素)的误差。即使在 5000 个 epoch 之后,我也会在验证集上收到大约 500-800 的错误。
我正在训练具有 256*256 分辨率和 68 个点的基本事实的图像,例如 ((x1,y1),(x2,y2)....(x68,y68)),并且我已经训练了超过 5000 个 epoch许多学习率。我的验证码是这样的,
def validater(load_weights=False):
device = torch.device("cuda:0" if torch.cuda.is_available() else
"cpu")
net.eval()
net.to(device)
with torch.no_grad():
for batch, data in enumerate(testloader, 0):
inputs, labels = data
inputs, labels = inputs.to(device), labels.to(device)
outputs = net(inputs).reshape(-1, 68, 2)
loss = criterion(outputs, labels)
loss2 = np.linalg.norm(labels.to('cpu') - outputs.to('cpu'))
sys.stdout.write('\rTest Epoch: {} Batch {} total_L1_Loss:
{:.2f} avg_L1_Loss_per_img: {:.2f} total_norm_loss:
{:.2f}'.format(
0, batch, avg_loss, avg_loss/batch/batch_size,
avg_loss2))
sys.stdout.flush()
print()
我的代码有什么问题?
PS:我用下面的代码规范化了imgs
img = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
【问题讨论】:
-
对图像进行任何预处理?
-
只是在 0 和 1 之间进行归一化
-
不要在训练循环中定义优化器。违背了 Adam 优化器的目的。
-
我在循环内外都试过了。在大幅降低错误率方面没有太大区别
-
虽然您可能在其他地方遇到问题,但在训练循环中定义优化器绝对是不正确的。唯一可以接受的例外是,如果您使用动量 = 0 的 SGD。
标签: python computer-vision pytorch