直接提供代码

一共分四个文件

trainer.py用于接受参数开始训练

layer.py用于定义每个层的属性和功能

net.py用于构建整个神经网络

mlp用于读取mnist数据集并进行训练

记得把trainer,layer,net这三个文件拷到同一个文件夹下,方便mlp文件调用这三个文件的类

DogeTrainer.py

from dogelearning.DogeLayer import Layer
from dogelearning.DogeNet import Net
from tqdm.std import trange
import numpy as npclass Trainer:def train(self,net,train_loader,batch_size,optimizer='sgd',epoch_num=50):list = []for i in trange(0, epoch_num):for batch_idx, (data, target) in enumerate(train_loader):if (data.shape[0] < batch_size):breakdata = np.squeeze(data.numpy()).reshape(batch_size, 784)  # 把张量中维度为1的维度去掉,并且改变维度为(64,784)target = target.numpy()  # x矩阵 (64,10)y_hat = net.forward(data)net.backward( np.eye(10)[target] )list.append(Accuracy(target, y_hat))if (batch_idx == 50):print("准确率为" + str(Accuracy(target, y_hat)))return listdef Accuracy(target, y_hat):# y_hat.argmax(axis=1)==target 用于比较y_hat与target的每个元素,返回一个布尔数组acc = y_hat.argmax(axis=1) == targetacc = acc + 0  # 将布尔数组转为0,1数组return acc.mean()  # 通过求均值算出准确率

DogeNet.py

from dogelearning.DogeLayer import *
class Net:layers=[]batch_size=0input_num=0def __init__(self,batch_size,input_num):self.batch_size=batch_sizeself.input_num=input_numpassdef add(self,layer_type,node_num,activation=""):if (len(self.layers)==0):last_node_num=self.input_numelse:last_node_num=self.layers[-1].node_num #获取上一层的节点个数if (layer_type=='Softmax'):self.layers.append(Softmax((node_num)))else:self.layers.append(Layer(last_node_num,node_num,self.batch_size,activation))def forward(self,data):for layer in self.layers:data=layer.forward(data)return data #返回最后输出的data用于反向传播def backward(self,y_hat):dydx=y_hatfor layer in reversed(self.layers):dydx=layer.backward(dydx)def print(self):print("网络名                                                      节点个数 激活函数")for layer in self.layers:print(layer,layer.node_num,layer.activation)

DogeLayer.py

# import minpy.numpy as mnp
import numpy as np
class Layer:lamda = 3  # 正则化惩罚系数w=0b=0last_node_num=0node_num=0batch_size=0activation=''learning_rate=0.1x=0activation_data =0def __init__(self,last_node_num,node_num,batch_size,activation):self.last_node_num=last_node_numself.node_num=node_numself.w = np.random.normal(scale=0.01, size=(last_node_num,node_num))  # 生成随机正太分布的w矩阵self.b = np.zeros((batch_size, node_num))self.activation=activationself.batch_size=batch_sizedef forward(self,data):self.x=datadata=np.dot(data, self.w) + self.bif self.activation=="Sigmoid":data=1 / (1 + np.exp(-data))# print(data.mean())if self.activation=="Tahn":data = (np.exp(data)- np.exp(-data)) / (np.exp(data)+ np.exp(-data))if self.activation == "Relu":data= (np.abs(data)+data)/2.0self.activation_data = datareturn datadef backward(self,y):if self.activation == "Sigmoid":y = self.activation_data * (1 - self.activation_data) * yif self.activation == "Tahn":y = (1 - self.activation_data**2) * yif self.activation=="Relu":self.activation_data[self.activation_data <= 0] = 0self.activation_data[self.activation_data > 0] = 1y = self.activation_data *yw_gradient=np.dot(self.x.T, y)b_gradient=yy=np.dot(y,self.w.T)self.w = self.w - (w_gradient+(self.lamda*self.w)) / self.batch_size * self.learning_rateself.b = self.b - b_gradient / self.batch_size * self.learning_ratereturn yclass Softmax (Layer):y_hat=[]def __init__(self,node_num):self.node_num=node_numpassdef forward(self,data):data = np.exp(data.T)  # 先把每个元素都进行exp运算# print(label)sum = data.sum(axis=0)  # 对于每一行进行求和操作# print((label/sum).T.sum(axis=1))self.y_hat=(data / sum).Treturn self.y_hat  # 通过广播机制,使每行分别除以各种的和def backward(self,y):return self.y_hat-y

MLP.py

from torchvision import datasets, transforms
import torch.utils.data as Data
# import minpy.numpy as mnp
# import numpy as npfrom dogelearning.DogeNet import Net
from dogelearning.DogeLayer import Layer
from dogelearning.DogeTrainer import Trainerbatch_size = 256
learning_rate=0.001def load_data():# 加载torchvision包内内置的MNIST数据集 这里涉及到transform:将图片转化成torchtensortrain_dataset = datasets.MNIST(root='./data/', train=True, transform=transforms.ToTensor(), download=True)# 加载小批次数据,即将MNIST数据集中的data分成每组batch_size的小块,shuffle指定是否随机读取train_loader = Data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)return train_loaderif __name__ == '__main__':train_loader=load_data()    #加载数据(这里使用pytorch加载数据,后面用numpy手写)net = Net(batch_size,784)print(net.batch_size)# net.add("",256,activation="Sigmoid")# net.add("", 64, activation="Sigmoid")# net.add("", 10, activation="Sigmoid")# net.add("Softmax", 10)# net.add("", 256, activation="Tahn")# net.add("", 64, activation="Tahn")# net.add("", 10, activation="Tahn")# net.add("Softmax", 10)net.add("", 256, activation="Relu")net.add("", 64, activation="Relu")net.add("", 10, activation="Relu")net.add("Softmax", 10)net.print()list=Trainer.train(train_loader,net,train_loader,batch_size,epoch_num=100)import matplotlib.pyplot as pltplt.plot(list)plt.show()

最终效果如下

网络名 节点个数 激活函数
256 Relu
64 Relu
10 Relu
10
准确率为0.3046875
1%| | 1/100 [00:07<13:08, 7.97s/it]准确率为0.24609375
2%|▏ | 2/100 [00:16<13:14, 8.11s/it]准确率为0.4140625
3%|▎ | 3/100 [00:28<14:59, 9.27s/it]准确率为0.68359375
4%|▍ | 4/100 [00:38<15:13, 9.51s/it]准确率为0.81640625
5%|▌ | 5/100 [00:50<16:12, 10.23s/it]准确率为0.87109375

tahn的优化图像

relu的优化图像

numpy手写mlp相关推荐

  1. 太赞了!NumPy 手写所有主流 ML 模型,由普林斯顿博士后 David Bourgin打造的史上最强机器学习基石项目!...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 用 NumPy 手写所有主流 ML 模型,普林斯顿博士后 David Bourgi ...

  2. NumPy 手写所有主流 ML 模型,由普林斯顿博士后 David Bourgin打造的史上最强机器学习基石项目!...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 用 NumPy 手写所有主流 ML 模型,普林斯顿博士后 David Bourgi ...

  3. 【神经网络实验】Numpy手写多层神经网络

    引言 这个作业的目的是给你们介绍建立,训练和测试神经系统网络模型.您不仅将接触到使用Python包构建神经系统网络从无到有,还有数学方面的反向传播和梯度下降.但在实际情况下,你不一定要实现神经网络从零 ...

  4. 用Numpy手写各种距离度量

    本文用Numpy实现了常见的几种距离度量. 设和为两个向量,求它们之间的距离. 这里用Numpy实现,设和为ndarray <numpy.ndarray>,它们的shape都是(N,) 为 ...

  5. Github | NumPy手写全部主流机器学习模型

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 该 repo 的模型或代码结构如下所示: 1. 高斯混合模型 EM ...

  6. 手写 30 个主流机器学习算法,代码超 3 万行,全都开源了!

    点击上方"视学算法",选择"星标"公众号 第一时间获取价值内容 本文经机器之心(ID:almosthuman2014)授权转载,禁二次转载 参与:思源.一鸣.张 ...

  7. MNIST手写数字识别之MLP实现

    在本笔记中,我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的相关概念,并将其运用到最基础的MNIST数据集分类任务中,同时展示相关代码.本笔记主要从下面 ...

  8. 基于Numpy构建全连接前馈神经网络进行手写数字识别

    文章目录 (一) 问题描述 (二) 设计简要描述 (三) 程序清单 (四) 结果分析 (五) 调试报告 (六) 实验小结 (一) 问题描述 不使用任何机器学习框架,仅仅通过Numpy库构建一个最简单的 ...

  9. MLP 之手写数字识别

    0. 前言 前面我们利用 LR 模型实现了手写数字识别,但是效果并不好(不到 93% 的正确率). LR 模型从本质上来说还只是一个线性的分类器,只不过在线性变化之后加入了非线性单调递增 sigmoi ...

最新文章

  1. python与图书编辑
  2. ThinkServer RD430:高性价比的海量存储服务器
  3. 今晚直播 | NeurIPS 2021论文解读:基于置信度校正的可信图神经网络
  4. hdu 4419 Colourful Rectangle (离散化扫描线线段树)
  5. 什么样的项目经历会让面试官眼前一亮
  6. 剑指Offer - 面试题66. 构建乘积数组(正反遍历)
  7. matlab guide 自定义右键菜单
  8. 怎么增加一个工位?ApiPost工位有什么用?
  9. bzoj 3209 花神的数论题 —— 数位DP
  10. /etc/resolv.conf
  11. 涨姿势了!delete后加 limit是个好习惯么?
  12. 解决办法: error: passing ‘const VideoFrame’ as ‘this’ argument discards qualifiers [-fpermissive]
  13. 推挽变换器matlab仿真,双驱动推挽DC-DC变换器方案分享之设计原理简析
  14. [对于蓝桥杯要说的一二体会]
  15. php 生成电话名片二维码
  16. 《传奇之王》风波不断 编剧替柳云龙打抱不平_0
  17. SYSCALL_DEFINEx宏源码解析
  18. 要取好名字的来这儿!哈哈
  19. 要出发周边游APP产品体验报告
  20. Mysql使用Key/Value方式存储动态扩展字段、对象与HashMap的相互转化

热门文章

  1. 向量的内积外积与其几何意义
  2. 向量内积和外积的计算以及意义
  3. ECS进阶Day03:SLB负载均衡实践
  4. 百度云 人脸对比API 使用(nodejs)
  5. 1077: CJ001 闰年
  6. webpack中的tree shaking(树摇)-----移除未使用的代码
  7. flink sql脚本
  8. 课堂教学的动态生成与教师回应策略的研究课题申请•评审书
  9. 【博学谷学习记录】超强总结,用心分享|大数据之GROUPING
  10. c++中成员函数重载