CNN应用demo

CNN实现简单的手写数字识别

import torch
import torch.nn.functional as F
from torchvision import datasets,transforms
from tqdm import tqdm
torch.zeros(8)
def relu(x):
return torch.clamp(x,min=0) def linear(x,weight,bias):
out = torch.matmul(x,weight) + bias.view(1,-1)
return out def model(x,params):
x = F.conv2d(x,params[0],params[1],2,0)
x = relu(x)
x = F.conv2d(x,params[2],params[3],2,0)
x = relu(x)
x = x.view(-1,200)
x = linear(x,params[4],params[5])
return x init_std = 0.1
params = [
torch.randn(4,1,5,5) * init_std,
torch.zeros(4),
torch.randn(8,4,3,3) * init_std,
torch.zeros(8),
torch.randn(200,10) * init_std,
torch.zeros(10)
]
for p in params:
p.requires_grad = True TRAIN_BATCH_SIZE = 100
TEST_BATCH_SIZE = 100
train_loader = torch.utils.data.DataLoader(
datasets.MNIST(
'/data',train=True,download=True,
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,),(0.3080,))
])
),
batch_size = TRAIN_BATCH_SIZE,shuffle=True
)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST(
'/data',train=False,
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,),(0.3080,))
])
),
batch_size = TEST_BATCH_SIZE,shuffle=False
) LR = 0.1
EPOCH = 100
LOG_INTERVAL = 100 for epoch in range(EPOCH):
for idx,(data,label) in enumerate(train_loader):
output = model(data,params)
loss = F.cross_entropy(output,label)
for p in params:
if p.grad is not None:
p.grad.zero_()
loss.backward() for p in params:
p.data = p.data - LR*p.grad.data if idx % LOG_INTERVAL == 0:
print('Epoch %03d [%03d/%03d]\tLoss:%.4f' % (epoch,idx,len(train_loader),loss.item())) correct_num = 0
total_num = 0
with torch.no_grad():
for data,label in test_loader:
output = model(data,params)
pred = output.max(1)[1]
correct_num += (pred==label).sum().item()
total_num += len(data)
acc = correct_num/total_num
print('...Testing @ Epoch %03d\tAcc: %.4f' % (epoch,acc))
Epoch 000 [000/600]	Loss:2.3304
...Testing @ Epoch 000 Acc: 0.1093
...Testing @ Epoch 000 Acc: 0.1265
...Testing @ Epoch 000 Acc: 0.1392
...Testing @ Epoch 000 Acc: 0.1547
...Testing @ Epoch 000 Acc: 0.1753
...Testing @ Epoch 000 Acc: 0.1978
...Testing @ Epoch 000 Acc: 0.2243
...Testing @ Epoch 000 Acc: 0.2482
...Testing @ Epoch 000 Acc: 0.2802
...Testing @ Epoch 000 Acc: 0.3076
...Testing @ Epoch 000 Acc: 0.3206
...Testing @ Epoch 000 Acc: 0.3458
...Testing @ Epoch 000 Acc: 0.3649
...Testing @ Epoch 000 Acc: 0.4057
...Testing @ Epoch 000 Acc: 0.4618
...Testing @ Epoch 000 Acc: 0.4657
...Testing @ Epoch 000 Acc: 0.4729
...Testing @ Epoch 000 Acc: 0.5428
...Testing @ Epoch 000 Acc: 0.5659
...Testing @ Epoch 000 Acc: 0.5371
...Testing @ Epoch 000 Acc: 0.5344
...Testing @ Epoch 000 Acc: 0.5585
...Testing @ Epoch 000 Acc: 0.4423
...Testing @ Epoch 000 Acc: 0.6185
...
...Testing @ Epoch 000 Acc: 0.8701
...Testing @ Epoch 000 Acc: 0.8501
...Testing @ Epoch 000 Acc: 0.8750
...Testing @ Epoch 000 Acc: 0.8729

可以用GPU训练优化后的代码

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import DataLoader
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from tqdm import tqdm
class CNN(nn.Module):
def __init__(self,in_channels=1,num_classes=10):
super().__init__()
self.conv1 = nn.Conv2d(in_channels=1,out_channels=8,kernel_size=(3,3),stride=(1,1),padding=(1,1))
self.pool = nn.MaxPool2d(kernel_size=(2,2),stride=(2,2))
self.conv2 = nn.Conv2d(in_channels=8,out_channels=16,kernel_size=(3,3),stride=(1,1),padding=(1,1))
self.fc1 = nn.Linear(16*7*7,num_classes)
def forward(self,x):
x = F.relu(self.conv1(x))
x = self.pool(x)
x = F.relu(self.conv2(x))
x = self.pool(x)
x = x.reshape(x.shape[0],-1)
x = self.fc1(x)
return x # Set device
device = torch.device("cuda"if torch.cuda.is_available() else "cpu")
print(device)
# Hyperparameters
in_channels = 1
num_classes = 10
learning_rate = 0.001
batch_size = 64
num_epochs = 5 # Load Data
train_dataset = datasets.MNIST(root="dataset/",train=True,transform=transforms.ToTensor(),download=True)
train_loader = DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True) test_dataset = datasets.MNIST(root="dataset/",train=False,transform=transforms.ToTensor(),download=True)
test_loader = DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True) # Initialize network
model = CNN().to(device) # Loss and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(),lr=learning_rate) # Train Network for epoch in range(num_epochs):
# for data,targets in tqdm(train_loadr,leave=False) # 进度显示在一行
for data,targets in tqdm(train_loader):
# Get data to cuda if possible
data = data.to(device=device)
targets = targets.to(device=device) # forward
scores = model(data)
loss = criterion(scores,targets) # backward
optimizer.zero_grad()
loss.backward() # gardient descent or adam step
optimizer.step()

动手学深度学习——CNN应用demo的更多相关文章

  1. 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

    随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...

  2. 【动手学深度学习】Jupyter notebook中 import mxnet出错

    问题描述 打开d2l-zh目录,使用jupyter notebook打开文件运行,import mxnet 出现无法导入mxnet模块的问题, 但是命令行运行是可以导入mxnet模块的. 原因: 激活 ...

  3. 小白学习之pytorch框架(2)-动手学深度学习(begin-random.shuffle()、torch.index_select()、nn.Module、nn.Sequential())

    在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比 ...

  4. 动手学深度学习14- pytorch Dropout 实现与原理

    方法 从零开始实现 定义模型参数 网络 评估函数 优化方法 定义损失函数 数据提取与训练评估 pytorch简洁实现 小结 针对深度学习中的过拟合问题,通常使用丢弃法(dropout),丢弃法有很多的 ...

  5. 动手学深度学习9-多层感知机pytorch

    多层感知机 隐藏层 激活函数 小结 多层感知机 之前已经介绍过了线性回归和softmax回归在内的单层神经网络,然后深度学习主要学习多层模型,后续将以多层感知机(multilayer percetro ...

  6. 动手学深度学习6-认识Fashion_MNIST图像数据集

    获取数据集 读取小批量样本 小结 本节将使用torchvision包,它是服务于pytorch深度学习框架的,主要用来构建计算机视觉模型. torchvision主要由以下几个部分构成: torchv ...

  7. 动手学深度学习1- pytorch初学

    pytorch 初学 Tensors 创建空的tensor 创建随机的一个随机数矩阵 创建0元素的矩阵 直接从已经数据创建tensor 创建新的矩阵 计算操作 加法操作 转化形状 tensor 与nu ...

  8. 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型

    目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...

  9. mxnet 动手学深度学习

    http://zh.gluon.ai/chapter_crashcourse/introduction.html 强化学习(Reinforcement Learning) 如果你真的有兴趣用机器学习开 ...

  10. 动手学深度学习17-kaggle竞赛实践小项目房价预测

    kaggle竞赛 获取和读取数据集 数据预处理 找出所有数值型的特征,然后标准化 处理离散值特征 转化为DNArray后续训练 训练模型 k折交叉验证 预测样本,并提交结果 kaggle竞赛 本节将动 ...

随机推荐

  1. C语言:send + more = money,单词相加求解字母数字谜问题

    我用的是穷举法,虽然有点笨,但是在想不到其他更好的方法对我而言就是穷举法. 有程序员大大想到其他方法也可以私信我一起探讨一下~ #include<stdio.h> int main() { ...

  2. AIRIOT物联网低代码平台如何配置OPC UA驱动?

    AIRIOT物联网低代码平台支持驱动类型丰富,驱动包括但不限于通用驱动信息,无线驱动信息,行业驱动信息及各个厂商驱动.驱动稳定性强,经受住各个大型项目考验,持续稳定运行. AIRIOT物联网低代码平台 ...

  3. 基于webapi的websocket聊天室(三)

    上一篇处理了超长消息的问题.我们的应用到目前为止还是单聊天室,这一篇就要处理的多聊天室的问题. 思路 第一个问题,怎么访问不同聊天室 这个可以采用路由参数来解决.我把路由设计成这样/chat/{roo ...

  4. Expander展开收缩动画

    这个问题困扰了我一天,最后下了个MaterialDesign的demo,看了下他的源码,才恍然大悟,原来很简单. 我原来的设想是在expander的ControlTemplate设置触发器,在IsEx ...

  5. Linux之命令提示符的颜色设置

    1.临时设置 执行下面的命令: export PS1="[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\] \[\e[31;1m\]\w\[\e ...

  6. redis 使用lua脚本 一次性获取多个hash key 字段值

    客户端命令行代码: eval "local rst={};local field='schoolid'; for i,v in pairs(KEYS) do rst[i]=redis.cal ...

  7. 分布式缓存NewLife.Redis

    NewLife.Redis 是一个Redis客户端组件,以高性能处理大数据实时计算为目标. Redis协议基础实现位于Redis/RedisClient,FullRedis为扩展实现,主要增加列表结构 ...

  8. GK2023游记

    不会有人高考之后二十多天才更博客吧...(写的很烂,单纯想补个坑) 大概就是写一下纯 whk 的高三生活,是不是流水账无所谓,就算当个记录了 高三生活开头就不太平,高三的班主任和高二一样(姑且叫他 田 ...

  9. Python爬虫 | 批量爬取今日头条街拍美图

    01 前言 上篇文章我们爬取了今日头条街拍美图,心情相当愉悦,今天这篇文章我们使用Selenium来爬取当当网的畅销图书排行.正所谓书中自有黄金屋,书中自有颜如玉,我们通过读书学习来提高自身的才华,自 ...

  10. 赛博斗地主——使用大语言模型扮演Agent智能体玩牌类游戏。

    通过大模型来实现多个智能体进行游戏对局这个想对已经比较成熟了无论是去年惊艳的斯坦福小镇还是比如metaGPT或者类似的框架都是使用智能体技术让大模型来操控,从而让大模型跳出自身"预测下一个t ...