基于深度学习的手写数字识别、python实现

基于深度学习的手写数字识别、python实现

    • 一、what is 深度学习
    • 二、加深层可以减少网络的参数数量
    • 三、深度学习的手写数字识别

一、what is 深度学习

深度学习是加深了层的深度神经网络。

二、加深层可以减少网络的参数数量

加深层的网络可以用更少参数获得与没有加深层同等水平的表现力。

一次5 * 5卷积运算,可以由两次3 * 3卷积运算抵充。

前者参数数量25,后者18 。

而且,参数数量差随着层加深,变大。

叠加小型滤波器来加深网络好处是减少参数的数量,扩大receptive filed(感受野),什么是感受野,就是让神经元变化的一个局部区域。

通过叠加层,将ReLU等激活函数夹在卷积层中间,有助于提高网络表现力,因为非线性函数的叠加,可以表达更复杂的东西。

加深层,可以分层次的分解需要学习的问题,也就是说,可以将各层要学习的问题分解成简单问题。

三、深度学习的手写数字识别

网络结构:
在这里插入图片描述

基于3*3的小型滤波器的卷积层(什么是卷积层,参考我之前写的,卷积神经网络的整体结构、卷积层、池化、python实现)

激活函数:RELU(什么是激活函数,参考我之前写的,神经网络的激活函数、并通过python实现激活函数;怎么实现激活函数层反向传播,参考我之前写的,结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层)

全连接层后面用Dropout层(什么是Dropout层,参考我之前写的,解决神经网络过拟合问题—Dropout方法、python实现)

基于Adam的最优化(对梯度下降的优化,参考我之前写的,神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现)

使用He初始值作为权重初始值。(什么是He初始值:参考之前写的,关于神经网络权重初始值的设置的研究)

代码中gradient求梯度的,我之前都写了,(参考之前写的,梯度、梯度法、python实现神经网络的梯度计算)。

损失函数是什么,(参考之前写的,损失函数、python实现均方误差、交叉熵误差函数、mini-batch的损失函数)。

有了这个网络的代码,怎么用数据集测试,我之前都写了,(参考之前写的:基于卷积神经网络的手写数字识别、python实现;基于随机梯度下降法的手写数字识别、epoch是什么、python实现;下载MNIST数据集并使用python将数据转换成NumPy数组(源码解析);使用python对数据集进行批处理)

关于网络全过程传递表示,也就是predict函数,我之前都写了,(参考之前写的:使用python构建三层神经网络、softmax函数)

这个深度学习网络是对前面所有知识的整合。如果你从深度学习开始入门学习机器学习,那么将在一天内学成所有入门知识,我就是这么学的。

现在,才刚刚进了机器学习的大门,之前讲的所有东西,相当于幼儿园知识。

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import pickle
import numpy as np
from collections import OrderedDict
from common.layers import *class DeepConvNet:"""识别率为99%以上的高精度的ConvNet网络结构如下所示conv - relu - conv- relu - pool -conv - relu - conv- relu - pool -conv - relu - conv- relu - pool -affine - relu - dropout - affine - dropout - softmax"""def __init__(self, input_dim=(1, 28, 28),conv_param_1 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},conv_param_2 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},conv_param_3 = {'filter_num':32, 'filter_size':3, 'pad':1, 'stride':1},conv_param_4 = {'filter_num':32, 'filter_size':3, 'pad':2, 'stride':1},conv_param_5 = {'filter_num':64, 'filter_size':3, 'pad':1, 'stride':1},conv_param_6 = {'filter_num':64, 'filter_size':3, 'pad':1, 'stride':1},hidden_size=50, output_size=10):# 初始化权重===========# 各层的神经元平均与前一层的几个神经元有连接(TODO:自动计算)pre_node_nums = np.array([1*3*3, 16*3*3, 16*3*3, 32*3*3, 32*3*3, 64*3*3, 64*4*4, hidden_size])wight_init_scales = np.sqrt(2.0 / pre_node_nums)  # 使用ReLU的情况下推荐的初始值self.params = {}pre_channel_num = input_dim[0]for idx, conv_param in enumerate([conv_param_1, conv_param_2, conv_param_3, conv_param_4, conv_param_5, conv_param_6]):self.params['W' + str(idx+1)] = wight_init_scales[idx] * np.random.randn(conv_param['filter_num'], pre_channel_num, conv_param['filter_size'], conv_param['filter_size'])self.params['b' + str(idx+1)] = np.zeros(conv_param['filter_num'])pre_channel_num = conv_param['filter_num']self.params['W7'] = wight_init_scales[6] * np.random.randn(64*4*4, hidden_size)self.params['b7'] = np.zeros(hidden_size)self.params['W8'] = wight_init_scales[7] * np.random.randn(hidden_size, output_size)self.params['b8'] = np.zeros(output_size)# 生成层===========self.layers = []self.layers.append(Convolution(self.params['W1'], self.params['b1'], conv_param_1['stride'], conv_param_1['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W2'], self.params['b2'], conv_param_2['stride'], conv_param_2['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Convolution(self.params['W3'], self.params['b3'], conv_param_3['stride'], conv_param_3['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W4'], self.params['b4'],conv_param_4['stride'], conv_param_4['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Convolution(self.params['W5'], self.params['b5'],conv_param_5['stride'], conv_param_5['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W6'], self.params['b6'],conv_param_6['stride'], conv_param_6['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Affine(self.params['W7'], self.params['b7']))self.layers.append(Relu())self.layers.append(Dropout(0.5))self.layers.append(Affine(self.params['W8'], self.params['b8']))self.layers.append(Dropout(0.5))self.last_layer = SoftmaxWithLoss()def predict(self, x, train_flg=False):for layer in self.layers:if isinstance(layer, Dropout):x = layer.forward(x, train_flg)else:x = layer.forward(x)return xdef loss(self, x, t):y = self.predict(x, train_flg=True)return self.last_layer.forward(y, t)def accuracy(self, x, t, batch_size=100):if t.ndim != 1 : t = np.argmax(t, axis=1)acc = 0.0for i in range(int(x.shape[0] / batch_size)):tx = x[i*batch_size:(i+1)*batch_size]tt = t[i*batch_size:(i+1)*batch_size]y = self.predict(tx, train_flg=False)y = np.argmax(y, axis=1)acc += np.sum(y == tt)return acc / x.shape[0]def gradient(self, x, t):# forwardself.loss(x, t)# backwarddout = 1dout = self.last_layer.backward(dout)tmp_layers = self.layers.copy()tmp_layers.reverse()for layer in tmp_layers:dout = layer.backward(dout)# 设定grads = {}for i, layer_idx in enumerate((0, 2, 5, 7, 10, 12, 15, 18)):grads['W' + str(i+1)] = self.layers[layer_idx].dWgrads['b' + str(i+1)] = self.layers[layer_idx].dbreturn gradsdef save_params(self, file_name="params.pkl"):params = {}for key, val in self.params.items():params[key] = valwith open(file_name, 'wb') as f:pickle.dump(params, f)def load_params(self, file_name="params.pkl"):with open(file_name, 'rb') as f:params = pickle.load(f)for key, val in params.items():self.params[key] = valfor i, layer_idx in enumerate((0, 2, 5, 7, 10, 12, 15, 18)):self.layers[layer_idx].W = self.params['W' + str(i+1)]self.layers[layer_idx].b = self.params['b' + str(i+1)]

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

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

相关文章

二极管的结构、特性、参数、稳压管的特性和参数

二极管的结构、特性、参数、稳压管的特性和参数本文介绍的定义一、半导体类型二、PN结的结构与单向导电性三、二极管的伏安特性四、二极管的参数五、稳压管本文介绍的定义 本文介绍的定义:半导体、本征半导体、空穴、载流子、杂质半导体、N型半导体、P型半导体、PN…

双极结型三极管的结构、特性曲线、参数、lceda仿真

双极结型三极管的结构、特性、参数本文介绍的定义一、三极管结构二、三极管特性曲线三、三极管参数本文介绍的定义 硅平面管、锗合金管、发射区、基区,集电区、发射极、基极、集电极、发射结、集电结、发射、发射极电流、复合和扩散、基极电流、收集、集电极电流、…

结型场效应管的结构、特性、参数

结型场效应管的结构、特性、参数本文介绍的定义一、N沟道结型场效应管结构二、N沟道结型场效应管特性曲线本文介绍的定义 场效应管、结型场效应管、N沟道结型场效应管的结构、耗尽层、栅极、源极、漏极、N沟道结型场效应管、夹断电压、预夹断、输出特性、可变电阻区、恒流区、…

绝缘栅型场效应管的结构、特性、参数

绝缘栅型场效应管的结构、特性、参数本文介绍的定义一、N沟道增强型MOS场效应管结构二、N沟道增强型MOS场效应管特性曲线三、N沟道耗尽型MOS场效应管结构和特性曲线本文介绍的定义 绝缘栅型场效应管、N沟道增强型MOS场效应管、耗尽型场效应管、增强型场效应管、反型层、开启电…

放大电路、单管共发射极放大电路结构、工作原理、lceda仿真

放大电路、单管共发射极放大电路结构、工作原理本文介绍的定义一、放大电路基本概念二、单管共发射极放大电路本文介绍的定义 放大、实现放大作用、放大电路技术指标测量、电压放大倍数、电流放大倍数、相量表示、最大输出幅度、峰峰值、非线性失真系数、输入电阻、输出电阻、…

放大电路分析方法、图解法分析放大电路、lceda仿真

放大电路分析方法、图解法分析放大电路一、本文介绍的定义二、放大电路分析方法三、图解法一、本文介绍的定义 放大电路分析、图解法、微变等效电路法、静态分析、动态分析、直流通路、交流通路、单管共射放大电路的直流和交流通路、静态工作点、图解法分析静态、直流负载线、…

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现本文介绍的定义:一、语料库预处理二、单词的分布式表示三、单词的相似度四、相似单词排序本文介绍的定义: 语料库、计数方法的目的、语料库预处理、单词的分布式表示、分布式假设、上下文、窗…

使用PPMI改进共现矩阵

使用PPMI改进共现矩阵 共现矩阵的元素表示两个单词同时出现的次数,这里的次数并不具备好的性质,举个例子,有短语叫the car,因为the是个常用词,如果以两个单词同时出现的次数为衡量相关性的标准,与drive 相…

基于SVD的降维优化

基于SVD的降维优化 向量降维:尽量保留数据“重要信息”的基础上减少向量维度。可以发现重要的轴(数据分布广的轴),将二维数据 表示为一维数据,用新轴上的投影值来表示各个数据点的值,示意图如下。 稀疏矩阵…

微变等效电路法分析放大电路

微变等效电路法分析放大电路本文介绍的定义一、简化的h参数微变等效电路1.静态工作点计算2.微变等效电路法估算电压放大倍数二、微变等效电路法应用本文介绍的定义 微变等效电路法、h参数微变等效电路、单管共射放大电路的微变等效电路、Rbe近似估算、微变等效电路法应用。 一…

分压式静态工作点稳定电路

分压式静态工作点稳定电路本文介绍的定义:一、静态工作点稳定问题二、分压式静态工作点稳定电路本文介绍的定义: 静态工作点稳定问题、温度对三极管参数的影响、分压式静态工作点稳定电路、电流负反馈式工作点稳定电路、旁路电容、静态分析、动态分析。…

双极型三极管共集电极、共基极放大电路

双极型三极管共集电极、共基极放大电路本文介绍的定义共集电极放大电路共基极放大电路本文介绍的定义 双极型三极管放大电路的接法、共集电极放大电路、射极跟随器、带负载能力、共基极放大电路、改善频率响应。 共集电极放大电路 接法:根据输入信号与输出信号公…

stm32使用DAP下载程序

jym认为,会下载程序等于学会stm32,hahaha。 首先点这个魔术棒 接下来进行下面的设置: 配置Debug选项 配置Utilities选项 配置Degug-setting选项 选择目标板,flash大小由板子芯片型号决定,勾选reset and run&#xff…

stm32 NVIC EXTI

stm32 NVIC EXTINVICEXTI原理图main.cexti.hexti.cstm32f10x_it.cNVIC NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。配置中断的时候我们一般只用 ISER、ICER 和 IP 这三个寄存器&#…

stm32 HSE HSI

stm32 HSE HSI时钟树main.cclkconfig.hclkconfig.c时钟树 HSE_SetSysClock和HSI_SetSysClock这两个函数就是根据上面这个时钟树编写的。 main.c 这个实验是通过HSE或者HSI配置系统时钟,结果就是,用HSE比HSI灯闪的快点,因为代码设置的是使用…

stm32 SysTick

SysTick是系统定时器,属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候&am…

stm32 USART

介绍的定义 串行通信、并行通信、全双工、半双工、单工、同步、异步、比特率、码元、波特率、TTL、RS232、DB9接口、DTE、DCE、协议层、USART、UART、CH340G芯片、USB。 通信基础 根据数据传送的方式,通讯可分为串行通讯与并行通讯。 串行通信:同一时…

robot 用AP连PC

1.启动机器人 2.PC找到机器人的热点,连接 3.看机器人分配的电脑ip 4.打开putty软件,下图里面是机器人的ip。然后点击open 。 5.输入机器人用户名和密码,现在已经登陆进去了。 6.输入ifconfig查看网络状况

robot连PCwifi、PC开Shell连robot

用网线将机器人和路由器连接,登录路由器管理界面,获取机器人 IP 地址。 打开Xshell,新建会话,主机设成机器人IP。 输入机器人用户名和密码 然后pc通过ssh连接上机器人 用ifconfig查看当前网络连接状态。有线连接是192.168.0.108&a…

ROS配置分布式通信

ROS配置分布式通信关键是,机器人和 PC 要处于同一网段。 虚拟机网络适配器设置成桥接。 ifconfig查看虚拟机和机器人端的网络连接状态,看是否处于一个网段。下面两图,说明机器人和 PC 都是一个网段。 互相Ping测试连通性。 修改PC端bashrc文…