人工神经网络学习

理论

ANN大致知识

基本概念

神经网络由输入层(input layer),隐藏层(hidden layers),输出层(output layer)三部分组成,如下图。
输入层(input layer)是由训练集的样本特征向量传入。
每层由神经元(neuron)或单元(unit)组成。

经过连接节点的权重(weight)传入下一层,上一层的输出是下一层的输入,一层中的加权求和,然后根据非线性方程转化为下一层的输入。

即一个神经元,可以把它分成左半球和右半球两部分。左半球为上一层加权求和的结果,为此神经元的输入。右半球为加权求和结果即左半球值通过非线性方程转化后的值,为此神经元的输出

将神经元图中的所有变量用符号表示,并且写出输出的计算公式的话,就是下图。

激活函数

这个非线性方程就是激活函数,通过激活函数就可以把线性的值转成非线性的值。
常用的激活函数有三种,Sigmoid,Tanh和ReLU。其中sklearn中神经网络默认选择的是ReLU。

MLP (Multi-Layer Perceptron) 多层感知器

MLP为多层感知器,我们首先来看只有一个隐含层的MLP,如下图。

和上面介绍过的一样,h0的输入值就是x0w00+x1w10+x2w20+x3w30,输出值就是用激活函数,即tanh(x0w00+x1w10+x2w20+x3w30)。 最后y的值就是前一层即隐含层的权重和

多层MLP即包含多个隐含层。

算法

在sklearn中有三种算法。

lbfgs, sgd, adam。

adam适用于较大的数据集,lbfgs适用于较小的数据集。

代码实现

数据处理

使用经典的KDD Cup 1999 Data作为数据集。

python的pandas包导入数据。

下面是部分核心算法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- coding:utf-8 -*-
# -*- author:altman -*-
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import time

dataset=pd.read_csv('kddcup.data')
# In[ ]:
def trans(type):#讲数据类型二分
if type!='normal.':
type='attack'
return type

def label(x,cols):
for i in cols:
label=LabelEncoder()
x[:,i]=label.fit_transform(x[:,i])
dataset['normal.']=dataset['normal.'].apply(trans)
#把标签和前面的特征分开,x作为特征,y作为相应的标签
x = dataset.iloc[:, :-1].values
#第1,2,3列不是数值型的特征,我们用LabelEncoder对其进行编码
cols1=[1,2,3]
label(x, cols1)
cols2=[1,4,70]
#对第1列进行OneHot编码,只有三种情况(tcp,udp,icmp),因而原来的第二列就被推到了第四列,以此类推,对前三列进行OneHot编码
for i in cols2:
onehot=OneHotEncoder(categorical_features=[i])
x=onehot.fit_transform(x).toarray()
#对标签再进行编码
y = dataset.iloc[:, 41].values
labely=LabelEncoder()
y=labely.fit_transform(y)

#划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.25, random_state = 0)

训练

1
2
3
4
5
6
unit = 5 #设置5个神经元
t=time.time()
ann_model = MLPClassifier(hidden_layer_sizes=[unit], activation='logistic', solver='lbfgs', random_state=0)
#选择logistic函数,lbfgs算法
ann_model.fit(x_train, y_train)
print('神经元个数{},准确率:{:.5f},用时:{:.3f}'.format(unit, ann_model.score(x_test, y_test),time.time()-t))

结果

用完整数据集跑时间和准确率都很理想。

参考

https://yq.aliyun.com/articles/109852

https://blog.csdn.net/zxfhahaha/article/details/80196431

https://blog.csdn.net/Summer_And_Opencv/article/details/72802158