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的更多相关文章

  1. JPEG Image Super-Resolution via Deep Residual Network

    基于深度残差网络的JPEG图像超分辨率 JPEG Image Super-Resolution via Deep Residual Network PDF https://www.researchga ...

  2. CNN(Convolutional Neural Network)

    CNN(Convolutional Neural Network) 卷积神经网络(简称CNN)最早可以追溯到20世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究表明,大脑对外界获取的信息由多层的 ...

  3. 残差网络(Residual Network)

    一.背景 1)梯度消失问题 我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新. 可以看到,假设现在需要更 ...

  4. 关于深度残差网络(Deep residual network, ResNet)

    题外话: From <白话深度学习与TensorFlow> 深度残差网络: 深度残差网络的设计就是为了克服这种由于网络深度加深而产生的学习效率变低,准确率无法有效提升的问题(也称为网络退化 ...

  5. 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 ...

  6. CNN结构:场景分割与Relation Network

    参考第一个回答:如何评价DeepMind最新提出的RelationNetWork 参考链接:Relation Network笔记  ,暂时还没有应用到场景中 LiFeifei阿姨的课程:CV与ML课程 ...

  7. AndrewNG Deep learning课程笔记 - CNN

    参考, An Intuitive Explanation of Convolutional Neural Networks http://www.hackcv.com/index.php/archiv ...

  8. 详解卷积神经网络(CNN)

    详解卷积神经网络(CNN) 详解卷积神经网络CNN 概揽 Layers used to build ConvNets 卷积层Convolutional layer 池化层Pooling Layer 全 ...

  9. 【CV知识学习】神经网络梯度与归一化问题总结+highway network、ResNet的思考

    这是一篇水货写的笔记,希望路过的大牛可以指出其中的错误,带蒟蒻飞啊~ 一.    梯度消失/梯度爆炸的问题 首先来说说梯度消失问题产生的原因吧,虽然是已经被各大牛说烂的东西.不如先看一个简单的网络结构 ...

  10. paper 162:卷积神经网络(CNN)解析

    卷积神经网络(CNN)解析: 卷积神经网络CNN解析 概揽 Layers used to build ConvNets 卷积层Convolutional layer 池化层Pooling Layer ...

随机推荐

  1. [GPT] 序列模型分类及其模型方案选择

      序列模型可以分为两大类:线性序列模型和非线性序列模型. 线性序列模型:这类模型基于线性关系对时间序列进行建模和预测.常见的线性序列模型包括自回归模型(AR).移动平均模型(MA)和自回归移动平均模 ...

  2. [FAQ] PHP+Nginx 架构网站 502 和 504 问题

    502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应.504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时 ...

  3. WPF 获取全局所有窗口的创建显示事件 监控窗口打开

    本文将告诉大家如何在 WPF 里面进行全局监控任意的窗口创建显示打开,可以获取到每个 WPF 窗口的打开的时机.如此可以用来辅助定位问题和输出日志 这篇博客是有背景的,老司机告诉我说他的应用不响应鼠标 ...

  4. 大模型_2.2:Prompt示例

    1.行业洞察分析 行业洞察分析的方法论:使用麦肯锡工作法可以快速了解一个行业. Step1:通过搜索分析几十个与该行业相关的关键词,覆盖该行业的上下游,以获取全面的信息. Step2:阅读一些行业最新 ...

  5. 【web安全】隐藏nginx头文件信息

    摘要 Nginx作为开源web中间件,被广泛应用.因此源编译或者yum安装,都会带有其原有的nginx版本.很容易被针对,因此,通过修改nginx的源码.隐藏nginx版本和头部信息,保障nginx的 ...

  6. Javascript返回顶部和砸金蛋,跑马灯等游戏代码实现

    1. 我们经常写页面的时候会遇到页面很长需要做返回顶部的操作:$("id /class").animate({scrollTop:$('.class').offset().top} ...

  7. addEventListener添加事件监听

    removeEventListener移除事件监听 window.addEventListener('mousedown', e => this.closeMenu(e)) window.add ...

  8. 让AnaTraf成为您网络流量分析的最佳利器

    在快速发展的数字时代,企业对网络性能的监测与分析需求愈加旺盛.作为网络性能监测与诊断(NPMD)领域的佼佼者,AnaTraf网络流量分析仪凭借其出色的性能和易用性,正成为网络管理人员的首选工具. An ...

  9. 关于浏览器sessionStorage共享问题

    今天也是闲暇之余看了点前端基础知识发现了好玩的 window.open("同源页面")这种方式新开的页面会复制之前的sessionStorage 通过a标签新开的页面同样也会,原理 ...

  10. Sphinx 自动化文档

    目录 文章目录 目录 Sphinx 入门 reStructuredText 语法格式 标题.列表.正文.要点 表格 代码块 引用其他模块文件 引用静态图片 Sphinx Sphinx 是一个工具,它使 ...