学习实验楼的课程,虽然后面成为会员专属,但是幸好有可爱的同伴们做了非常详细的笔记,完全就是课件再现啊,以至于我能够顺利的学完这节课程。感谢一下哈哈哈哈,以下是链接
使用python实现深度神经网络
接下来是自己整理的笔记吼












以下是各文件

#coding=utf-8
#preprocess.py 数据预处理文件
import sys
from scipy import miscimport numpy as np
def main():l = len(sys.argv)if l < 2:print'eg:python img2pkl.py list.txt dist.npy\n'\'convert image to npy\n'returnsrc = sys.argv[1]dst = sys.argv[2] if l > 2 else 'data.pkl'with open(src,'r') as f:list = f.readlines()data = []labels = []for i in list:name, label = i.strip('\n').split(' ')#将图片列表中的每一行拆分成图片名和图片标签#print name#print labelprint name+'processed'img = misc.imread(name)  #将图片读出来,存入一个矩阵img/=255   #将图片转换为只有0,1的矩阵img.resize((img.size,1)) #为了方便运算,将图片存储到一个img.size*1的列向量data.append(img)labels.append(int(label))print 'write to npy'np.save(dst,[data,labels])#将训练数据以npy的形式保存到本地文件print 'completed'
if __name__=='__main__':main()

运行以下语句生成相应的.npy 文件

python preprocess.py train.txt train.npy
python preprocess.py validate.txt validate.npy
python preprocess.py test.txt test.npy
# encoding=utf8
#layers.py 将各个模块封装起来
import numpy as npclass Data:def __init__(self, name, batch_size):#数据所在的文件名name和batch中图片的数量batch_sizewith open(name, 'rb') as f:data = np.load(f)self.x = data[0] #输入xself.y = data[1] #预期正确输出yself.l = len(self.x)self.batch_size = batch_sizeself.pos = 0#pos用来记录数据读取的位置def forward (self):pos=self.posbat=self.batch_sizel = self.lif pos+bat >= l: #已经是最后一个batch时,返回剩余的数据,并设置pos为开始位置0ret = (self.x[pos:l], self.y[pos:l])self.pos = 0index = range(l)np.random.shuffle(index)  #将训练数据打乱self.x = self.x[index]self.y = self.y[index]else: #不是最后一个batch,pos直接加上batch_sizeret = (self.x[pos:pos + bat], self.y[pos:pos + bat])self.pos += self.batch_sizereturn ret, self.pos #返回pos为0时代表一个epoch已经结束def backward (self,d):  #数据层无backward操作passclass FullyConnect:def __init__(self, l_x, l_y): #两个参数分别为输入层的长度和输出层的长度self.weights = np.random.randn(l_y,l_x)/np.sqrt(l_x) #使用随机数初始化参数,忽略np.sqrt(l_x)self.bias = np.random.randn(l_y,1) #使用随机数初始化参数self.lr=0 #将这一层计算的结果向前传递'''self.lr 是学习速率alpha,需要手工设定l_x是输入单个数据向量的长度,17*17=289l_y代表全连接层输出的节点数量,由于大写英文字母有26个,因此l_y=26因此self.weights=26*289,self.bias尺寸为26*1以包含100个训练输入数据的batch为例分析,forward()函数的输入x的尺寸为100*289*1(batch_size向量长度为1)backward()函数的输入d代表从前面的网络层反向传回来的“部分梯度值”,尺寸为100*26*1(batch_sieze输出层节点数l_y*1)参数初始化'''def forward (self,x):self.x = x #把中间结果保存下来,以备反向传播时使用self.y = np.array([np.dot(self.weights,xx)+self.bias for xx in x]) #计算全连接层的输出return self.y #将这一层计算的结果向前传递def backward (self,d):ddw = [np.dot(dd, xx.T) for dd, xx in zip(d, self.x)] #根据链式法则,将反向传递回来的导数值乘以x,得到对参数的梯度self.dw = np.sum(ddw,axis=0)/self.x.shape[0]self.db = np.sum(d, axis=0)/self.x.shape[0]self.dx = np.array([np.dot(self.weights.T,dd) for dd in d])self.weights -= self.lr * self.dwself.bias -= self.lr * self.dbreturn self.dx  # 反向传播梯度'''损失函数对于输入x的梯度值self.dx的求解,与self.dw类似self.x中一个数据尺寸为289*1,self.weights尺寸为26*289,dd尺寸为261因此需要对self.weights进行转置,那么289*1=(289*26)*(26*1)更新参数'''#激活函数
class Sigmoid:def __init__(self):#无参数,不需初始化passdef sigmoid (self,x):return 1/(1+np.exp(-x))def forward (self,x):self.x = xself.y = self.sigmoid(x)return self.ydef backward (self,d):sig=self.sigmoid(self.x)self.dx = d*sig*(1-sig)return self.dx #反向传递梯度#损失函数层
class QuadraticLoss:def __init__(self):passdef forward (self, x, label):self.x=xself.label=np.zeros_like(x) #由于label只包含一个数字,需要将其转换成和模型输出值尺寸相匹配的向量形式for a,b in zip(self.label, label):a[b] = 1.0 #只有正确标签所代表的位置概率为1, 其余为0self.loss = np.sum(np.square(x-self.label))/self.x.shape[0]/2#求平均后再除以2,只是为了方便return self.lossdef backward (self):self.dx = (self.x-self.label)/self.x.shape[0] #2被抵消return self.dxclass Accuracy:def __init__(self):passdef forward (self,x, label):self.accuracy = np.sum([np.argmax(xx)==ll for xx, ll in zip(x, label)])#对预测正确的实例数求和self.accuracy = 1.0*self.accuracy/x.shape[0] #正确率return self.accuracyclass CrossEntropyLoss:def __init__(self):passdef forward(self,x, label):self.x = xself.label = np.zeros_like(x)for a, b in zip(self.label, label):a[b] = 1.0self.loss = np.nan_to_num(-self.label*np.log(x)-((1-self.label)*np.log(1-x)))self.loss = np.sum(self.loss)/x.shape[0]return self.lossdef backward(self):self.dx = (self.x-self.label)/self.x/(1-self.x)return self.dx
# encoding=utf8
#shallow.py 浅层神经网络,只构建了一层隐形层,也就是除了输入输出只有一层隐形层
from layers import *def main():datalayer1 = Data('train.npy', 1024) # 用于训练,batch_size设置为2014datalayer2 = Data('validate.npy',10000) # 用于验证所以设置batch——size为10000,一次性计算所有样例inner_layers = []inner_layers.append(FullyConnect(17*17,26))inner_layers.append(Sigmoid())losslayer = QuadraticLoss()accuracy = Accuracy()for layer in inner_layers:layer.lr = 1000.0 #为所有中间层设置学习速率epochs = 20for i in range(epochs):print 'epochs:', ilosssum = 0iters = 0while True:data, pos = datalayer1.forward()  # 从数据层取出数据x, label = datafor layer in inner_layers:  # 前向计算x = layer.forward(x)loss = losslayer.forward(x,label)  # 调用损失层forward函数计算损失函数值losssum += lossiters +=1d = losslayer.backward() # 调用损失层backward 函数层计算将要反向传播的梯度for layer in inner_layers[::-1]:# 反向传播d = layer.backward(d)if pos == 0: # 一个epoch 完成后进行准确率测试data, _ =datalayer2.forward()x, label = datafor layer in inner_layers:x= layer.forward(x)accu = accuracy.forward(x, label)  # 调用准确率层forward()函数求出准确率print 'loss:', losssum/itersprint 'accuracy:', accubreak
if __name__=='__main__':main()
# encoding=utf8
#deep.py 构建深层神经网络,多加了一层隐形层,其余不分不变,最后发现,在相同的处理条件下,效果竟然不如浅层神经网络,这就是我们遇到的*梯度消失问题*,下次我们对这个问题进行改进
from layers import *def main():datalayer1 = Data('train.npy',1024) #用于训练,batch_size设置为2014datalayer2 = Data('validate.npy',10000) #用于验证所以设置batch——size为10000,一次性计算所有样例inner_layers = []inner_layers.append(FullyConnect(17*17,20))inner_layers.append(Sigmoid())inner_layers.append(FullyConnect(20,26)) #增加一个隐层inner_layers.append(Sigmoid())losslayer = QuadraticLoss()accuracy = Accuracy()for layer in inner_layers:layer.lr = 10000.0 # 为所有中间层设置学习速率epochs = 20for i in range(epochs):print 'epochs:', ilosssum = 0iters = 0while True:data, pos = datalayer1.forward() #从数据层取出数据x, label = datafor layer in inner_layers: #前向计算x = layer.forward(x)loss = losslayer.forward(x, label) # 调用损失层forward函数计算损失函数值losssum += lossiters +=1d = losslayer.backward() #调用损失层backward 函数层计算将要反向传播的梯度for layer in inner_layers[::-1]:#反向传播d = layer.backward(d)if pos == 0: #一个epoch 完成后进行准确率测试data, _ =datalayer2.forward()x, label = datafor layer in inner_layers:x= layer.forward(x)accu = accuracy.forward(x, label)  # 调用准确率层forward()函数求出准确率print 'loss:', losssum/itersprint 'accuracy:', accubreakif __name__=='__main__':main()
#encoding=utf8
#deep2.py 这次我们使用的损失函数为*交叉熵损失函数*,刚好解决了之前*梯度下降消失*的问题,得到更好的结果
from layers import *def main():datalayer1 = Data('train.npy',1024)datalayer2 = Data('validate.npy', 10000)inner_layers = []inner_layers.append(FullyConnect(17*17, 20))inner_layers.append(Sigmoid())inner_layers.append(FullyConnect(20,26))inner_layers.append(Sigmoid())losslayer = CrossEntropyLoss()accuracy = Accuracy()for layer in inner_layers:layer.lr = 1.0epochs = 20for i in range(epochs):print 'epochs', ilosssum = 0iters = 0while True:data, pos = datalayer1.forward()x, label = datafor layer in inner_layers:x = layer.forward(x)loss = losslayer.forward(x,label)losssum += lossiters += 1d = losslayer.backward()for layer in inner_layers[::-1]:d = layer.backward(d)if pos == 0:data, _ = datalayer2.forward()x, label = datafor layer in inner_layers:x = layer.forward(x)accu = accuracy.forward(x,label)print 'loss:', losssum/itersprint 'accuracy:', accubreakif __name__ == '__main__':main()

这是运行shallow.py得到的结果

这是运行deep.py得到的结果,多加一层隐形层,结果反而变坏

这是运行deep2.py且将损失函数变为交叉损失函数,可得到非常好的结果

使用python实现深度神经网络--学习笔记相关推荐

  1. python深度神经网络量化_基于Python建立深度神经网络!你学会了嘛?

    原标题:基于Python建立深度神经网络!你学会了嘛? 图1 神经网络构造的例子(符号说明:上标[l]表示与第l层:上标(i)表示第i个例子:下标i表示矢量第i项) 单层神经网络 图2 单层神经网络示 ...

  2. 神经网络学习笔记3——Transformer、VIT与BoTNet网络

    系列文章目录 神经网络学习笔记1--ResNet残差网络.Batch Normalization理解与代码 神经网络学习笔记2--VGGNet神经网络结构与感受野理解与代码 文章目录 系列文章目录 A ...

  3. CNTK与深度强化学习笔记: Cart Pole游戏示例

    CNTK与深度强化学习笔记之二: Cart Pole游戏示例 前言 前面一篇文章,CNTK与深度强化学习笔记之一: 环境搭建和基本概念,非常概要的介绍了CNTK,深度强化学习和DQN的一些基本概念.这 ...

  4. 深度强化学习笔记之PPO实现细节(2)

    深度强化学习笔记之PPO实现细节(2) 本文主要参考于Coding PPO from Scratch with PyTorch系列,但本文并不会像该系列一样手把手讲解全部的实现细节,只是记录一下自己在 ...

  5. 甘利俊一 | 信息几何法:理解深度神经网络学习机制的重要工具

    智源导读:深度学习的统计神经动力学主要涉及用信息几何的方法对深度随机权值网络进行研究.深度学习技术近年来在计算机视觉.语音识别等任务取得了巨大成功,但是其背后的数学理论发展却很滞后.日本理化所的Shu ...

  6. 神经网络学习笔记-02-循环神经网络

    神经网络学习笔记-02-循环神经网络 本文是根据WildML的Recurrent Neural Networks Tutorial写的学习笔记. 循环神经网络 循环神经网络适用于处理序列化信息,比如: ...

  7. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

  8. Python中索引的学习笔记

    1 前言 今天在学习FaceBoxes- 看到一个比较奇怪的代码,"order = scores.argsort()[::-1][:args.top_k]",不太懂这个" ...

  9. 神经网络学习笔记(一) RBF径向基函数神经网络

    神经网络学习笔记(一) RBF径向基函数神经网络 2018年08月06日 13:34:26 吃机智豆长大的少女乙 阅读数:2735 RBF径向基函数神经网络 初学神经网络,以下为综合其他博主学习材料及 ...

  10. Python地理做图——学习笔记

    Python地理做图--学习笔记 GMT 绘制海岸线 绘制地形并叠加海岸线 地理信息数据格式在线转换网址 适用OSGEO4w可以实现tif转nc,转grd 绘制grd和nc 除了投影方式-X, gmt ...

最新文章

  1. 谁是 2021「IT 圈」年度 C 位?快来报名,彰显你的影响力!
  2. 灰暗而空虚的景色β(数学思维题)
  3. AngularJS学习笔记
  4. 牛客OI周赛15-普及组
  5. 蔡骏:17年前,我也只是个做着无聊工作的小青年
  6. 我用一篇文章,让你快速上手Kotlin
  7. 数据库,可不只是 CRUD!
  8. 开机动画,铃声添加制作
  9. linux怎么查看pid对应的进程,linux如何查看某个pid的进程?
  10. linux4755代表什么权限,CentOS下chmod 755和4755的区别是什么?
  11. uni-app app开发对接网易云信IM
  12. 幻灯片相册制作PhotoStage
  13. Python 气象数据分析
  14. Unity_粒子特效
  15. Windows10安装Markdown安装教程(超级详细)
  16. 地理信息系统(GIS)系列——绪论
  17. 网络编程-HttpURLConnection
  18. 移动、联通和电信运营商最新号段判断
  19. shell脚本编程笔记(九)—— 初识流编辑器 sed
  20. 使用class.getClassLoader().getResource()的注意事项

热门文章

  1. Postgre SQL学习
  2. 怎样用UE4把一个Actor直接打包成Pak
  3. java中cplex程序_Cplex中文教程全 PDF 下载
  4. fiddler使用文档
  5. matlab 3.BPF封装 巴特沃斯带通滤波器
  6. 最好用的HDR图像处理器——Photomatix Pro新功能介绍及使用教程
  7. 病毒分析之伪装360主动防御病毒分析_XiaoBa-20
  8. java IO 测试题
  9. xtwpro2编程器_XTW100编程器驱动软件
  10. 联想教学用计算机,联想多媒体电子教室解决方案