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 ...
随机推荐
- [FAQ] dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib
通过 ls -al /usr/local/opt 可以看到 icu4c 链接的不是 libicui18n.64.dylib. 一般是 node 版本问题会出现该提示,通过观察版本大小,决定是升级还是使 ...
- 13.prometheus监控tengine(无用)
一.环境准备 1.1 docker安装tengine带nginx-module-vts模块(二选一) mkdir /data/ -p cd /data/ # 通过git clone下载已经创建好的do ...
- NetCore开发第一步 Log4Net日志引入
1.新建一个带mvc模板的项目: 2.引入Microsoft.Extensions.Logging.Log4Net.AspNetCore包,不要引入错了. 引入后后包的结果如下: 3.Startup类 ...
- linux下的开机启动
使用systemctl命令,systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 据说在CentOS7.0后,不再使用service, ...
- 如何在docker环境下的纯净ubuntu系统中安装最新版nginx
原文件地址: https://www.cnblogs.com/taoshihan/p/11588269.html 视频地址: https://www.bilibili.com/video/av6898 ...
- JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)
运用JS的innerHTML,和for循环实现日历小部件内容和日期的转换. <!DOCTYPE html> <html> <head> <title>日 ...
- 传统css布局方案(position,float,line-height等配合)
一.display display 是 css 布局中很重要的一个属性,它定义了元素生成的显示框类型,常见的几个属性值有:block.inline.inline-block.inherit.none. ...
- 密码学—Kasiski测试法Python程序
Kasiski Kasiski是辅助破解Vigenere的前提工作,Kasiski是猜测加密者使用Vigenere密码体系的密钥的长度,Kasiski只是猜测长度而已,所以说是辅助破解Vigenere ...
- 如何使用 JavaScript 获取当前页面帧率 FPS
可以通过计算每秒 window.requestAnimationFrame 的调用频率来做为 FPS 值.它接收一个回调函数,该回调函数会在浏览器下一次重绘之前执行.所以只要我们循环调用并记录单位时间 ...
- 定了!航天科技AIRIOT 物联网平台新品发布会,6月6日北京见!
AIRIOT新品发布会预告 航天科技定档6月6日举办AIRIOT新品发布会,诚邀大家共同见证4.0版本的创新与赋能! 活动地点:北京雍和航星科技园. 现场参会请通过下方长图二维码进行报名! 亦可预约直 ...