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. 所有前端都要看的2D游戏化互动入门基础知识

    简介: 在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用 本文作者:淘系前端团队-Eva.js作者-明非 背景 现在越来越多的公司和 App 开始使用游戏化的方式去做产品了,所 ...

  2. [FAQ] Mac Mini 怎么让主机不休眠

    Mac Mini 的防止休眠设置,在首选项,显示器里. 显示器里找到高级按钮. 然后有个开关是:显示器关闭时,防止自动进入睡眠.打开这个开关即可防止自动睡眠. Link:https://www.cnb ...

  3. [Cryptocurrency] rDAI 与 DAI 的区别, 如何质押 rDAI 获取利息

    以下合约操作需要在安装 MetaMask ( 以太坊的浏览器钱包 ) 的情况下进行. rDAI 通过和 DAI  1 : 1 互换得到,在 rDAI 提供的 dapp 上面操作 https://app ...

  4. Lua 学习笔记(自用)

    Lua 学习笔记 1 语言基础 运行方式类似Python,可以直接在交互行运行,也可以通过解释器运行某个脚本.也可以在交互行运行某个lua脚本 dofile("hello.lua" ...

  5. 题解:CF1941G Rudolf and Subway

    原题链接 简化题意 一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从 \(b\) 到 \(e\) 最短需要经过几种颜色 思路 考虑因为同种颜色联通,可直接在读入的时候开两个 vector ...

  6. Swift中的Tuple类型

    Swift中的Tuple类型可以包含任何值,并且这些值的类型可以互相不一样.Tuple本身比较简单,需要记得也就是访问Tuple的方式. 使用变量名访问 let http404Error = (404 ...

  7. Python函数与模块的精髓与高级特性

    本文分享自华为云社区<Python函数与模块的精髓与高级特性>,作者:柠檬味拥抱. Python 是一种功能强大的编程语言,拥有丰富的函数和模块,使得开发者能够轻松地构建复杂的应用程序.本 ...

  8. lodash已死?Radash库方法介绍及源码解析 —— 异步方法篇

    写在前面 tips:点赞 + 收藏 = 学会! 我们前面已经介绍了 radash 的相关信息和所有 Array 相关方法,详情可前往主页查看. 本篇我们继续介绍radash中异步相关的方法. 所有方法 ...

  9. c 语言不输出空数据 (全面覆盖)

    目录 去除空值的专栏 解决方案 一.通过数组的自身性质,让其值大于零 1. short 数组测试 2. int 数组测试 3. long 数组测试 4. float 数组测试 5. float 数组测 ...

  10. Python 数据降级(重采样)

    在数据处理中,经常有高频数据转成低频,秒级数据转成分钟.小时数据等.我们将讨论以下方法: 使用 Pandas 的 resample 方法: 示例:将天数据转化成月数据. 代码示例: import pa ...