动手学深度学习——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竞赛 本节将动 ...
随机推荐
- MQTT 实践总结
QMQX 文档:https://www.emqx.io/docs/zh/latest/ MQTT 入门:https://www.emqx.com/zh/mqtt-guide 通过案例理解 MQTT 主 ...
- HTML——table表格标签
一.table表格的完整写法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 7z 命令行压缩解压详解-中文版
1) 简介 7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压软件. 主页:http://www.7-zip.org/ 中文主页:http://7z.sparanoid.com ...
- Swift 模式下面LLDB 输出对象
(lldb) expr -l Swift -- import UIKit (lldb) expr -l Swift -- let $pin = unsafeBitCast(0x7f81c8d459f0 ...
- AutoLayout与UIbutton
1.UIButton贴近右边,高度固定,宽度跟随标题变化 class TestButton: UIButton { } class ViewController: UIViewController { ...
- Python缺失值处理实现
在数据处理相关工作中,读取的数据中常常会有缺失值的情况,为顺利进行后续的操作,需要首先对缺失值进行处理,处理的方式一般为删除或填充,Python中提供了专门的工具包,可以方便地进行实现.读取操作可 ...
- Nacos 源码环境搭建
最近在学习nacos,通过调式源码查看服务注册和发现流程和原理,本地部署naos源码需要一定的步骤,本文主要做nacos源码部署. nacos版本:2.1.1 下载源码 从github上下载源码到本地 ...
- Centos Stream 10 测试版下载:未来的RHEL10&Rocky Linux 10
简介 最近发现Centos最放出了Stream 10 测试版本,应该是基于Fedora 40构建的.未来红帽会基于此版本构建RHEL 10. 内核版本:6.9.0 Python版本:3.12.2 RH ...
- linux,curl命令发送各类请求详解
当你经常面对api时,curl将是你重要学习的工具,因为curl可以让你不需要浏览器也能作为Http客户端发送请求.而且它是跨平台的,Linux.Windows.Mac都会执行的很好. 一.curl ...
- C#.NET HTTPS 双向证书 请求被中止: 未能创建 SSL/TLS 安全通道。
请求被中止: 未能创建 SSL/TLS 安全通道. 用mmc 给私钥证书添加Everyone 的权限.