Keras-人工神经网络--随机梯度下降法

2019-08-28  本文已影响0人  Jana_LU

一、概念

    人工神经网络是是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。这种模型可以适用于分类与回归。

    神经网络的优点:可以把非线性做的特别好,拟合能力特别强,只要宽度足够大,深度足够深,神经网络就可以拟合任何非线性的映射。

    神经网络的缺点:比较耗费资源,而且容易过拟合。

    神经网络主要应用: 图像识别,语音识别,自然语言处理等。

    人工智能领域有个概念,叫深度学习,深度学习的基础就是深度神经网络。

二、人工神经网络算法

人工神经网络主要有两种算法:

    1.反向传播算法(函数PyBrain())

        第一步,前向计算,确定人工神经网络结构,参数都附上随机值,不管这些值是多少,先把特征都输入。比如有三个输出,不管输出是多少,先得到计算的值。

        第二步,计算误差。假如要计算的是1,0, 0;结果是0.2,误差就是0.8;中间的是0.3,误差就是0.3;最后的是0.8,误差就是0.8;

        第三步,反向单层调整。梯度调整的过程,根据误差调整离输出层最近的一层的系数,利用梯度下降进行调整;

        第四步,传播。调整好后再调整下一层,一层层调整,直到进行一轮计算完成后,调整结束;然后不断进行迭代,直到模型达到收敛(条件为达到一定误差范围内就是收敛,也可以设置迭代次数,只要迭代次数到了,也可以认为是收敛的)

反向传播算法

    2.随机梯度下降法(Stochastic Gradient Decent)

        每次调整权值时,选取部分样本进行梯度下降。

        好处:收敛更快,计算更少

        缺点:容易陷入局部最优

三、应用神经网络注意事项

    1.易受离群点影响,易过拟合。这是回归类模型的一个通病,处理方法是正则化或者dropout。dropout就是在神经网络每层随机选择几个不同的节点,组成多个神经网络模型,通过投票选择最终的值,对于回归模型可以取平均。

    2.属性与结果要在0~1之间。而且结果是one-hot形式存在的

    3.输出结果要进行softmax转化。即让所有输出值的加和恒等于1,这样每个输出值就代表这个输出的概率。

dropout示意图

四、代码实现(部分代码)

神经网络模型

说明:这里用了adam优化器,也是随机梯度优化器的一种,计算速度比SGD更快;在拟合效果不理想的情况下,可以调整迭代次数nb_epoch 或 增加样本数量batch_size,可以通过更改优化器optimizer(比如将sgd改为adam),也可以调整学习率lr,但是lr相当于梯度下降里的α,学习率越大意味着很可能拟合不到最优点,所以lr不能取太大;所以这里用了增加迭代次数和随机抽样数量的方法,以达到最优效果。

源代码:

from keras.models import Sequential

from keras.layers.core import Dense,Activation

from keras.optimizers import SGD

mdl = Sequential() 

mdl.add(Dense(50,input_dim=len(f_v[0]))) 

mdl.add(Activation('sigmoid')) 

mdl.add(Dense(2))  # 输出维度设定 

mdl.add(Activation('softmax'))  

sgd = SGD(lr=0.05) 

mdl.compile(loss="mean_squared_error",optimizer="adam")

mdl.fit(X_train,np.array([[0,1] if i == 1 else [1,0] for i in Y_train]),nb_epoch=20000,batch_size=8999)

# nb_epoch 表示迭代的次数,合理取值; batch_size 随机梯度算法每次选取的数量,由于本样本数据量不是很大,所以取全部训练集 

xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)] 

for i in range(len(xy_lst)): 

    X_part = xy_lst[i][0] 

    Y_part = xy_lst[i][1] 

    Y_pred = mdl.predict_classes(X_part)  

    print(i) 

    print("NN",'--ACC',accuracy_score(Y_part,Y_pred)) 

    print("NN",'--REC',recall_score(Y_part,Y_pred)) 

    print("NN",'--F_score',f1_score(Y_part,Y_pred)) 

return 

上一篇下一篇

猜你喜欢

热点阅读