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. EDA 事件驱动架构与 EventBridge 二三事

    ​简介: 事件驱动型架构 (EDA) 方兴未艾,作为一种 Serverless 化的应用概念对云原生架构具有着深远影响.当我们讨论到一个具体架构时,首当其冲的是它的发展是否具有技术先进性.这里从我们熟 ...

  2. DataWorks 功能实践速览

    ​简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 功能推荐:独享数据集成资源组 如上期数据同步解决方案介绍,数据集成的批数据同步任务运行时,需要占用一定 ...

  3. 修复 WPF 安装 WindowsAppSDK 库构建失败 NETSDK1082 和 NETSDK1112 找不到 win10-arm 失败

    通过在 WPF 项目上安装 WindowsAppSDK 库,可以让 WPF 使用上 Win10 及以上版本提供的 Windows Runtime 强大的 API 集和使用上更多的黑科技.本文记录在安装 ...

  4. K8s控制器---Replicaset(7)

    一.Replicaset(目前少用了) 1.1 控制器管理pod 什么是控制器?前面我们学习了 Pod,那我们在定义 pod 资源时,可以直接创建一个 kind:Pod 类型的自主式 pod,但是这存 ...

  5. vue使用vant的van-tabs+tag在选项卡展示该内容有几条的提示

    1.直接写用v-if判断下标展示,会滚动.pass! 2.定位,各种定位,相对各种父元素各种定位,还是会滚,因为tab内容一定滚动,pass 3.手写选项卡+v-if判断,这肯定可行,但本着能用ui组 ...

  6. VMware Workstation Pro各版本下载链接汇总(特全!!!)

    VMware Workstation Pro各版本下载链接汇总 (10.11.12.14.15.16官网全版本) 整理不易,点赞关注一下吧 工具软件:VMware Workstation Pro 1. ...

  7. 02 python爬虫-bs4

    目录 步骤 代码 结果 new.csv 图片 步骤 爬取主页面中的文章详情的url和图片地址 下载图片 并请求加文章详情中的页面内容 爬取文章详情中的标题.作者.发布时间 代码 import requ ...

  8. elementui 时间戳和后台配合

    保存时间 思路: 前端传时间戳, 后台表里的时间类型为timestamp, model结构体tag设置为 *time.Time json:"activationTime" gorm ...

  9. Linux中的man page指令

    以Linux上的date命令为例,在控制台输入 man date,将会展示如下界面: [vbird@www ~]$ man date DATE(1) User Commands DATE(1) # 请 ...

  10. tarjan板子整理

    缩点 stack<int>q; void tarjan(int u) { pre[u]=low[u]=++cnt; q.push(u); vis[u]=1; for(int i=head[ ...