• Batchsize影响测试集的准确度吗


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 weixin_43917221 2024-03-27 19:00 采纳率: 0% 浏览 10 首页/ 人工智能 / Batchsize影响测试集的准确度吗 机器学习深度学习神经网络 我在做时序数据深度学习的时候,我分成两个部分,我对一个数据集先通过CNN做特征提取,然后通过transformer做预测 这样我会保存预测结果最好的CNN的权重 然后我用新的一个数据集进行迁移学习,用保存的CNN的权重和一个初始的transformer进行训练,但是test loader改变batch size之后得到的test accuracy会完全不一样,这是为什么。 我CNN的模型里已经注释掉了batch normalization了。测试的时候也已经是eval模式了 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 专家-皆知 2024-03-27 19:00
      关注

      引自免费微信小程序:皆我百晓生

      Batch size对于测试集的准确度确实有影响。在迁移学习中,你使用了一个预训练的CNN模型和一个初始的Transformer模型进行训练。在训练过程中,你使用了测试数据集进行验证和测试。当Batch size改变时,你可能会发现测试集的准确度发生变化。

      在深度学习中,Batch size是一个重要的超参数,它决定了每次训练和验证数据中包含多少个样本。较小的Batch size会导致模型更加关注每个样本,从而可能提高准确度。然而,如果Batch size过小,模型可能无法充分利用GPU并行计算能力,从而影响训练速度。较大的Batch size可能会导致模型在训练过程中捕捉到更多的模式,从而提高准确度。但是,如果Batch size过大,模型可能会出现过拟合现象,导致在验证集和测试集上的表现不佳。

      在你的情况下,由于已经注释掉了Batch normalization,并且使用eval模式进行测试,因此在测试集上的表现应该不受Batch size的影响。但是,由于Batch size的改变可能会影响训练过程中的模式捕捉和参数更新,因此可能会导致测试集的准确度发生变化。为了获得更好的结果,建议尝试不同的Batch size,并选择能够获得最佳性能的Batch size。你可以通过交叉验证等方法来选择最佳的Batch size。

      评论 编辑记录
      weixin_43917221 2024-03-27 19:10

      你好!但是后面训练完后,我又保存了最好的transformer的权重。这个时候batch size是64,
      我又有之前的CNN和这个transformer的权重来直接做evaluation,batch size的改变会影响test准确度吗,我感觉batch size在test的时候只是改变了同时放到网络里的datapoints数量,不应该会影响test准确度?

      回复
    • 码农阿豪 Java领域优质创作者 2024-03-27 19:00
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      回答: 可能是由于batch size的改变导致了网络的精度变化。事实上,每个batch的数据是被分成许多个mini-batches来处理的,当batch size变小时,每个mini-batch的数据就会变少,这可能导致训练过程中的噪声增加,dropout也可能变得更为有效,从而使得模型更加泛化,而当batch size变大时,每个mini-batch的数据会变多,这可能导致训练过程中的噪声减少,dropout也可能变得不再有效,从而使得模型更加记忆化,从而导致模型的测试精度不稳定。 一种解决方法是使用一致的batch size来进行训练和测试,另一种解决方法是在训练过程中使用一些正则化技术(如dropout)来减少过拟合,从而使得模型更加稳定,可以获得一致的测试精度。 示例代码: 下面是一段示例代码,演示如何在PyTorch中使用一致的batch size进行训练和测试:
      import torch
      from torch.utils.data import DataLoader
      from torchvision.datasets import MNIST
      from torchvision.transforms import ToTensor
      from torch import nn, optim
      # 定义模型
      class Net(nn.Module):
          def __init__(self):
              super().__init__()
              self.cnn = nn.Sequential(
                  nn.Conv2d(1, 32, 5, padding=2),
                  nn.ReLU(),
                  nn.MaxPool2d(2, 2),
                  nn.Conv2d(32, 64, 5, padding=2),
                  nn.ReLU(),
                  nn.MaxPool2d(2, 2)
              )
              self.linear = nn.Sequential(
                  nn.Linear(64 * 7 * 7, 1024),
                  nn.ReLU(),
                  nn.Linear(1024, 10)
              )
          def forward(self, x):
              x = self.cnn(x)
              x = x.view(x.size(0), -1)
              x = self.linear(x)
              return x
      # 设置随机数种子
      torch.manual_seed(0)
      # 加载数据集
      trainset = MNIST(root='./data', train=True, transform=ToTensor())
      trainloader = DataLoader(trainset, batch_size=128, shuffle=True)
      testset = MNIST(root='./data', train=False, transform=ToTensor())
      testloader = DataLoader(testset, batch_size=128, shuffle=True)
      # 定义训练参数
      net = Net()
      criterion = nn.CrossEntropyLoss()
      optimizer = optim.SGD(net.parameters(), lr=0.01)
      # 训练网络
      for epoch in range(10):
          running_loss = 0.0
          for i, data in enumerate(trainloader, 0):
              inputs, labels = data
              optimizer.zero_grad()
              outputs = net(inputs)
              loss = criterion(outputs, labels)
              loss.backward()
              optimizer.step()
              running_loss += loss.item()
          print(f"epoch {epoch + 1}, loss {running_loss / len(trainloader)}")
      # 测试模型
      correct = 0
      total = 0
      with torch.no_grad():
          for data in testloader:
              inputs, labels = data
              outputs = net(inputs)
              _, predicted = torch.max(outputs.data, 1)
              total += labels.size(0)
              correct += (predicted == labels).sum().item()
      print(f"test accuracy {correct / total}")
      

      在上面的代码中,我们使用相同的batch size(128)来训练和测试模型,并使用dropout来减少过拟合,从而使得模型获得更加稳定的测试精度。

      展开全部

      评论
      weixin_43917221 2024-03-27 19:12

      你好!主要是我想用LIME来做可视化,他必须要一个一个点放进去,也就相当于batch size是1,但是跟batch size是64的结果要差很多。
      但是理论上在evaluation的模式下,不是应该test accuracy不管batch size怎么变都是一样的吗?

      回复
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    【数据结构】初识集合&深入剖析顺序表(Arraylist)
    空天地海协同应用综述
    中小企业是否需要微软活动目录联合服务(ADFS)?
    机器视觉公司还是招人?
    38. rem适配布局
    Mysql三种日志(binlog,redolog,undolog)的作用和区别
    Ubuntu下putty 复制粘贴
    mysql数据库基础
    Spring5 自定义标签开发
    机器学习 中数据是如何处理的?
  • 原文地址:https://ask.csdn.net/questions/8079965