学长给的作业,但是在搜索的时候发现好像没有很多已有的资料是在做无框架实现人工神经网络的,而对于MNIST的识别也是使用Tensorflow居多。做出来的是比较差的模型,没有进行正则化,然后在1000次训练之后大概有88%左右的正确率。一共是三层网络,第一层是数据集的输入,在这里没有用卷积,只是把28x28的灰度图片展开成784维的向量输入模型,第一层到第二层所使用的是tanh激活函数,第二层到第三层用的是softmax。但是第一层到第二层的tanh可能有些许梯度消失的问题(已经对数据进行归一化处理,可是这个现象还是存在),本来想是换成softmax函数的,但是奈何资料匮乏,数学能力有限所以并不能自己求导,所以现在暂时是tanh+softmax这样的组合。关于梯度下降,本来用的是吴恩达老师在机器学习教程里面教的累积梯度下降,即在遍历一遍数据集后进行一次梯度下降。但是因为效果不好,又查阅了周志华老师的《机器学习》中神经网络的相关章节之后发现其实累积梯度下降在数据量大的时候可能要比标准梯度下降的效果差些,所以这里采用的是标准的梯度下降。关于正则化,在代码里面实现了以后发现lambda的值变化以后下降的效果并不是很好,而且lambda在取很大的书的时候会抛出警告甚至错误,所以在代码里面把lambda设为0。这是一个效果很差的模型,发出来只是希望能帮到有需要无框架实现人工神经网络的同学。如果有知道正则化方法或者是发现我代码中的错误和可以改进的地方的朋友,请告诉我qwq

代码如下:

import numpy as np
import os
import struct
import random
def softmax(X):X=X-np.max(X)expX=np.exp(X)softmaxX=expX/np.sum(expX)return softmaxXdef Normalization(X):X=X-np.average(X)X=X/X.max()return X
def LoadData(path,kind):labelPath=os.path.join(path,'%s-labels.idx1-ubyte'%kind)imagePath=os.path.join(path,'%s-images.idx3-ubyte'%kind)with open(labelPath,'rb') as lb:magic,n=struct.unpack('>II',lb.read(8))labels=np.fromfile(lb,dtype=np.uint8)with open(imagePath,'rb') as ib:magic, num, rows, cols = struct.unpack('>IIII',ib.read(16))images = np.fromfile(ib,dtype=np.uint8).reshape(len(labels), 784)labelsResult=[]for i in range(labels.shape[0]):y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]y[labels[i]]=1labelsResult.append(y)labelsResult=np.array(labelsResult)images=Normalization(images)return images,labelsResultdef RandomInitial(x,y):w=np.random.rand(x,y)b=random.random()b=b*np.ones((1,y))return w,bdef Learning(X_train,y_train,learningRate,learningTimes,mylambda):w1,b1=RandomInitial(784,50)w2,b2=RandomInitial(50,10)num=y_train.shape[0]for times in range(learningTimes):DW1 = np.zeros((784, 50))DW2 = np.zeros((50, 10))DB1 = np.zeros((1, 50))DB2 = np.zeros((1, 10))cost = 0for i in range(num):X=X_train[i].reshape(1,784)y=y_train[i]#FBz2=np.dot(X,w1)+b1a2=np.tanh(z2)z3=np.dot(a2,w2)+b2h=softmax(z3)#BPdelta3=h-yDW2=np.dot(a2.T,delta3)/num+mylambda*w2DB2=delta3.sum()/numdelta2=np.multiply(np.dot(delta3,w2.T),np.power(a2,2))DW1=np.dot(X.T,delta2)/num+mylambda*w1DB1=delta2.sum()/num#标准梯度下降w2=w2-learningRate*DW2w1=w1-learningRate*DW1b1=b1-learningRate*DB1b2=b2-learningRate*DB2#CostJ=np.multiply(-y,np.log(h)).sum()/numcost=cost+Jprint('Cost:',times+1,cost)#累积梯度下降#w2=w2-learningRate*DW2#w1=w1-learningRate*DW1#b1=b1-learningRate*DB1#b2=b2-learningRate*DB2return w1,w2,b1,b2
def HProcess(X):max=X[0][0]index=0for i in range(X.shape[1]):if max<X[0][i]:max=X[0][i]index=iX[0][i]=0X[0][index]=1def Predict(X_test,y_test,w1,w2,b1,b2):num=y_test.shape[0]corrAns=0for i in range(num):X = X_test[i].reshape(1, 784)y = y_test[i]# FPz2 = np.dot(X, w1) + b1a2 = np.tanh(z2)z3 = np.dot(a2, w2) + b2h = softmax(z3)index=HProcess(h)if((h==y).all()==True):corrAns=corrAns+1print('Correct/Total:',corrAns,'/',num)print('CorrectRate:',corrAns/num*100,'%')#-----------------------------------------
#ReadData
X_train,y_train=LoadData('/Users/chenzening/PycharmProjects/MNIST3.0/main','train')
learningRate=0.4
learningTimes=10000
w1,w2,b1,b2=Learning(X_train,y_train,learningRate,learningTimes,0)
X_test,y_test=LoadData('/Users/chenzening/PycharmProjects/MNIST3.0/main','t10k')
Predict(X_test,y_test,w1,w2,b1,b2)

无框架实现基本人工神经网络对MNIST数据集的识别相关推荐

  1. 机器学习实战10-Artificial Neural Networks人工神经网络简介(mnist数据集)

    目录 一.感知器 1.1.单层感知器 1.2.多层感知器MLP与反向传播 二.用 TensorFlow 高级 API 训练 MLP DNNClassifier(深度神经网络分类器) 2.1.初始化: ...

  2. 深度学习入门-误差反向传播法(人工神经网络实现mnist数据集识别)

    文章目录 误差反向传播法 5.1 链式法则与计算图 5.2 计算图代码实践 5.3激活函数层的实现 5.4 简单矩阵求导 5.5 Affine 层的实现 5.6 softmax-with-loss层计 ...

  3. 二隐层的神经网络实现MNIST数据集分类

    二隐层的神经网络实现MNIST数据集分类 传统的人工神经网络包含三部分,输入层.隐藏层和输出层.对于一个神经网络模型的确定需要考虑以下几个方面: 隐藏层的层数以及各层的神经元数量 各层激活函数的选择 ...

  4. 深度学习基础: BP神经网络训练MNIST数据集

    BP 神经网络训练MNIST数据集 不用任何深度学习框架,一起写一个神经网络训练MNIST数据集 本文试图让您通过手写一个简单的demo来讨论 1. 导包 import numpy as np imp ...

  5. [转载] 卷积神经网络做mnist数据集识别

    参考链接: 卷积神经网络在mnist数据集上的应用 Python TensorFlow是一个非常强大的用来做大规模数值计算的库.其所擅长的任务之一就是实现以及训练深度神经网络. 在本教程中,我们将学到 ...

  6. 神经网络——实现MNIST数据集的手写数字识别

    由于官网下载手写数字的数据集较慢,因此提供便捷下载地址如下 手写数字的数据集MNIST下载:https://download.csdn.net/download/gaoyu1253401563/108 ...

  7. 基于Python实现的卷积神经网络分类MNIST数据集

    卷积神经网络分类MNIST数据集 目录 人工智能第七次实验报告 1 卷积神经网络分类MNIST数据集 1 一 .问题背景 1 1.1 卷积和卷积核 1 1.2 卷积神经网络简介 2 1.3 卷积神经网 ...

  8. 基于Python实现的神经网络分类MNIST数据集

    神经网络分类MNIST数据集 目录 神经网络分类MNIST数据集 1 一 .问题背景 1 1.1 神经网络简介 1 前馈神经网络模型: 1 1.2 MINST 数据说明 4 1.3 TensorFlo ...

  9. mnist 数据集的识别源码解析

    在基本跑完识别代码后,再来谈一谈自己对代码的理解: 1      前向传播过程文件(mnist_forward.py) 第一个函数get_weight(shape, regularizer); 定义了 ...

最新文章

  1. Lodop导出图片和打印机无关,测试是否有关
  2. 排序学习(LTR)经典算法:RankNet、LambdaRank和LambdaMart
  3. Ubuntu: ldconfig(解决*.so不是符号连接)
  4. 绘制半圆_Android Canvas 绘制小黄人
  5. rip,ospf,eigrp内部网关协议的区别与用法
  6. (转)unity web 缓存解决方案
  7. DNN网络(三)python下用Tensorflow实现DNN网络以及Adagrad优化器
  8. 想了解“云+AI”究竟怎么“玩儿”,还要看这里、看这里!
  9. Spark源码学习1.6——Executor.scala
  10. TwinCAT3入门教程1——TC3系统安装
  11. 易语言编程入门教程学习
  12. 【思维导图】演绎推理和归纳推理基础概念
  13. GitHut上最受关注的Objective-C项目
  14. ubuntu16.04连接android手机蓝牙共享网络热点
  15. 一不小心,我爆啦!!!
  16. 有测试智商的软件不,测试智商的软件有哪些
  17. 【短信】谷歌4.4短信代码学习
  18. 现代信号处理——平稳随机信号的功率谱密度
  19. unity动态生成线条,门框,踢脚线,U型、弧形线条,或者根据cad线条打样
  20. sawyer机器人进入SDK模式

热门文章

  1. 基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)
  2. android文件压缩库,Android文件压缩和解压
  3. Linux MISC驱动示例
  4. 计算机常用软件考试试题,计算机常用工具软件试卷试题.docx
  5. T-Bootstrap-day03-弹性布局、表单、常见组件
  6. Word字号与磅值之间的关系
  7. cad怎么导出为图片?转换渠道选择
  8. openKylin社区SIG组2022年第四季度工作会议顺利召开!
  9. OpenGL粒子系统和变换反馈
  10. nvme协议 sata接口_NVMe和SATA SSD的区别