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

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 +1pool_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 xdef 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):#forwardself.loss(x,t)#backwarddout = 1dout = 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'].dwgrads['b1'] = self.layers['Conv1'].dbgrads['W2'] = self.layers['Affine1'].dwgrads['b2'] = self,layers['Affine1'].dbgrads['W3'] = self,layers['Affine2'].dwgrads['b3'] = self.layers['Affine2'].dbreturn grads

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动硬盘中安装Ubuntu 20.04系统——立省99%的问题

目录 关于我为什么要在移动硬盘中装系统 准备工作 开始安装 磁盘分区 创建虚拟机 关于我为什么要在移动硬盘中装系统 (6条消息) 笔记本安装双系统ubuntu时踩的坑——戴尔_放风筝的猪的博客-CSDN博客 准备工作 1.移动硬盘 2.Ubuntu镜像 3.VMware虚拟机 Ubuntu镜像可以从…

Tomcat 8.5 环境搭建指南

文章目录 导言环境搭建总结 导言 欢迎阅读本篇博客,本文将为您提供关于如何搭建Tomcat 8.5环境的详细指南。Tomcat是一个流行的开源Java Servlet容器,它提供了一个运行Java Web应用程序的平台。无论您是新手还是有经验的开发人员,本文都将帮…

微信小程序开发实战 ⑨(TabBar)

作者 : SYFStrive 博客首页 : HomePage 📜: 微信小程序 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f4…

Sangfor华东天勇战队:h2数据库console命令执行( CVE-2021-42392 漏洞)

漏洞版本 1.1.100 < H2 Console < 2.0.204 漏洞复现 此处复现版本1.4.197 启动项目如下 在Driver Class中输入javax.naming.InitialContext 在JDBCURL中输入jndi注入恶意链接 生成链接命令&#xff1a; java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C…

iPhone手机如何添加桌面便签软件小组件?

iPhone手机的小组件功能受到了很多用户的喜爱&#xff0c;它可以让用户更加快捷的查看到APP里面的部分相关内容。这项功能和便签软件结合起来之后&#xff0c;甚至能产生1加1大于二的效果。那么iPhone手机如何添加桌面便签软件小组件呢&#xff1f;以iPhone手机端敬业签桌面便签…

ElasticSearch-Kibana的安装

Kibana的安装 什么是ELK? ELK是Elasticsearch,Logstash,Kibana三大开源框架首字母大写简称,ELK属于大数据,是拆箱即用的,上手比较快 什么是Kibana? Kibana是一个针对ES的开源分析以及可视化平台,用来搜索,查看交互存储在ES索引中的数据,使用Kibana可以通过各类图标进行高级…

C#复制构造函数学习

通过从另一个对象复制变量或将一个对象的数据复制到另一个对象来创建对象的构造函数称为复制构造函数。 复制构造函数是一个参数化构造函数&#xff0c;包含相同类类型的参数。它的主要用途是将新实例初始化为现有实例的值。 using System;namespace Mytest{class User {publi…

CASAIM三维扫描仪在运动防护的应用高端运动器材设计定制器材头盔

CASAIM三维扫描技术在运动防护领域有广泛的应用&#xff0c;可以帮助设计和生产高端运动器材&#xff0c;检测运动器材适配性&#xff0c;以提供更好的运动防护。 CASAIM三维扫描仪可以将运动员的身体尺寸和形状精确地捕捉下来&#xff0c;以便制造出符合其个人需求的定制化器…

服务启动后能ping通但无法访问

近期业务需要&#xff0c;重启了服务器&#xff08;centos 7.4&#xff09;&#xff0c;但是各类服务启动后&#xff0c;仍然无法访问&#xff0c;Nginx的白页面都访问不到&#xff0c;能ping通&#xff0c;nslookup 域名解析也没问题&#xff0c;考虑是防火墙 -- 查看防火墙启…

生物科学大模型调研

生物大模型竞品调研 1 概念分类 大模型&#xff1a;大模型通常指的是参数量较大、层数较深的机器学习模型&#xff0c;例如深度神经网络。这些模型具有大量的可训练参数&#xff0c;通过在大规模数据集上进行训练&#xff0c;能够更好地捕捉数据中的复杂模式和特征。大模型在各…

Java启动项目时,控制台报端口被占用,解决办法

端口占用一般是现在有别的程序正在使用该端口 第一步可以先查出来是哪个程序在占用&#xff1a; netstat -aon | find "8113" //8113为被占用的端口号 此时的结果是这样的&#xff0c;查询出来的为占用此端口程序的PID&#xff08; 25472 &#xff09; 然后根据…

给若依添加单元测试(二)

给若依添加单元测试 方案一&#xff08;简单&#xff09; 方案二&#xff08;异常困难但企业开发一般用这个&#xff09; 在 activity 子模块中添加单元测试 S1.在 src 目录下创建 test.java.MapperTests 文件 S2.将以下内容复制进去 import com.ruoyi.activity.Activity…