用Pytorch训练分类模型

本次分类问题使用的数据集是MNIST,每个图像的大小为\(28*28\)。

编写代码的步骤如下

  1. 载入数据集,分别为训练集和测试集
  2. 让数据集可以迭代
  3. 定义模型,定义损失函数,训练模型
代码
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision.datasets as dsets
from torch.autograd import Variable

'''下载训练集和测试集'''
train_dataset = dsets.MNIST(root='./datasets',
                            train=True,
                            transform=transforms.ToTensor(),
                            download=True)

test_dataset = dsets.MNIST(root='./datasets',
                           train=False,
                           transform=transforms.ToTensor())

'''让数据集可以迭代'''
batch_size = 100
n_iters = 3000
num_epochs = n_iters / (len(train_dataset) / batch_size)
num_epochs = int(num_epochs)

train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=batch_size,
                                           shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                                          batch_size=batch_size,
                                          shuffle=False)

'''定义模型'''
class LogisticRegressionModel(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(LogisticRegressionModel, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)

    def forward(self, x):
        out = self.linear(x)
        return out

'''实例化模型'''
input_dim = 28*28
output_dim = 10

model = LogisticRegressionModel(input_dim, output_dim)

'''定义损失计算方式'''
criterion = nn.CrossEntropyLoss()

learning_rate = 0.001

optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

'''训练次数'''
iter = 0
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):

        images = Variable(images.view(-1, 28*28))
        labels = Variable(labels)

        #梯度置零
        optimizer.zero_grad()

        #计算输出
        outputs = model(images)

        #计算损失,内部会自动softmax然后进行Crossentropy
        loss = criterion(outputs, labels)

        #反向传播
        loss.backward()

        #更新参数
        optimizer.step()

        iter += 1

        if iter % 500 == 0:
            #计算准确度
            correct = 0
            total = 0
            for images, labels in test_loader:
                images = Variable(images.view(-1, 28*28))

                #获得输出,输出的大小为(batch_size,10)
                outputs = model(images)

                #获得预测值,输出的大小为(batch_size,1)
                _, predicted = torch.max(outputs.data, 1)

                #labels的size是(100,)
                total += labels.size(0)

                #返回的是预测值和标签值相等的个数
                correct += (predicted == labels).sum()

            accuracy = 100 * correct / total

            # Print Loss
            print('Iteration: {}. Loss: {}. Accuracy: {}'.format(iter, loss.data[0], accuracy))
输出如下

原文地址:https://www.cnblogs.com/MartinLwx/p/10354889.html

时间: 2024-11-13 20:27:04

用Pytorch训练分类模型的相关文章

用Pytorch训练线性回归模型

假定我们要拟合的线性方程是:\(y=2x+1\) \(x\):[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] \(y\):[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29] import torch import torch.nn as nn from torch.autograd import Variable import numpy as np import matplotli

华为云EI ModelArts,从0到1开发训练AI模型,通过“极快”和“极简”实现普惠AI

华为云EI ModelArts,从0到1开发训练AI模型,通过"极快"和"极简"实现普惠AI现如今 AI 技术.概念火爆.落地应用更是繁多,但开发呢?是否困难?到底有多痛?据了解,大部分 AI 开发者的工作时间并不长,并且十有八九可能不是"科班出身".从编写的教材.录制的课程中就可以看出,所有的教学都不可避免地带有很强的的学术性,即便有意避免研究导向,仍然离产业界的需求相去甚远.并且随着新一波人工智能的热潮,人们发现手里的数据多了,电脑运算的更快

softmax和分类模型

softmax和分类模型 softmax的基本概念 分类问题 一个简单的图像分类问题,输入图像的高和宽均为2像素,色彩为灰度. 图像中的4像素分别记为 \(x_1, x_2, x_3, x_4\) 假设真实标签为狗.猫或者鸡,这些标签对应的离散值为 \(y_1, y_2, y_3\) . 我们通常使用离散的数值来表示类别,例如\(y_1=1, y_2=2, y_3=3\). 权重矢量 \[ \begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{21} + x_3

Spark学习笔记——构建分类模型

Spark中常见的三种分类模型:线性模型.决策树和朴素贝叶斯模型. 线性模型,简单而且相对容易扩展到非常大的数据集:线性模型又可以分成:1.逻辑回归:2.线性支持向量机 决策树是一个强大的非线性技术,训练过程计算量大并且较难扩展(幸运的是,MLlib会替我们考虑扩展性的问题),但是在很多情况下性能很好: 朴素贝叶斯模型简单.易训练,并且具有高效和并行的优点(实际中,模型训练只需要遍历所有数据集一次).当采用合适的特征工程,这些模型在很多应用中都能达到不错的性能.而且,朴素贝叶斯模型可以作为一个很

分类模型评估与选择总结

1.评估分类器性能的度量 当建立好一个分类模型之后,就会考虑这个模型的性能或准确率如何,这里介绍几种分类器评估度量如下表: 假设在有标号的元组组成的训练集上使用分类器.P是正元组数,N是负元组数. 度量 公式 准确率.识别率 (TP+TN)/(P+N) 错误率.误分类率 (FP+FN)/(P+N) 敏感度.真正例率.召回率 TP/P 特效型.真负例率 TN/N 精度 TP/(TP+FP) F.F1.F分数 精度和召回率的调和均值 2*precision*recall/(precision+rec

spark机器学习笔记:(五)用Spark Python构建分类模型(下)

声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents 博主简介:风雪夜归子(英文名:Allen),机器学习算法攻城狮,喜爱钻研Meachine Learning的黑科技,对Deep Learning和Artificial Intelligence充满兴趣,经常关注Kaggle数据挖掘竞赛平台,对数据.Machine Learning和Artificial Intelligence有兴趣的童鞋可以一起探讨哦,

将特征离散成高维的布尔特征可以解决分类模型的非线性问题

原文:http://blog.sina.com.cn/s/blog_818f5fde0102vxf7.html 之前实习,公司团队用LR进行推荐排序的时候,都会将所有特征离散成非常高维的0/1特征(千万维级别),然后再进行模型训练.大牛说这样可以解决模型的非线性问题.因为逻辑回归只能拟合线性分类问题,也不能像SVM那样利用核函数(之前在博文http://blog.sina.com.cn/s/blog_818f5fde0102vvpy.html里已经讲过,因为这样做会造成非常大的计算开销),如果遇

sklearn特征选择和分类模型

数据格式: 这里.原始特征的输入文件的格式使用libsvm的格式,即每行是label index1:value1 index2:value2这样的稀疏矩阵的格式. sklearn中自带了非常多种特征选择的算法. 我们选用特征选择算法的根据是数据集和训练模型. 以下展示chi2的使用例.chi2,採用卡方校验的方法进行特征选择.比較适合0/1型特征和稀疏矩阵. from sklearn.externals.joblib import Memory from sklearn.datasets imp

机器学习二分类模型评价指标:准确率\召回率\特异度等

混淆矩阵是一种用于性能评估的方便工具,它是一个方阵,里面的列和行存放的是样本的实际类vs预测类的数量. P =阳性,N =阴性:指的是预测结果. T=真,F=假:表示 实际结果与预测结果是否一致,一致为真,不一致为假. TP=真阳性:预测结果为P,且实际与预测一致. FP=假阳性:预测结果为P,但与实际不一致. TN=真阴性:预测结果为N,且与实际一致. FN=假阴性:预测结果为N,但与实际不一致. 分类模型的经验误差可以通过计算1-准确率得到. 然而,如何选择一个适当的预测误差度量是高度依赖于