首页 > 其他分享 >深度神经网络

深度神经网络

时间:2023-08-08 21:02:08浏览次数:42  
标签:grad self 神经网络 深度 np input data dropout

需要解决的问题: 1、掉入局部最优解的陷阱 2、过拟合(陷入对特定模式的数据进行最优化,无法对未知输入进行正确的预测) 3、梯度消失——使用ReLU作为激励函数 4、学习时间过长 一些解决方案: 1、更换最优化算法 2、批次尺寸最优化 3、对超参数的最优化(神经网络层数、神经元个数、学习系数) 4、正则化(对权重加以限制,如对权重设置上限值/使权重产生衰减) 5、对权重初始值的最优化 (这里解释了前面为什么使用随机数,避免网络梯度都一样&&网络表现能力丧失,该书选择都用N~(0,0.01)对权重初始化) 6、提前终止(即决定epoch次数) 7、数据扩张(对样本数据进行加工产生新样本,例如GAN???) 8、Dropout(按一定概率随机消除输出层以外的神经元) 9、数据预处理:常用方法 (1)正规化 def normalize(x): x_max = np.max(x) x_min = np.min(x) return (x-x_min)/(x_max-x_min) (2)标准化(之后,学习过程会变得稳定且快速) def standardize(x): ave = np.average(x) std = np.std(x) return (x-ave)/std (3)去相关化 (4)白化   例:以鸢尾花数据集为例,使用深度神经网络进行分类 前提: 中间层激励函数:ReLU 输出层激励函数:SoftMax 损失函数:交叉熵误差 最优化算法:随机梯度下降法 批次尺寸:8(小批次法) 中间层神经元数量:25 中间层数:2 n=150/2=75 每轮epoch中更新的次数75/8≈9   步骤: 1、获取数据集、预处理 2、实现各个网络层 3、实现神经网络 4、使用最小批次法进行学习 5、统计正确率  

from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt

# 一、数据集导入和数据预处理
iris_data = datasets.load_iris()
input_data = iris_data.data
correct = iris_data.target

n_data = len(correct)

# 标准化处理
ave_input = np.average(input_data,axis = 0) #是矩阵
std_input = np.std(input_data,axis = 0) #是向量
input_data = (input_data-ave_input)/std_input

# 将数据转化为独热编码格式
correct_data = np.zeros((n_data,3))
for i in range(n_data):
    correct_data[i,correct[i]] = 1.0

# 分割训练集和测试集
index = np.arange(n_data)
index_train = index[index%2==0]
index_test = index[index%2 !=0]

input_train = input_data[index_train,:]
correct_train = correct_data[index_train,:]
input_test = input_data[index_test,:]
correct_test = correct_data[index_test,:]

n_train = input_train.shape[0]
n_test = input_test.shape[0]

#基础值的设置
n_in = 4
n_mid = 25
n_out = 3

wb_width = 0.1 #权重和偏置的分散度
eta = 0.01
epoch = 1000 #为了时间和性能考虑,测试时可以只设置100,但是自己跑毕设实验得原数据!!!
batch_size = 8
interval = 100

# 二、各个网络层的实现,抽象出基类,感觉更多的东西可以被抽象???
#神经层的基类
class BaseLayer:
    def __init__(self,n_upper,n):
        self.w = wb_width * np.random.randn(n_upper,n)
        self.b = wb_width * np.random.randn(n)
        
    def update(self,eta):
        self.w -= eta*self.grad_w
        self.b -= eta*self.grad_b 
        
class MiddleLayer(BaseLayer):
    def forward(self,x):
        self.x = x
        self.u = np.dot(x,self.w) + self.b   #这里的u加上了self是因为有多个中间层!输出层只有一个所以不用self来约束
        self.y = np.where(self.u <=0,0,self.u)   #使用ReLU
    
    def backward(self,grad_y):
        delta = grad_y * np.where(self.u<=0,0,1)  #ReLU 的微分
        self.grad_w = np.dot(self.x.T,delta)
        self.grad_b = np.sum(delta,axis=0)
        self.grad_x = np.dot(delta,self.w.T)
        
class OutputLayer(BaseLayer):        
    def forward(self,x):
        self.x = x
        u = np.dot(x,self.w) + self.b
        self.y = np.exp(u)/np.sum(np.exp(u),axis=1,keepdims=True)   #使用SoftMax
    
    def backward(self,t):
        delta = self.y -t  #SoftMax 的微分
        self.grad_w = np.dot(self.x.T,delta)
        self.grad_b = np.sum(delta,axis=0)
        self.grad_x = np.dot(delta,self.w.T)

#三、神经网络的实现
middle_layer_1 = MiddleLayer(n_in,n_mid)
middle_layer_2 = MiddleLayer(n_mid,n_mid)
output_layer = OutputLayer(n_mid,n_out)

#由于有多层 所以对于正向处理和反向处理这些都封装一下
def forward_propagation(x):
    middle_layer_1.forward(x)
    middle_layer_2.forward(middle_layer_1.y)
    output_layer.forward(middle_layer_2.y)
    
def backward_propagation(t):
    output_layer.backward(t)
    middle_layer_2.backward(output_layer.grad_x)
    middle_layer_1.backward(middle_layer_2.grad_x)
    
def update_wb():
    middle_layer_1.update(eta)
    middle_layer_2.update(eta)
    output_layer.update(eta)
    
#计算交叉熵误差
def get_error(t,batch_size):
    return -np.sum(t*np.log(output_layer.y+1e-7))/batch_size

#记录误差
train_error_x = []
train_error_y = []
test_error_x = []
test_error_y = []

#记录学习的过程和经过
n_batch = n_train // batch_size  #取整数部分参与计算,每一轮epoch的批次尺寸
for i in range(epoch):
    #误差的统计和测算
    forward_propagation(input_train)
    error_train = get_error(correct_train,n_train)
    forward_propagation(input_test)
    error_test = get_error(correct_test,n_test)
    #误差的记录
    test_error_x.append(i)
    test_error_y.append(error_test)
    train_error_x.append(i)
    train_error_y.append(error_train)
    #进度的显示
    if i%interval==0:
        print("Epoch:"+str(i)+"/"+str(epoch),"Error_train:"+str(error_train),"Error_test:"+str(error_test))
    
    #学习
    index_random = np.arange(n_train)  #打乱索引值 这里也是基于随机梯度下降法
    np.random.shuffle(index_random)
    for j in range(n_batch):
        #取出最小批次
        mb_index= index_random[j*batch_size:(j+1)*batch_size]
        x = input_train[mb_index,:]
        t = correct_train[mb_index,:]
        
        forward_propagation(x)
        backward_propagation(t)
        
        update_wb()
        
    plt.plot(train_error_x,train_error_y,label="Train")
    plt.plot(test_error_x,test_error_y,label="Test")
    plt.legend() #设置图例

    plt.xlabel("Epoches")
    plt.ylabel("Error")

    plt.show()

# 计算正确率
forward_propagation(input_train)
count_train = np.sum(np.argmax(output_layer.y,axis=1) == np.argmax(correct_train,axis=1))

forward_propagation(input_test)
count_test = np.sum(np.argmax(output_layer.y,axis=1) == np.argmax(correct_test,axis=1))
print("Accuracy Train:"+str(count_train/n_train*100)+"%","Accuracy Test:"+str(count_test/n_test*100)+"%")
(调整epoch)运行代码后观察图像,显然出现了过拟合的问题   应对过拟合: 四种尝试比较的策略 (1)随机梯度下降法 (2)AdaGrad算法 (3)随机梯度下降法+Dropout机制 (4)AdaGrad算法+Dropout机制   A.AdaGrad算法的实现——修改BaseLayer
class BaseLayer:
    def __init__(self,n_upper,n):
        self.w = wb_width * np.random.randn(n_upper,n)
        self.b = wb_width * np.random.randn(n)
        
        self.h_w = np.zeros((n_upper,n))+1e-8
        self.h_b = np.zeros(n)+1e-8
        
    def update(self,eta):
        self.h_w += self.grad_w*self.grad_w
        self.h_b += self.grad_b*self.grad_b
        
        self.w -= eta/np.sqrt(self.h_w)*self.grad_w
        self.b -= eta/np.sqrt(self.h_b)*self.grad_b
        
B.Dropout的实现
#封装一个Dropout层 放在每一个中间层后面
class Dropout:
    def __init__(self,dropout_ratio):
         self.dropout_ratio = dropout_ratio
    
    def forward(self,x,is_train):
        if is_train: 
            #学习时,创建与输入具有相同形状的随机数矩阵
            rand = np.random.rand(*x.shape)
            #将对应的神经元设置为有效1,无效0,保存在self.dropout矩阵中
            self.dropout = np.where(rand>self.dropout_ratio,1,0) 
            self.y = x*self.dropout #将上层网络中的神经元随机设置成无效的
        else:
            self.y = (1-self.dropout_ratio)*x #使输出下降
            
    def backward(self,grad_y):
        self.grad_x = grad_y*self.dropout #确保不会对无效的神经元进行反向传播处理
        
   ##中间层加入时这样做:
   dropout_1 = Dropout(0.5)   
   
   ##正向传播中
   dropout_1.forward(middle_layer_1,is_train) 
   middle_layer_2.forward(dropout_1.y) 
   
   ##反向传播中
   dropout_2.backward(output_layer.grad_x) 
   middle_layer_2.backward(dropout_2.grad_x) 
   

标签:grad,self,神经网络,深度,np,input,data,dropout
From: https://www.cnblogs.com/bbnltxdy/p/17615347.html

相关文章

  • 卷积神经网络
    卷积神经网络CNN——常用于图像识别(1)卷积层·卷积——通过对图像进行卷积运算,可以对图像的某个特征进行选择性的增强或减弱·图像的局部性——各个像素点与其附近的像素点之间具有强关联——卷积层利用此对图像的特征进行检测·图像的张数——RGB就是三个,即通道数,单色图......
  • LSTM长短期记忆递归神经网络
    0.什么是LSTMLSTM,全称LongShortTermMemory(长短期记忆)是一种特殊的递归神经网络 。这种网络与一般的前馈神经网络不同,LSTM可以利用时间序列对输入进行分析;简而言之,当使用前馈神经网络时,神经网络会认为我们t 时刻输入的内容与 t+1 时刻输入的内容完全无关,对于许多......
  • 准确预测极端降水,哥伦比亚大学推出升级版神经网络 Org-NN
    内容一览:随着环境变化加剧,近年来全球极端天气现象频频出现,准确预测降水强度对人类以及自然环境都十分重要。传统模型预测降水的方差较小,偏向小雨,对极端降水预测不足。关键词:极端天气内隐学习神经网络:::hljs-center本文首发于HyperAI超神经微信公众平台~:::受台风「......
  • 4.深度学习(1) --神经网络编程入门
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 论文解读:《基于深度多核学习的用于识别 DNA n4 -甲基胞嘧啶位点的高阶模糊推理系统》
    Title:Adeepmultiplekernellearning-basedhigher-orderfuzzyinferencesystemforidentifyingDNAN4-methylcytosinesites期刊:InformationSciences中科院分区:一区(计算机科学技术)影像因子:8.1↓0.133文章链接:https://doi.org/10.1016/j.ins.2023.01.149Websever:Github:......
  • 易基因:m5C RNA甲基转移酶及其在癌症中的潜在作用机制|深度综述
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。近年来,5-甲基胞嘧啶(m5C)RNA修饰已成为通过编码和非编码RNA调控RNA代谢和功能的关键参与者。越来越多的证据表明,m5C可以调控RNA稳定性、翻译、转录、出核和切割,以及介导细胞增殖、分化、凋亡、应激反应和其他生物学功能......
  • 深度学习的一些基础函数
    上半年学习的一些记录主要参考的书:《写给新手的深度学习:用Python学习神经网络和反向传播》 Numpy:linspacereshape广播机制(数组在某一轴上扩展,值和原来一样,扩展之后可以和其他维度的数组做基本计算)切片transpose调换轴其中transpose(1,0)等价于T(转置)——略怪指定轴a......
  • 神经网络相关(1)
    神经网络权重w偏置b激励函数f=Σxw+b上层网络→下层网络m*n矩阵代表权重矩阵;偏置的数量和下层网络的神经元数量一致,为n;u=np.dot(x,w)+b一般来说,输出层的神经元数量n个,则用n阶形式的独热编码格式数据来表示 几种激励函数:1、阶跃函数阶梯型函数,类似分段函数但......
  • 神经网络相关(2)
    多个神经元的实现——回归问题:  %matplotlibinline#IPython的魔法函数,可以在IPython编译器里直接使用,作用是内嵌画图,省略掉plt.show()这一步,直接显示图像importnumpyasnpimportmatplotlib.pyplotaspltX=np.arange(-1.0,1.0,0.2)Y=np.arange(-1.0,1.0......
  • 检测数组深度,数据深度,几维数组
    /** * 检测数据的深度 * @param $array 要检测的数组 * @return int   返回深度值 */function array_depth($array){    $max_depth = 1;    foreach ($array as $value) {        if (is_array($value)) {          ......