【深度学习】6-4 卷积神经网络 - CNN的实现

news2024/11/15 11:04:49

CNN的实现
在这里插入图片描述
网络的构成是“Convolution - ReLU - Pooling -Affine - ReLU - Affine - Softmax”,我们将它实现为名为 SimpleConvNet的类。
首先来看一下 SimpleConvNet的初始化(init),取下面这些参数。
input_dim——输入数据的维度:(通道,高,长)
conv_param——卷积层的超参数(字典)。字典的关键字如下:
filter_num——滤波器的数量
filter_size——滤波器的大小
stride——步幅
pad——填充
hidden_size——隐藏层(全连接)的神经元数量
output_size——输出层(全连接)的神经元数量
weitght_int_std——初始化时权重的标准差

这里,卷积层的超参数通过名为 conv_param的字典传入。

SimpleConvNet的实现如下:

class SimpleConvNet:
	def __init__(self, input_dim=(1,28,28), conv_param={'filter_num':30, 'filter_size':5,'pad':0, 'stride':1}, hidden_size=100,output_size=10, weight_init_std=0.01):
		filter_num = conv_param['filter_num']
		filter_size = conv_param['filter_size']
		filter_pad = conv_param['filter_pad']
		filter_stride = conv_param['filter_stride']
		input_size = input_dim[1]
		conv_output_size = (input_size - filter_size + 2*filter_pad) / filter_stride +1
		pool_output_size = int(filter_num * (conv_output_size /2) * (conv_output_size/2))

		# 这里将由初始化参数传入的卷积层的超参数从字典中取了出来(以方便后面使用),然后,计算卷积层的输出大小。

		# 接下来是权重参数的初始化部分
		self.params = {}
		self.params['W1'] = weight_init_std * np.random.randn(filter_num, input_dim[0],filter_size, filter_size)
		self.params['b1'] = np.zeros(filter_num)

		self.params['W2'] = weight_init_std * np.random.randn(pool_output_size, hidden_size)
		self.params['b2'] = np.zeros(hidden_size)

		self.params['W3'] = weight_init_std * np.random.randn(hidden_size, output_size)
		self.params['b3'] = np.zeros(output_size)

		# 最后生成必要的层
		self.layers = OrderDict()
		self.layers['Conv1'] = Convolution(self.params['W1'],self.params['b1'],conv_param['stride'],conv_param['pad'])
		self.layers['Relu1']= Relu()
		self.layers['Pool1']= Pooling(poo_h=2,pool_w=2,stride=2)
		self.layers['Affine1'] = Affine(self.params['W2'],self.params['b2'])
		self.layers['Relu2'] = Relu()
		self,layers['Affine2']= Affine(self.params['W3'],self.params['b3'])
		self.last_layer = SoftmaxWithLoss()
		# 从最前面开始按顺序向有序字典(OrderedDict)的layers中添加层。只有最后的SoftmaxWithLoss层被添加到别的变量LastLayer中。

以上就是simpleConvNet的初始化中进行的处理。像这样初始化后,进行推理的predict方法和求损失函数值的 Loss方法就可以像下面这样实现

def predict(self, x):
	for layer in self.layers.values():
		x = layer.forward(x)
	return x

def loss(self, x, t):
	y = self.predict(x)
	return self.lastLayer.forward(y,t)

这里,参数x是输入数据,t是监督标签。用于推理的predict方法从头开始依次调用已添加的层,并将结果传递给下一层。

在求损失函数的loss方法中,除了使用predict方法进行的forward处理之外,还会继续进行forward处理,直到到达最后的SoftmaxwithLoss层

下面是基于误差反向传播法求梯度的代码实现

def gradient(self,x,t):
	#forward
	self.loss(x,t)
	#backward
	dout = 1
	dout = self.lastLayer.backward(dout)
	
	layers = list(self.layers.values())
	layers.reverse()
	for layer in layers:
		dout = layer.backward(dout)
	# 设定
	grads={}
	grads['W1'] = self,layers['Conv1'].dw
	grads['b1'] = self.layers['Conv1'].db
	grads['W2'] = self.layers['Affine1'].dw
	grads['b2'] = self,layers['Affine1'].db
	grads['W3'] = self,layers['Affine2'].dw
	grads['b3'] = self.layers['Affine2'].db
	
	return grads

参数的梯度通过误差反向传播法(反向传播)求出

使用这个 SimpleConvNet学习 MNIST 数据集。训练数据的识别率为 99.82%,测试数据的识别率为 98.96%,测试数据的识别率大约为 99%,就小型网络来说,这是一个非常高的识别率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七彩虹CN600+Meetiger N10C测评

七彩虹CN600这款M.2固态硬盘的参数就不多说了 本期采用为512版本 迷虎品牌,英文名Meetiger,Meetiger/迷虎品牌成立于2012年,品牌迷虎产品主要有硬盘底座,保护盒,硬盘座,移动硬盘盒子,硬盘盒子,... 以下就是本期的硬盘盒 当这两样东西在一起…

C++(10):泛型算法

泛型算法:可用于不同类型的容器和不同类型的元素的通用算法。 概述 大多数算法都定义在头文件algorithm 中。标准库在头文件 numeric 中定义了一组数值泛型算法。 一般情况下,泛型算法不直接操作容器,而是遍历由两个迭代器指定的一个元素范…

【Spring Boot学习】日志文件,Spring Boot也会写日记了,这些事你知道嘛 ? ? ?

前言: 大家好,我是良辰丫,在上一篇文章中我们已经学习了Spring Boot的配置,接下来我们要学习一些日志相关的东西,什么是日志呢?我们慢慢往下看.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaE…

7.4_2B树的插入删除

我们先设置根节点 我们再往里面插入关键字 比如说:80 中间位置为49:(5/2)向上取整为3 新元素一定要插入到最底层”终端结点“,用”查找”来确定插入位置。 失败节点(叶子节点不属于同一层) 讲…

Vue-全局事件总线(GlobalEventBus)

全局事件总线(GlobalEventBus) 全局事件总线是vue中特别厉害的一种组件中通信的方式,它可以实现任意组件中通信,随便拿出来两个组件就能互通数据,就像对讲机一样,它在开发中用的也是特别的多 1 编写案例 首先准备两个组件&…

Python列表 (超详细举例加讲解)

得之我幸,失之我命 文章目录 1.列表的值 2.列表的定义 3.下标 4.列表长度 5.列表的加法和乘法 6.列表切片 7.操作方法(一些基础的函数) (1)append——向列表末尾添加元素 (2)insert——…

VUE3实现页面缓存,tab切换时不刷新

如上图所示,为了实现页面缓存,防止每次页面切换时重新刷新数据,前前后后尝试了多种写法,如上图被注释的那段写法,与没注释掉的写法,在router-view上主要是第一种写法有设置key属性,第二种没有&a…

常见面试题之框架篇

1.Spring框架中的单例bean是线程安全的吗? 不是线程安全的,是这样的。 当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),…

模拟电路系列分享-负反馈电路稳定性分析

目录 概要 整体架构流程 技术名词解释 1.负反馈放大电路产生自激震荡的条件 2.从实际运放的幅频,相频特性看自激振荡的可能性 小结 概要 在卡拉0K歌厅中,我们会见到这样一种现象:当麦克风位置不合适或者音量过大时, 喇叭中会出现一种非常难听的啸叫,捂住麦克风、赶紧…

【无需显卡】AI绘画入门教程

前言 Hello,各位端午节快乐呀!不好意思拖更两个月,最近实在是太忙了,也想不到有什么好玩的,之前介绍过了几个好玩的ai网站,非常适合新手尝鲜,但很多都有额度限制,而且还开始收费了&…

【C语言】内存你知多少?详解C语言动态内存管理

目录 一, 计算机中的内存 二,动态内存申请函数 2.1 头文件 2.2 malloc函数 2.3 free函数 2.3 calloc函数 2.4 realloc函数——调整空间函数 情况1:原有空间之后有足够大的空间 情况2:原有空间之后没有足够大的空间 2…

Android大图加载优化方案,避免程序OOM

我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如微博长图,海报等等。所以我们就要对图片进行局部显示。 大图加载基本需求…

信号与系统复习笔记——信号与系统的时域和频域特性

信号与系统复习笔记——信号与系统的时域和频域特性 傅里叶变换的模和相位表示 一般来说,傅里叶变换的结果是复数,所以能够使用模和相位来表示,具体的有: X ( j ω ) ∣ X ( j ω ) ∣ e j ∡ X ( j ω ) X(j\omega) |X(j\ome…

浅尝Transformer和LLM

文章目录 TransformerTransformer的衍生BERTPre-trainingBERT与其他方法的关系怎么用BERT做生成式任务? GPTPre-trainingFine-Tuning Transformer工具开源库特点 LLM系列推理服务 大语言模型势不可挡啊。 哲学上来说,语言就是我们的一切,语言…

MySQL 高级(进阶) SQL 语句

创建两个表格 use awsl; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angeles); insert into location values(West,Houst…

JMU20 软件工程经济学 复习总结

文章目录 碎碎念0. 基准收益率 i1. 现金流量图2. 净现值 NPV,内部收益率 IRR3. 单利,复利计算4. 等额年金NAV5. 动态回收期 P t ′ P_t Pt′​6. 固定资产折旧 [书P44]7. 增值税8. 软件行业增值税的即征即退9. 利息备付率 ICR,偿债备付率 DSC…

C语言之分支与循环

一、语句 什么是语句 C语言中,由一个分号( ;)隔开的即为一条语句。 这些都是语句: ( 一行里只有 ;的语句,我们称其为 “空语句” ) int main(void) {printf("hel…

UVM1.2究竟在UVM1.1上做了哪些升级

想必大家平时也没有很注意UVM1.1版本和UVM1.2版本的不同之处,只有在用一些以前UVM1.1能支持的功能,到了UVM1.2却出现编译报错,找不到对应的变量或者函数或者类的时候,才意识到这两个版本的差异。笔者也是遇到了1个打印问题&#x…

利用Django的视图类TemplateView将模板、视图与模板变量方便快速的整合在一起

TemplateView是Django提供的通用视图类之一,它允许您在不编写任何Python代码的情况下将模板与视图关联起来。下面是关于TemplateView类的一些介绍: 渲染模板:TemplateView负责渲染指定的模板并返回生成的HTML响应。您只需提供模板名称或路径即…

华为OD机试真题B卷 Java 实现【删除字符串中出现次数最少的字符】,附详细解题思路

一、题目描述 删除字符串中出现次数最少的字符,如果多个字符出现次数一样则都删除。 二、输入描述 一个字符串。 三、输出描述 删除字符串中出现次数最少的字符,如果多个字符出现次数一样则都删除,如果都被删除 则换为empty。 四、解题…