Pytorch基础入门

Pytorch介绍

Torch是一个开源的机器学习的框架,早在2002年就发布了Torch的初版, Torch的编程语言为C和Lua。如今的Torch7依旧是热门的深度学习框架之一。
PyTorch是在2017年1月由Facebook推出的。它是经典机器学习库Torch框架的一个端口,主要编程语言为python.

Torch: 2002年发布,早期的机器学习框架。
Theano: 2008年开发,第一个影响力较大的python深度学习框架。
CNTK:2016年1月由微软公司开源,在语音领域效果比较突出。
TensorFlow:2015年11月Google开源,目前最热门深度学习框架之一。
Keras: 以Theano/Tensorflow/CNTK作为底层,最容易使用的深度学习框架。
Caffe/Caffe2:2013年开源的C++深度学习框架,曾经计算机视觉领域的王者。
MXNet: 2015年发布,AWS云计算的官方深度学习平台。
Paddle: 2016年8月开源的百度深度学习框架。
PyTorch: 2017年开源,Torch的python版本,目前最有潜力,最热门的深度学 习框架之一。

Pytorch安装

https://pytorch.org/打开Pytorch官网进行下载,
在这里插入图片描述
根据自己电脑选择相应的选项,最后把下方的指令输入CMD中执行即可。

MNIST数据集介绍

数据集被分成两部分: 60000行的训练数据集( mnist.train)和10000行的测试数据集( mnist.test)
在这里插入图片描述
一张图片包含28* 28个像素,我们把这一个数组展开成一个向量,长度是28* 28=784。如果把数据用矩阵表示,可以把MNIST训练数据变成一个形状为 [60000, 784] 的矩阵,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。图片里的某个像素的强度值介于0-1之间。
在这里插入图片描述

One-hot编码

MNIST数据集的标签是介于0-9的数字,我们要把标签转化为“one-hotvectors” 。一个one-hot向量除了某一位数字是1以外,其余维度数字都是0,比如标签0将表示为([1,0,0,0,0,0,0,0,0,0]),标签3将表示为
([0,0,0,1,0,0,0,0,0,0])
在这里插入图片描述

Softmax函数介绍

在多分类问题中,我们通常会使用softmax函数作为网络输出层的激活函数,softmax函数可以对输出值进行归一化操作,把所有输出值都转化为概率,所有概率值加起来等于1, softmax的公式为:
在这里插入图片描述

损失函数

均方误差(二次代价函数)

在这里插入图片描述
激活函数的梯度f’(z)越大, w的大小调整得越快,训练收敛得就越快。激活函数的梯度f’(z)越小, w的大小调整得越慢,训练收敛得就越慢。
按理来说,如果损失函数越大,应该进行的求导越快,而二次代价函数做不到,引出交叉熵函数。

交叉熵

在这里插入图片描述

过拟合

在这里插入图片描述

防止过拟合

增大数据集

增大数据集方法:
在这里插入图片描述

Early stopping

在训练模型的时候,我们往往会设置一个比较大的迭代次数。 Earlystopping便是一种提前结束训练的策略用来防止过拟合。
一般的做法是记录到目前为止最好的validation accuracy,当连续10个Epoch没有达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了( Early Stopping)。

Dropout

在训练数据集的时候,随机的屏蔽掉一些神经元,以提高数据的鲁棒性

正则化项

优化器

Adadelta
Adagrad
Adam 一般使用Adam
Adamax
AdamW
ASGD
LBFGS
RMSprop
Rprop
SGD
SparseAdam

卷积神经网络CNN

卷积神经网络是近年发展起来,并广泛应用于图像处理, NLP等领域的一种多层神经网络。

局部感受野

权值共享

卷积计算

在这里插入图片描述

池化

在这里插入图片描述

Padding

SAME PADDING:
给平面外部补0
卷积窗口采样后得到一个跟原来大小相同的平面
VALID PADDING:
不会超出平面外部
卷积窗口采样后得到一个比原来平面小的平面
在这里插入图片描述

猫狗分类案例

训练模型

import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
from torchvision.models import VGG16_Weights

# 数据预处理
transform = transforms.Compose([
    transforms.RandomResizedCrop(224),  # 对图形进行切割后,在形成固定大小
    transforms.RandomRotation(20),  # 随机角度进行旋转
    transforms.RandomHorizontalFlip(p=0.5),  # 随机水平移动
    transforms.ToTensor()  # 转成pytorch使用的tensor数据集形式
])

# 读取数据
root = 'image'
train_dataset = datasets.ImageFolder(root + '/train', transform)
test_dataset = datasets.ImageFolder(root + '/test', transform)

# 导入数据
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=8, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=8, shuffle=True)

#
classes = train_dataset.classes
classes_index = train_dataset.class_to_idx

batch_size = 64
LR = 0.0001
model = models.vgg16(weights=VGG16_Weights.DEFAULT)
# model = model.cuda()

# 只训练全连接层
for param in model.parameters():
    param.requires_grad = False
# 构建新的全连接层
model.classifier = torch.nn.Sequential(torch.nn.Linear(25088, 100),
                                       torch.nn.ReLU(),
                                       torch.nn.Dropout(p=0.5),
                                       torch.nn.Linear(100, 2))
# 定义损失函数
mse_loss = nn.CrossEntropyLoss()
# 定义优化器
optimizer = optim.SGD(model.parameters(), LR, momentum=0.9)


def train():
    model.train()
    for i, data in enumerate(train_loader):
        # 获得一个批次的数据和标签
        inputs, labels = data

        # inputs = Variable(inputs.cuda())
        # labels = Variable(labels.cuda())

        # 获得模型预测结果(64,10)
        out = model(inputs)
        # to onehot,把数据标签变成独热编码
        # (64)-(64,1)

        loss = mse_loss(out, labels)
        # 梯度清0
        optimizer.zero_grad()
        # 计算梯度
        loss.backward()
        # 修改权值
        optimizer.step()


def test():
    model.eval()
    correct = 0
    for i, data in enumerate(test_loader):
        # 获得一个批次的数据和标签
        inputs, labels = data
        # inputs = Variable(inputs.cuda())
        # labels = Variable(labels.cuda())

        # 获得模型预测结果(64,10)
        out = model(inputs)
        # 获得最大值,以及最大值所在的位置
        _, predicted = torch.max(out, 1)
        # 预测正确的数量
        correct += (predicted == labels).sum()
    print("Test acc:{0}".format(correct.item() / len(test_dataset)))
    correct = 0
    for i, data in enumerate(train_loader):
        # 获得一个批次的数据和标签
        inputs, labels = data
        # inputs = Variable(inputs.cuda())
        # labels = Variable(labels.cuda())
        # 获得模型预测结果(64,10)
        out = model(inputs)
        # 获得最大值,以及最大值所在的位置
        _, predicted = torch.max(out, 1)
        # 预测正确的数量
        correct += (predicted == labels).sum()
    print("Train acc:{0}".format(correct.item() / len(train_dataset)))


for epoch in range(2):
    print('epoch:', epoch)
    train()
    test()
torch.save(model.state_dict(), 'cat_dog_cnn.pth')

测试模型

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from PIL import Image
from torch.autograd import Variable
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
from torchvision.models import VGG16_Weights

model = models.vgg16(weights=VGG16_Weights.DEFAULT)
# 构建新的全连接层
model.classifier = torch.nn.Sequential(torch.nn.Linear(25088, 100),
                                       torch.nn.ReLU(),
                                       torch.nn.Dropout(p=0.5),
                                       torch.nn.Linear(100, 2))

model.load_state_dict(torch.load('cat_dog_cnn.pth'))

model.eval()

label = np.array(['cat', 'dog'])

# 数据预处理
transform = transforms.Compose([
    transforms.Resize(224),
    transforms.ToTensor()
])


def predict(image_path):
    # 打开图片
    img = Image.open(image_path)
    # 数据处理,再增加一个维度
    img = transform(img).unsqueeze(0)
    # img = img.convert("RGB")
    # 预测得到结果
    outputs = model(img)
    # 获得最大值所在位置
    _, predicted = torch.max(outputs, 1)
    # 转化为类别名称
    print(label[predicted.item()])


predict('image/test/cat/cat.1120.jpg')

转载自bilibili覃秉丰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值