ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CNN 卷积神经网络

2022-04-07 08:00:34  阅读:175  来源: 互联网

标签:nn 卷积 torch test 神经网络 train CNN data mathrm


LeNet

由 Yann LeCun 发明的著名的 LeNet.

原版中激活函数用的都是 $\mathrm{sigmoid}$, 现在看来用 $\mathrm{ReLU}$ 或 $\mathrm{tanh}$ 也许会更合适.  

Fashion - mnist 数据集的识别

数据下载

def gener():  
    trans = transforms.ToTensor()     
    mnist_train = torchvision.datasets.FashionMNIST(root="./data", train=True, transform=trans, download=False)
    mnist_test = torchvision.datasets.FashionMNIST(root="./data", train=False, transform=trans, download=False)
    return mnist_train, mnist_test   

  

$\mathrm{root}$ :下载路径

$\mathrm{train}$ :是否是训练数据

$\mathrm{transform}$: 将数据类型变为 $\mathrm{torch}$

$\mathrm{download}$ 表示是否需要重新下载(如果下载过就记为 $\mathrm{False}$ )

test_data.test_data 是一个 $(10000, 28, 28)$ 的 $\mathrm{tensor}$ 

test_data.test_labels 是测试标签.   

 

Dataloader 打包

train_dataloader = DataLoader(dataset = train_data, batch_size = 4, shuffle=True)  

打包训练数据,其中 $\mathrm{batch_size}$ 是每次训练时塞入的训练数据个数.  

默认一次遍历是要把全部数据遍历完的(即 15000 批次,每批次 3 个)  

 

使用 GPU 训练

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
net.apply(init_weights) 
net = net.to(device) 

在训练时会使用的矩阵后面加上 $\mathrm{.to(device)}$ 即可.  

 

完整代码

import torch  
from torch import nn   
import d2l  
import torchvision 
from torchvision import transforms
from torch.utils.data import DataLoader

def gener():  
    trans = transforms.ToTensor()     
    mnist_train = torchvision.datasets.FashionMNIST(root="./data", train=True, transform=trans, download=False)
    mnist_test = torchvision.datasets.FashionMNIST(root="./data", train=False, transform=trans, download=False)
    return mnist_train, mnist_test   

def init_weights(m):   
    if type(m) == nn.Linear or type(m) == nn.Conv2d:  
        nn.init.xavier_uniform_(m.weight)   

# LeNet  
net = nn.Sequential(
    nn.Conv2d(in_channels = 1, out_channels = 6, kernel_size = 5, padding = 2), 
    nn.ReLU(),  
    nn.MaxPool2d(kernel_size = 2, stride = 2),

    nn.Conv2d(in_channels = 6, out_channels = 16, kernel_size = 5), 
    nn.ReLU(), 
    nn.MaxPool2d(kernel_size = 2, stride = 2),  

    nn.Flatten(),  

    nn.Linear(16 * 5 * 5, 120),  
    nn.ReLU(),

    nn.Linear(120, 84),   
    nn.ReLU(), 

    nn.Linear(84, 10)  
)

# 获取 fashion - mnist 数据集    

# 训练数据已经自动归一到 (0,1) 区间了.    
train_data, test_data = gener()  
train_dataloader = DataLoader(dataset = train_data, batch_size = 4, shuffle=True)    

test_x = torch.unsqueeze(test_data.test_data, dim = 1).type(torch.FloatTensor)[:2000] / 255.0
test_y = test_data.test_labels[:2000]       

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
net.apply(init_weights) 
net = net.to(device)   

loss_func = nn.CrossEntropyLoss()  
optimizer = torch.optim.SGD(net.parameters(), lr = 0.0075)  
epoch = 2

for st in range(epoch):  
    for i, batch_sample in enumerate(train_dataloader):  
        train_x = batch_sample[0].to(device) 
        label = batch_sample[1].to(device)   

        optimizer.zero_grad()   
        output = net(train_x)  
        loss = loss_func(output, label)     
        loss.backward()  
        optimizer.step()      
        if i % 2000 == 0:  
            print(epoch + 1, i + 1, loss.item())
        if i > 6000:   
            break  
  
test_x = test_x.to(device)  
test_y = test_y.to(device)  
y_hat = net(test_x)  
pred_y = torch.max(y_hat, 1)[1].data.squeeze()
  
print((1000 - (test_y[:1000] != pred_y[:1000]).int().sum()) / 10)  

  

 

标签:nn,卷积,torch,test,神经网络,train,CNN,data,mathrm
来源: https://www.cnblogs.com/brady12/p/16110626.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有