python - 如何在pytorch中运行一批?
问题描述
我是 AI 和 python 的新手,我试图只运行一批以过度拟合。我找到了代码:
iter(train_loader).next()
但我不确定在我的代码中在哪里实现它。即使我这样做了,我如何在每次迭代后检查以确保我正在训练相同的批次?
train_loader = torch.utils.data.DataLoader(
dataset_train,
batch_size=48,
shuffle=True,
num_workers=2
)
net = nn.Sequential(
nn.Flatten(),
nn.Linear(128*128*3,10)
)
nepochs = 3
statsrec = np.zeros((3,nepochs))
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)
for epoch in range(nepochs): # loop over the dataset multiple times
running_loss = 0.0
n = 0
for i, data in enumerate(train_loader, 0):
inputs, labels = data
# Zero the parameter gradients
optimizer.zero_grad()
# Forward, backward, and update parameters
outputs = net(inputs)
loss = loss_fn(outputs, labels)
loss.backward()
optimizer.step()
# accumulate loss
running_loss += loss.item()
n += 1
ltrn = running_loss/n
ltst, atst = stats(train_loader, net)
statsrec[:,epoch] = (ltrn, ltst, atst)
print(f"epoch: {epoch} training loss: {ltrn: .3f} test loss: {ltst: .3f} test accuracy: {atst: .1%}")
请给我一个提示
解决方案
如果您希望在单个批次上进行训练,请删除数据加载器上的循环:
for i, data in enumerate(train_loader, 0):
inputs, labels = data
并且只需在遍历 epoch之前train_loader
获取迭代器的第一个元素,否则将在每次迭代时调用,并且您将在每个 epoch 上运行不同的批次:next
inputs, labels = next(iter(train_loader))
i = 0
for epoch in range(nepochs):
optimizer.zero_grad()
outputs = net(inputs)
loss = loss_fn(outputs, labels)
loss.backward()
optimizer.step()
# ...
推荐阅读
- asp.net-web-api - 如何将复杂对象数组传递给 URI 中的 IEnumerable 参数
- javascript - 如何从javascript中删除套接字
- java - 用重复的字符串填充数组 - JAVA
- android - 以编程方式更改开关的状态
- json - 快速解析 json 错误“没有与键 CodingKeys 关联的值(stringValue:\“id\”,intValue:nil)(\“id\”)。”
- ios - 如何使用一个 ContainerView 显示多个 ViewController
- product - 获取 BigCommerce 产品选项 variantId
- netbeans - 如何运行 Netbeans Vaadin 示例项目?
- coq - 如何在 CoqIDE 中拥有多个窗格?
- java - 将某些列复制到另一个表中并在同一个 SQL 语句中插入新值?