说明 0、前一部分叫做Feature Extraction,后一部分叫做classification

1、每一个卷积核它的通道数量要求和输入通道是一样的。这种卷积核的总数有多少个和你输出通道的数量是一样的。

2、卷积(convolution)后,C(Channels)变,W(width)和H(Height)可变可不变,取决于是否padding。subsampling(或pooling)后,C不变,W和H变。

3、卷积层:保留图像的空间信息。

4、卷积层要求输入输出是四维张量(B,C,W,H),全连接层的输入与输出都是二维张量(B,Input_feature)。

传送门 PyTorch的nn.Linear()详解

5、卷积(线性变换),激活函数(非线性变换),池化;这个过程若干次后,view打平,进入全连接层~


1. 卷积操作

import torch
# 定义输入、输出通道
in_channels, out_channels = 5, 10
# 定义图像尺寸
width, height = 100, 100
# 定义卷积核的大小,下式表示大小为3*3的正方形,同时,卷积核的通道数与输入图像的通道数一致,均为5
kernel_size = 3
# 定义一次输入图像的数量
batch_size = 1input = torch.randn(batch_size,in_channels,width,height)# out_channels 决定了卷积核的数量, 即一共有10个3*3*5的卷积核
conv_layer = torch.nn.Conv2d(in_channels,out_channels,kernel_size=kernel_size)
output = conv_layer(input)print(input.shape)
print(output.shape)
print(conv_layer.weight.shape)

输出:

torch.Size([1, 5, 100, 100])
torch.Size([1, 10, 98, 98])
torch.Size([10, 5, 3, 3])

有时,我们希望获得与原图像相同大小的卷积后的图像,这时需要属性padding,默认为0

conv_layer_with_padding = torch.nn.Conv2d(in_channels,out_channels,padding=1,kernel_size = kernel_size)
output_with_padding = conv_layer_with_padding(input)
print(output_with_padding.shape)

输出:

torch.Size([1, 10, 100, 100])

还有时,我们希望再次降低网络的大小,以降低运算量。此时引入卷积核移动步长stride的概念,默认为1

conv_layer_with_stride = torch.nn.Conv2d(in_channels,out_channels,stride=2,kernel_size=kernel_size)output_with_stride = conv_layer_with_stride(input)
print(output_with_stride.shape)

输出:

torch.Size([1, 10, 49, 49])

2. 下采样

下采样与卷积无本质区别,不同的在于目的。下采样的目的是将数据维度再次减少。
最常用的下采样手段是Max Pooling 最大池化。

input = [3,4,6,5,2,4,6,8,1,6,7,8,9,7,4,6,
]
input = torch.Tensor(input).view(1,1,4,4)
maxpooling_layer = torch.nn.MaxPool2d(kernel_size=2)
# 注意,我们将kernel_size设为2,此时stride默认也为2output = maxpooling_layer(input)
print(output)

输出:

tensor([[[[4., 8.],[9., 8.]]]])

3. 卷积神经基础代码

代码说明:

1、torch.nn.Conv2d(1,10,kernel_size=3,stride=2,bias=False)

1是指输入的Channel,灰色图像是1维的;10是指输出的Channel,也可以说第一个卷积层需要10个卷积核;kernel_size=3,卷积核大小是3x3;stride=2进行卷积运算时的步长,默认为1;bias=False卷积运算是否需要偏置bias,默认为False。padding = 0,卷积操作是否补0。

2、self.fc = torch.nn.Linear(320, 10),这个320获取的方式,可以通过x = x.view(batch_size, -1)

# print(x.shape)可得到(64,320),64指的是batch,320就是指要进行全连接操作时,输入的特征维度。

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt# prepare datasetbatch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True,download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False,download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)# design model using classclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)self.pooling = torch.nn.MaxPool2d(2)self.fc = torch.nn.Linear(320, 10)def forward(self, x):# flatten data from (n,1,28,28) to (n, 784)batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x = F.relu(self.pooling(self.conv2(x)))x = x.view(batch_size, -1)  # -1 此处自动算出的是320# print("x.shape",x.shape)x = self.fc(x)return xmodel = Net()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)# construct loss and optimizer
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)# training cycle forward, backward, update
def train(epoch):running_loss = 0.0for batch_idx, data in enumerate(train_loader, 0):inputs, target = datainputs, target = inputs.to(device), target.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, target)loss.backward()optimizer.step()running_loss += loss.item()if batch_idx % 300 == 299:print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))running_loss = 0.0def test():correct = 0total = 0with torch.no_grad():for data in test_loader:images, labels = dataimages, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, dim=1)total += labels.size(0)correct += (predicted == labels).sum().item()print('accuracy on test set: %d %% ' % (100 * correct / total))return correct / totalif __name__ == '__main__':epoch_list = []acc_list = []for epoch in range(10):train(epoch)acc = test()epoch_list.append(epoch)acc_list.append(acc)plt.plot(epoch_list, acc_list)plt.ylabel('accuracy')plt.xlabel('epoch')plt.show()

卷积神经网络(基础篇)相关推荐

  1. Pytorch深度学习实践(b站刘二大人)P10讲 (CNN卷积神经网络基础篇)

    1.全连接网络 指的是网络里面用的都是线性层,如果一个网络全都由线性层串行连接起来,就叫做全连接网络 在线性层里面输入和每一个输出值之间都存在权重,即每一个输入节点都要参与到下一层输出节点的计算上,这 ...

  2. 霹雳巴拉卷积神经网络+图像分类篇

    up给的教程路线:图像分类→目标检测→-一步步学习用pytorch实现深度学习在cv上的应用,并做笔记整理和总结. 参考内容来自: up主的b站链接:https://space.bilibili.co ...

  3. PyTorch 深度学习实践 GPU版本B站 刘二大人第11讲卷积神经网络(高级篇)GPU版本

    第11讲 卷积神经网络(高级篇) GPU版本源代码 原理是基于B站 刘二大人 :传送门PyTorch深度学习实践--卷积神经网络(高级篇) 这篇基于博主错错莫:传送门 深度学习实践 第11讲博文 仅在 ...

  4. CNN卷积神经网络基础

    转自:http://www.sohu.com/a/138403426_470008 卷积神经网络基础 神经网络 先借用 CNTK 的一个例子,来看看如何使用神经网络来进行分类.如果想根据一个人的年龄和 ...

  5. 温州大学《深度学习》课程课件(七、卷积神经网络基础)

    这学期我上的另一门课是本科生的<深度学习>,主要用的是吴恩达老师的<深度学习>视频课的内容. 使用教材:吴恩达<深度学习>课程笔记 课外参考书:<深度学习&g ...

  6. 计算机视觉:卷积神经网络基础

    计算机视觉:卷积神经网络基础 计算机视觉概述 计算机视觉的发展历程 卷积神经网络 卷积(Convolution) 卷积计算 填充(padding) 步幅(stride) 感受野(Receptive F ...

  7. 动手学深度学习(PyTorch实现)(六)--卷积神经网络基础

    卷积神经网络基础 1. 二维卷积层 1.1 二维互相关运算 1.2 互相关运算与卷积运算 1.3 特征图与感受野 2. 填充与步幅 2.1 填充 2.2 步幅 3. 多通道 3.1 多输入通道 3.2 ...

  8. pytorch卷积神经网络_知识干货-动手学深度学习(pytorch)-06 卷积神经网络基础

    卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维互相关运 ...

  9. 【AI Studio】飞桨图像分类零基础训练营 - 03 - 卷积神经网络基础

    前言:第三天,老师结合ppt文图详细讲解了线性和卷积网络的构建,由简单到复杂的讲解卷积网络的发展.最后结合几个项目加深理解.愈发感觉老师讲的好了.第二天的课听完后还感觉自己什么都懂了,结果轮到自己动手 ...

最新文章

  1. UIBezierPath路径绘图
  2. Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer
  3. JSP的7个动作include,forward,useBean。。。
  4. C# winfrom 通过代码 删除TableLayoutPanel控件的一行或列
  5. 利用FastJSON 把list和map转换成Json
  6. 使用 PSD Validator 在线校验 PSD 文件的质量
  7. SpringCloud注册中心集群化及如何抗住大型系统的高并发访问
  8. 天涯明月刀微信群服务器名称,微信群名称大全
  9. 20145122《Android开发基础》实验四实验报告
  10. Ubuntu触摸屏校准
  11. EduSoho教育周报(0805-0811)
  12. 2018 Github优秀开源项目整理
  13. linux 服务器运维常用命令
  14. 哈夫曼算法以及求哈夫曼编码
  15. Ubuntu18修改host文件加速访问Github
  16. whistle 的使用
  17. 拼多多买菜进击一线城市:上海开团首日,1公里开出11家自提点
  18. Loadrunner11安装与破解详解 win7
  19. 数字沙盘虚拟电子沙盘开发教程第9课
  20. 实施有效有价值的CI / CD流水线实践分享

热门文章

  1. backtrader期权回测框架
  2. thinkphp如何增加session的过期时间
  3. 启动FastDFS服务,使用python客户端对接fastdfs完成上传测试
  4. python 第三方模块之 APScheduler - 定时任务
  5. modbus从站模拟软件_作为工控电气人,你知道我们必备的软件有哪些吗?
  6. 【Python基础入门系列】第03天:Python 变量与数据类型
  7. qtableview点击行将整行数据传过去_可以实时获取数据的Database Asset插件
  8. 双目视觉几何框架详解(玉米专栏8篇汇总)
  9. mysql的char和varchar_MySQL的char和varchar
  10. Linux下C语言程序的内存布局