动手学深度学习——CNN应用demo
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的更多相关文章
- 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF
随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...
- 【动手学深度学习】Jupyter notebook中 import mxnet出错
问题描述 打开d2l-zh目录,使用jupyter notebook打开文件运行,import mxnet 出现无法导入mxnet模块的问题, 但是命令行运行是可以导入mxnet模块的. 原因: 激活 ...
- 小白学习之pytorch框架(2)-动手学深度学习(begin-random.shuffle()、torch.index_select()、nn.Module、nn.Sequential())
在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比 ...
- 动手学深度学习14- pytorch Dropout 实现与原理
方法 从零开始实现 定义模型参数 网络 评估函数 优化方法 定义损失函数 数据提取与训练评估 pytorch简洁实现 小结 针对深度学习中的过拟合问题,通常使用丢弃法(dropout),丢弃法有很多的 ...
- 动手学深度学习9-多层感知机pytorch
多层感知机 隐藏层 激活函数 小结 多层感知机 之前已经介绍过了线性回归和softmax回归在内的单层神经网络,然后深度学习主要学习多层模型,后续将以多层感知机(multilayer percetro ...
- 动手学深度学习6-认识Fashion_MNIST图像数据集
获取数据集 读取小批量样本 小结 本节将使用torchvision包,它是服务于pytorch深度学习框架的,主要用来构建计算机视觉模型. torchvision主要由以下几个部分构成: torchv ...
- 动手学深度学习1- pytorch初学
pytorch 初学 Tensors 创建空的tensor 创建随机的一个随机数矩阵 创建0元素的矩阵 直接从已经数据创建tensor 创建新的矩阵 计算操作 加法操作 转化形状 tensor 与nu ...
- 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型
目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...
- mxnet 动手学深度学习
http://zh.gluon.ai/chapter_crashcourse/introduction.html 强化学习(Reinforcement Learning) 如果你真的有兴趣用机器学习开 ...
- 动手学深度学习17-kaggle竞赛实践小项目房价预测
kaggle竞赛 获取和读取数据集 数据预处理 找出所有数值型的特征,然后标准化 处理离散值特征 转化为DNArray后续训练 训练模型 k折交叉验证 预测样本,并提交结果 kaggle竞赛 本节将动 ...
随机推荐
- postgresql 去重&查最新一组记录 关键词partition by
- Splashtop远程桌面再次增强:支持4K视频流
远程桌面工具,主流的有10款总有,国内用的比较多的有teamviewer.Splashtop.向日葵等.几款软件各有千秋,其中Splashtop最大的特性就是快速.流畅.产品无敌,运营佛系,哈哈.下面 ...
- ETSI GS MEC 015,MEP 带宽管理 API
目录 文章目录 目录 版本 ETSI MEC 对 MEP 带宽管理功能的定义 功能理解 Bandwidth Management Service BWMS UML ME APP registers t ...
- 4G EPS 中的随机接入
目录 文章目录 目录 前文列表 UE 的随机接入 基于竞争的随机接入流程 基于非竞争的随机接入流程 PRACH(物理随机接入信道) 上行 TA(时间提前量) 前文列表 <4G EPS 中的小区搜 ...
- 超详细!深入分析PPTP虚拟专用网搭建与抓包
PPTP虚拟专用网搭建与抓包分析实验 实验目的:掌握PPP协议VPN的搭建,通过分析pptp建立,理解chap连接建立的过程 实验过程: 环境搭建 Windows 11系统 VMware虚拟机.kal ...
- Inno Setup Dependency Installer 安装包 运行环境安装
Download and install any dependency such as .NET, Visual C++ or SQL Server during your application's ...
- Kubernetes1.16安装[kubadm方式]
Kubernetes 安装手册(非高可用版) 集群信息 1. 节点规划 部署k8s集群的节点按照用途可以划分为如下2类角色: master:集群的master节点,集群的初始化节点,基础配置不低于2C ...
- 拼多多面试:Netty如何解决粘包问题?
粘包和拆包问题也叫做粘包和半包问题,它是指在数据传输时,接收方未能正常读取到一条完整数据的情况(只读取了部分数据,或多读取到了另一条数据的情况)就叫做粘包或拆包问题. 从严格意义上来说,粘包问题和拆包 ...
- mybatis Selective动态判断属性值新增或修改操作,batch批量操作
mybatis Selective动态判断属性值新增或修改操作,batch批量操作 mybatis insert foreach批量添加https://www.cnblogs.com/oktokeep ...
- java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ pack ...