我对PyTorch中执行的数据扩充有点困惑.现在,据我所知,当我们执行数据扩充时,我们将保留原始数据集,然后添加其他版本(Flipping,Cropping ...等).但这似乎并没有发生在PyTorch中.据我data.transforms所知,当我们在PyTorch中使用时,它会逐一应用它们.例如:
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}
Run Code Online (Sandbox Code Playgroud)
在这里,对于训练,我们首先随机裁剪图像并调整其形状(224,224).然后我们拍摄这些(224,224)图像并水平翻转它们.因此,我们的数据集现在只包含水平翻转的图像,因此在这种情况下我们的原始图像会丢失.
我对吗?这种理解是否正确?如果没有,那么我们在上面的代码(取自官方文档)中告诉PyTorch在哪里保留原始图像并将它们调整到预期的形状(224,224)?
谢谢
我正在研究神经网络问题,将数据分类为 1 或 0。我使用二进制交叉熵损失来做到这一点。损失很好,但是,准确性非常低并且没有提高。我假设我在精度计算中犯了一个错误。在每个时期之后,我在对输出进行阈值处理后计算正确的预测,并将该数字除以数据集的总数。我在精度计算中做错了什么吗?为什么它没有改善,反而变得更糟?这是我的代码:
net = Model()
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
num_epochs = 100
for epoch in range(num_epochs):
for i, (inputs,labels) in enumerate (train_loader):
inputs = Variable(inputs.float())
labels = Variable(labels.float())
output = net(inputs)
optimizer.zero_grad()
loss = criterion(output, labels)
loss.backward()
optimizer.step()
#Accuracy
output = (output>0.5).float()
correct = (output == labels).float().sum()
print("Epoch {}/{}, Loss: {:.3f}, Accuracy: {:.3f}".format(epoch+1,num_epochs, loss.data[0], correct/x.shape[0]))
Run Code Online (Sandbox Code Playgroud)
这是我得到的奇怪输出:
Epoch 1/100, Loss: 0.389, Accuracy: 0.035
Epoch 2/100, Loss: 0.370, Accuracy: 0.036
Epoch 3/100, Loss: 0.514, Accuracy: 0.030
Epoch …Run Code Online (Sandbox Code Playgroud)