CNN -- Simple Residual Network
Smiling & Weeping
---- 我爱你,从这里一直到月亮,再绕回来
说明:
1.要解决的问题:梯度消失
2. 跳连接,H(x) = F(x)+x,张量维度必须一致,加完后再激活。不要做pooling,张量的维度会发生变化

1 # 先是1个卷积层(conv, maxpooling, relu),然后ResidualBlock模块,接下来又是一个卷积层(conv, mp, relu)
2 # 然后residualBlock模块,最后一个全连接层
3
4 import torch
5 import torch.nn as nn
6 from torchvision import transforms
7 from torchvision import datasets
8 from torch.utils.data import DataLoader
9 import torch.nn.functional as F
10 import torch.optim as optim
11 import matplotlib.pyplot as plt
12
13 batch_size = 64
14 # 归一化,均值和方差
15 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
16
17 train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True, download=True, transform=transform)
18 train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
19 test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False, download=True, transform=transform)
20 test_loader = DataLoader(test_dataset, shuffle=True, batch_size=batch_size)
21
22 class ResidualBlock(nn.Module):
23 def __init__(self, channels):
24 super(ResidualBlock, self).__init__()
25 self.channels = channels
26 self.conv1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)
27 self.conv2 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)
28
29 def forward(self, x):
30 y = F.relu(self.conv1(x))
31 y = self.conv2(y)
32 return F.relu(x+y)
33
34 class Net(nn.Module):
35 def __init__(self):
36 super(Net, self).__init__()
37 self.conv1 = nn.Conv2d(1, 16, kernel_size=5)
38 self.conv2 = nn.Conv2d(16, 32, kernel_size=5)
39
40 self.rblock1 = ResidualBlock(16)
41 self.rblock2 = ResidualBlock(32)
42
43 self.mp = nn.MaxPool2d(2)
44 self.fc = nn.Linear(512, 10)
45
46 def forward(self, x):
47 in_size = x.size(0)
48
49 x = self.mp(F.relu(self.conv1(x)))
50 x = self.rblock1(x)
51 x = self.mp(F.relu(self.conv2(x)))
52 x = self.rblock2(x)
53
54 x = x.view(in_size, -1)
55 x = self.fc(x)
56 return x
57
58 model = Net()
59
60 # construct loss and optimizer
61 criterion = torch.nn.CrossEntropyLoss()
62 optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
63
64 device = torch.device('cuda' if torch.cuda.is_available else 'cpu')
65 model.to(device)
66
67 def train(epoch):
68 running_loss = 0.0
69 for batch_idx, data in enumerate(train_loader, 0):
70 inputs, target = data
71 inputs, target = inputs.to(device), target.to(device)
72 optimizer.zero_grad()
73
74 outputs = model(inputs)
75 loss = criterion(outputs, target)
76 loss.backward()
77 optimizer.step()
78
79 running_loss += loss.item()
80 if batch_idx % 300 == 299:
81 print('[%d, %5d] loss: %.3f' % (epoch+1, batch_idx+1, running_loss))
82 running_loss = 0.0
83
84 def test():
85 correct = 0
86 total = 0
87 with torch.no_grad():
88 for data in test_loader:
89 images, labels = data
90 images, labels = images.to(device), labels.to(device)
91
92 outputs = model(images)
93 _, prediction = torch.max(outputs.data, dim=1)
94 total += labels.size(0)
95 correct += (prediction == labels).sum().item()
96 print('accuracy on test set: %d %%' % (100*correct/total))
97 return correct/total
98
99 acc = []
100 epoch_list = []
101 for epoch in range(10):
102 train(epoch)
103 accuracy = test()
104 epoch_list.append(epoch)
105 acc.append(accuracy)
106
107 plt.plot(epoch_list, acc)
108 plt.ylabel('Accuracy')
109 plt.xlabel('epoch')
110 plt.show()
111
112 class DatasetSubmissionMNIST(torch.utils.data.Dataset):
113 def __init__(self, file_path, transform=None):
114 self.data = pd.read_csv(file_path)
115 self.transform = transform
116
117 def __len__(self):
118 return len(self.data)
119
120 def __getitem__(self, index):
121 image = self.data.iloc[index].values.astype(np.uint8).reshape((28, 28, 1))
122
123
124 if self.transform is not None:
125 image = self.transform(image)
126
127 return image
128
129 transform = transforms.Compose([
130 transforms.ToPILImage(),
131 transforms.ToTensor(),
132 transforms.Normalize(mean=(0.5,), std=(0.5,))
133 ])
134
135 submissionset = DatasetSubmissionMNIST('/kaggle/input/digit-recognizer/test.csv', transform=transform)
136 submissionloader = torch.utils.data.DataLoader(submissionset, batch_size=batch_size, shuffle=False)
137
138 submission = [['ImageId', 'Label']]
139
140 with torch.no_grad():
141 model.eval()
142 image_id = 1
143
144 for images in submissionloader:
145 images = images.cuda()
146 log_ps = model(images)
147 ps = torch.exp(log_ps)
148 top_p, top_class = ps.topk(1, dim=1)
149
150 for prediction in top_class:
151 submission.append([image_id, prediction.item()])
152 image_id += 1
153
154 print(len(submission) - 1)
155 import csv
156
157 with open('submission.csv', 'w') as submissionFile:
158 writer = csv.writer(submissionFile)
159 writer.writerows(submission)
160
161 print('Submission Complete!')
162 # submission.to_csv('/kaggle/working/submission.csv', index=False)

现在准确率就很高了
文章到此结束,我们下次再见--<-<-<@
能折磨你的,从来不是别人的绝情,
而是你的心存幻想和期待。
把自己还给自己,把别人还给别人,
让花成花,让树成树。
CNN -- Simple Residual Network的更多相关文章
- JPEG Image Super-Resolution via Deep Residual Network
基于深度残差网络的JPEG图像超分辨率 JPEG Image Super-Resolution via Deep Residual Network PDF https://www.researchga ...
- CNN(Convolutional Neural Network)
CNN(Convolutional Neural Network) 卷积神经网络(简称CNN)最早可以追溯到20世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究表明,大脑对外界获取的信息由多层的 ...
- 残差网络(Residual Network)
一.背景 1)梯度消失问题 我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新. 可以看到,假设现在需要更 ...
- 关于深度残差网络(Deep residual network, ResNet)
题外话: From <白话深度学习与TensorFlow> 深度残差网络: 深度残差网络的设计就是为了克服这种由于网络深度加深而产生的学习效率变低,准确率无法有效提升的问题(也称为网络退化 ...
- CNN卷积神经网络_深度残差网络 ResNet——解决神经网络过深反而引起误差增加的根本问题,Highway NetWork 则允许保留一定比例的原始输入 x。(这种思想在inception模型也有,例如卷积是concat并行,而不是串行)这样前面一层的信息,有一定比例可以不经过矩阵乘法和非线性变换,直接传输到下一层,仿佛一条信息高速公路,因此得名Highway Network
from:https://blog.csdn.net/diamonjoy_zone/article/details/70904212 环境:Win8.1 TensorFlow1.0.1 软件:Anac ...
- CNN结构:场景分割与Relation Network
参考第一个回答:如何评价DeepMind最新提出的RelationNetWork 参考链接:Relation Network笔记 ,暂时还没有应用到场景中 LiFeifei阿姨的课程:CV与ML课程 ...
- AndrewNG Deep learning课程笔记 - CNN
参考, An Intuitive Explanation of Convolutional Neural Networks http://www.hackcv.com/index.php/archiv ...
- 详解卷积神经网络(CNN)
详解卷积神经网络(CNN) 详解卷积神经网络CNN 概揽 Layers used to build ConvNets 卷积层Convolutional layer 池化层Pooling Layer 全 ...
- 【CV知识学习】神经网络梯度与归一化问题总结+highway network、ResNet的思考
这是一篇水货写的笔记,希望路过的大牛可以指出其中的错误,带蒟蒻飞啊~ 一. 梯度消失/梯度爆炸的问题 首先来说说梯度消失问题产生的原因吧,虽然是已经被各大牛说烂的东西.不如先看一个简单的网络结构 ...
- paper 162:卷积神经网络(CNN)解析
卷积神经网络(CNN)解析: 卷积神经网络CNN解析 概揽 Layers used to build ConvNets 卷积层Convolutional layer 池化层Pooling Layer ...
随机推荐
- 基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现
简介:阿里云 EMR OLAP 与 Flink 团队深度合作,支持了 Flink 到 ClickHouse 的 Exactly-Once写入来保证整个实时数仓数据的准确性.本文介绍了基于 EMR O ...
- [Gin] gin-jwt 中间件的请求流程与使用思路
gin-jwt 中间件是对 jwt-go 的封装以适应 gin 框架.gin-jwt 对不同的请求流程有不同的 handler: 登录请求流程 是用 LoginHandler. 需要 jwt 令牌的后 ...
- WPF 使用 Skia 解析绘制 SVG 图片
本文告诉大家如何在 WPF 里面,使用 Skia 解析绘制 SVG 图片.本文也适合控制台使用 SkiaSharp 解析绘制 SVG 图片,本文的 WPF 部分只是在 Skia 绘制完成之后,将 Sk ...
- 全网最详细SpringCloud-高级篇
SpringCloud-高级篇 高级篇包含微服务保护(流量控制,系统保护,熔断降级,服务授权).分布式事务.多级缓存.Redis集群.可靠消息服务 学习安排 技术分类 1.微服务保护 ①初识Senti ...
- vim 使用clang-format 格化C/C++/Java/JavaScript
vim 使用clang-format 格化C/C++/Java/JavaScript 参考信息 官方参考https://clang.llvm.org/docs/ClangFormat.html 安装 ...
- JS基础--JavaScript实例集锦(初学)
1.子节点childNodes: <!DOCTYPE html> <html> <head> <title>childNodes</title&g ...
- 4G EPS 中建立 eNB 与 MME 之间的 S1 连接
目录 文章目录 目录 前文列表 S1 连接 eNB 的 S1 连接 UE 的 S1 连接 前文列表 <4G EPS 中的小区搜索> <4G EPS 中的 PLMN 选择> &l ...
- 二:nacos 的服务注册
一:怎么引用依赖 dependencyManagement:spring cloud alibaba 的版本,由于spring cloud alibaba 还未纳入spring cloud 的主版本管 ...
- Linux进程Fork详解
一. fork函数详解 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- Docker Build Cache 缓存清理
Docker 18.09 引入了 BuildKit ,提升了构建过程的性能.安全.存储管理等能力. docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker ...