神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。
(1)非线性 具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量;
(2)非局限性 联想记忆是非局限性的典型例子;
(3)非常定性
(4)非凸性
人工神经网络是并行分布式系统,克服了传统的基于逻辑符号的人工智能在处理直觉、非结构化信息方面的缺陷,具有自适应、自组织和实时学习的特点。
目前,已有近40种网络模型,有:反传网络、感知器、自组织映射、Hopfield网络、波耳兹曼机、适应谐振理论等。
(1)具有自学习功能;
(2)具有联想存储功能;
(3)具有高速寻找优化解的能力。
第一种方法是将数据集中的类别转为二进制
import pandas as pd
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import *
from sklearn.metrics import accuracy_score
from keras.utils import np_utils
# 数据集
raw_data = pd.read_csv('1_raw_data_13-12_22.03.16.txt',sep='\t',header=0) # 读取csv数据,并将第一行视为表头,返回DataFrame类型
data = raw_data.values
times=data[::,0]
features_data = raw_data[['channel2', 'channel8']]
features = features_data.values
labels = data[::,-1].astype(type) # 最后一列为特征值
#选取33%数据作为测试集,剩余为训练集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
# 类别标签独热编码
train_labels = np_utils.to_categorical(train_labels,8)
test_labels = np_utils.to_categorical(test_labels,8)
# 模型结构,采用tanh函数为激活函数,输入层为N个属性
# 下面为4层隐含层,每层的神经元个数依次为500,500,250,250
# 输入层对应N个属性
model = Sequential([
Dense(500,activation='tanh',input_shape=[2]), # 输入特征数目为2
Dense(500,activation='tanh'),
Dense(250,activation='tanh'),
Dense(250,activation='tanh'),
Dense(8, activation='softmax')]) # 输出的类别为8个,所以输出层8个节点
# 编译模型,定义损失函数loss,采用的优化器optimizer为Adam
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
#开始训练模型
model.fit(train_features,train_labels,batch_size=32,epochs=20) # 迭代20次
y_pre=model.predict(test_features).argmax(axis=1) # 开始预测,axis=1表示返回每行中数值(表示每个类别的概率)最大的下标,就是对应的标签
score = accuracy_score(test_labels, y_pre)
print("验证集 accuracy_score: %.4lf" % score)
第二种方法:不对数据集中的类别进行处理
import pandas as pd
from sklearn.model_selection import train_test_split
# 数据集
raw_data = pd.read_csv('1_raw_data_13-12_22.03.16.txt',sep='\t',header=0) # 读取csv数据,并将第一行视为表头,返回DataFrame类型
data = raw_data.values
times=data[::,0]
features_data = raw_data[['channel1', 'channel5']]
features = features_data.values
# label = data[::,-1] # 最后一列为特征值
labels = data[:,-1].astype(int)
#选取33%数据作为测试集,剩余为训练集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
# 特征数据标准化,转换为均值0,标准差为1的分布
mean=train_features.mean(axis=0)
std=train_features.std (axis=0 )
train_features= (train_features-mean) /std
test_features=(test_features-mean) /std
# 搭建模型
from keras.models import Sequential
from keras.layers import Dense,Dropout
# 构建一个模型对象
model = Sequential()
# 堆叠若干网络层构建网络
# dense当前层为全连接层
# 64为当前层的节点数
# activate激活函数,之名为tanh
# input_shape输入数据的维度,用元组表示,首层必须说明
# 下述为隐藏层1
model.add(Dense(64,activation='tanh',input_shape=(2,)))
# 下述为隐藏层2
model.add(Dense(128,activation='tanh'))
model.add(Dense(128,activation='tanh'))
model.add(Dense(128,activation='tanh'))
model.add(Dense(128,activation='tanh'))
model.add(Dense(128,activation='tanh'))
model.add(Dense(128,activation='tanh'))
model.add(Dense(128,activation='tanh'))
# 断开一些神经元的链接,防止过度拟合
# 隐藏层随机失活25%,为什么是随机失活,每一次都是随机的?
model.add(Dropout(0.25))
# 增加输出层
# 多类型的输出值,指定激活函数为softmax,返回一个由多个概率值组成的数组,每个概率值表示输出为某类的概率
# 8种类型的输出,
model.add(Dense(8,activation='softmax'))
# 配置网络
# 指定的损失函数是交叉熵损失函数
# 优化参数的方式是梯度下降发
# 监控指标列表
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=["accuracy"])
model.fit(train_features, train_labels, epochs=10, batch_size=1, verbose=2, validation_data=(test_features, test_labels))
# 返回记录的是各轮训练的情况,时间,训练集损失值,训练集精确度,验证集损失值,验证集精确率
## 模型评估
loss, accuracy = model.evaluate(test_features, test_labels, verbose=2)
print("loss ={},accuracy={}".format(loss,accuracy))
通过使用具体的例子来实现ANN,充分了解了人工神经网络相关历史,发展,以及演变的网络;后面会继续更深入地研究相关算法!