python-3.x - 如何修复“ValueError: Expected input batch_size (1) to match target batch_size (4).”?
问题描述
我正在 google colab 上训练一个 pytorch 神经网络来对总共 29 个类的手语字母进行分类。
我们一直在通过更改各种参数来修复代码,但无论如何它都不起作用。
transform = transforms.Compose([
#gray scale
transforms.Grayscale(),
#resize
transforms.Resize((128,128)),
#converting to tensor
transforms.ToTensor(),
#normalize
transforms.Normalize( (0.1307,), (0.3081,)),
])
data_dir = 'data/train/asl_alphabet_train'
#dataset
full_dataset = datasets.ImageFolder(root=data_dir, transform=transform)
#train & test
train_size = int(0.8 * len(full_dataset))
test_size = len(full_dataset) - train_size
#splitting
train_dataset, test_dataset = torch.utils.data.random_split(full_dataset, [train_size, test_size])
trainloader = torch.utils.data.DataLoader(train_dataset , batch_size = 4, shuffle = True )
testloader = torch.utils.data.DataLoader(test_dataset , batch_size = 4, shuffle = False )
#neural net architecture
Net(
(conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv3): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(fc1): Linear(in_features=32768, out_features=128, bias=True)
(fc2): Linear(in_features=128, out_features=29, bias=True)
(dropout): Dropout(p=0.5)
)
loss_fn = nn.CrossEntropyLoss()
#optimizer
opt = optim.SGD(model.parameters(), lr=0.01)
def train(model, train_loader, optimizer, loss_fn, epoch, device):
#telling pytorch that training mode is on
model.train()
loss_epoch_arr = []
#epochs
for e in range(epoch):
# bach_no, data, target
for batch_idx, (data, target) in enumerate(train_loader):
#moving to GPU
#data, target = data.to(device), target.to(device)
#Making gradints zero
optimizer.zero_grad()
#generating output
output = model(data)
#calculating loss
loss = loss_fn(output, target)
#backward propagation
loss.backward()
#stepping optimizer
optimizer.step()
#printing at each 10th epoch
if batch_idx % 10 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
#de-allocating memory
del data,target,output
#torch.cuda.empty_cache()
#appending values
loss_epoch_arr.append(loss.item())
#plotting loss
plt.plot(loss_epoch_arr)
plt.show()
train(model, trainloader , opt, loss_fn, 10, device)
ValueError:预期输入 batch_size (1) 与目标 batch_size (4) 匹配。
我们是 pytorch 的初学者,并试图找出问题所在。
解决方案
此错误的最可能原因与 nn.Linear 函数中 in_features 的值有关您尚未为此提供完整代码。
检查这一点的一种方法是将以下几行添加到您的转发函数中(在 x.view 之前:
print('x_shape:',x.shape)
结果将采用[a,b,c,d]形式。in_features 值应等于b*c*d
推荐阅读
- html - 相当于 IE 的“object-fit:cover”的 CSS 样式
- javascript - 将对象数组转换为另一个结构化对象数组
- javascript - 返回时如何保留值
- winforms - 在 DateTimePicker winform 中禁用日期选择
- python - 包含三个连续的辅音
- c# - 如何使用 moq 验证具有参数类型(字符串、对象)的函数
- javascript - 如何在 JavaScript 中提取自定义 HTTP POST 请求标头,以便在另一个 POST 请求中传输?
- spring-mvc - 无法在 Tomcat Web 应用程序管理器中启动 Spring Web 应用程序
- c++ - openssl 命令加密数据不匹配 EVP_aes_128_cbc C 代码
- javascript - 将 redis 键组合成响应