Machine learning 这是使用Pytork训练和测试模型的正确方法吗?

Machine learning 这是使用Pytork训练和测试模型的正确方法吗?,machine-learning,neural-network,pytorch,Machine Learning,Neural Network,Pytorch,我正在尝试使用Pytorch实现一个带有神经网络的二元分类,以训练一个模型,如下所示: model=nn.Sequential( bnn.贝叶斯线性(先验μ=0,先验σ=0.1,内特征=196,外特征=300), nn.ReLU(), bnn.贝叶斯线性(先验μ=0,先验σ=0.1,内特征=300,外特征=196), ) 交叉熵损失=nn.CrossEntropyLoss() klloss=bnn.BKLLoss(减少量=平均值),仅最后一层=假) klweight=0.01 optimizer

我正在尝试使用Pytorch实现一个带有神经网络的二元分类,以训练一个模型,如下所示:

model=nn.Sequential(
bnn.贝叶斯线性(先验μ=0,先验σ=0.1,内特征=196,外特征=300),
nn.ReLU(),
bnn.贝叶斯线性(先验μ=0,先验σ=0.1,内特征=300,外特征=196),
)
交叉熵损失=nn.CrossEntropyLoss()
klloss=bnn.BKLLoss(减少量=平均值),仅最后一层=假)
klweight=0.01
optimizer=optim.Adam(model.parameters(),lr=0.01)
培训部分:

培训 对于步进范围(200): 模型=模型(数据张量) 交叉熵=交叉熵损失(模型,目标张量) #交叉熵=0 kl=kl损耗(型号) 总成本=交叉熵+kl权重*kl optimizer.zero_grad() 总成本。向后() optimizer.step() _,预测=火炬最大值(模型数据,1) 最终=目标张量大小(0) 正确=(预测==目标_张量).sum() 打印('-精度:%f%%'%(100*浮点(正确)/最终)) 打印('-CE:%2.2f,KL:%2.2f'(cross_entropy.item(),KL.item()) 问题1:这是训练模特的正确方法吗?在许多文章中,我发现有一部分可以迭代DataLoader以获取培训数据,例如:

对于i,枚举中的数据(火车装载机,0):
#获取输入
输入,目标=数据
问题2:如果我可以直接将数据特征(输入)作为数据张量,将数据标签(目标)作为目标张量,那么这个循环有什么用?因为在遍历数据加载器时,需要花费更多的时间

我不知道如何测试我的模型。我做的如下:

correct=0
总数=0
使用手电筒。无梯度()
对于步进范围(数据张量测试大小(0)):
模型=模型(数据张量测试)
_,预测=火炬最大值(模型数据,1)
总+=目标张量测试。大小(0)
正确+=(预测==目标张量测试).sum().item()
打印('测试数据的准确性:%d%%'%(
100*正确/总计)

问题3:测试我上面训练的模型是否正确?

我将尝试回答您的问题:

问题1和问题2:
这是训练模特的正确方法吗?在许多文章中,我发现有一个部分可以迭代DataLoader以获取培训数据。

出于以下几个原因,在pytorch中进行培训时,应将数据集与数据加载器一起使用:

  • 它允许我们随机抽取数据
  • 它不会将数据预加载到内存中,这对于大型数据集特别有用
  • 它在代码的后台运行,因此在训练的同时获取数据,从而节省时间
  • 它在批处理数据方面非常有效
  • 您在这里所做的似乎是同时在数据中的每个元素上运行您的模型。如果您的数据中只有32个点,这可能会很好(尽管由于数据有限,这并不是最优的),但在运行优化器和将模型暴露于学习机会之间需要取得平衡

    我想这需要更长的时间,因为您的模型非常小,并且运行数据获取可能比在内存中预加载时需要更长的时间。如果不知道数据集的大小和处理的批量大小,很难回答这个问题

    问题3:
    测试我上面训练的模型是否正确?
    在运行任何推理代码之前,需要使用
    model.eval()
    将模型设置为其求值阶段。我也不明白for循环的意义,因为每次都要传递相同的数据。我通常会这样运行:

    correct = 0
    total = 0
    with torch.no_grad():
        model.eval()
        for step,(dat,lab) in enumerate(dataloader_test):
            models = model(dat)
            _, predicted = torch.max(models.data, 1)
            total += dat.size(0)
            correct += (predicted == lab).sum().item()
    
    print('Accuracy of the test data: %d %%' % (
        100 * correct / total))
    

    我将尝试回答您的问题:

    问题1和问题2:
    这是训练模特的正确方法吗?在许多文章中,我发现有一个部分可以迭代DataLoader以获取培训数据。

    出于以下几个原因,在pytorch中进行培训时,应将数据集与数据加载器一起使用:

  • 它允许我们随机抽取数据
  • 它不会将数据预加载到内存中,这对于大型数据集特别有用
  • 它在代码的后台运行,因此在训练的同时获取数据,从而节省时间
  • 它在批处理数据方面非常有效
  • 您在这里所做的似乎是同时在数据中的每个元素上运行您的模型。如果您的数据中只有32个点,这可能会很好(尽管由于数据有限,这并不是最优的),但在运行优化器和将模型暴露于学习机会之间需要取得平衡

    我想这需要更长的时间,因为您的模型非常小,并且运行数据获取可能比在内存中预加载时需要更长的时间。如果不知道数据集的大小和处理的批量大小,很难回答这个问题

    问题3:
    测试我上面训练的模型是否正确?
    在运行任何推理代码之前,需要使用
    model.eval()
    将模型设置为其求值阶段。我也不明白for循环的意义,因为每次都要传递相同的数据。我通常会这样运行:

    correct = 0
    total = 0
    with torch.no_grad():
        model.eval()
        for step,(dat,lab) in enumerate(dataloader_test):
            models = model(dat)
            _, predicted = torch.max(models.data, 1)
            total += dat.size(0)
            correct += (predicted == lab).sum().item()
    
    print('Accuracy of the test data: %d %%' % (
        100 * correct / total))