神经网络
介绍
我们知道,深度学习也是机器学习的一个范畴,所以它满足机器学习的基本思想:从数据中拟合出某种规律,只是它的模型结构与经典机器学习的模型不同,且具有特色:它的模型结构像人脑的神经元一样连接,所以我们也把这种结构叫做神经网络
结构
由数个神经元组成一层,整个神经网络由多个层组成,最开始的层叫做输入层,最后的层叫做输出层,输入层与输出层中间的叫做隐藏层,层与层之间互相连接
基本要素
作为机器学习的一种,深度学习当然也有模型性能评估函数,损失函数,优化方法,神经网络还有一个激活函数的概念,这个激活函数添加到某个神经网络的层上,将输入经过某种函数变化后再输出,常见的激活函数有sigmoid,relu等,不用着急,这些概念我们在之后的系列文章中都会反复提到
Keras
介绍
本系列教程将主要使用Keras库进行讲解,Keras是一个流行的python深度学习库,在许多人工智能竞赛中使用量都居于领先地位
导入
from keras.models import Sequential # 导入Sequential 模型 from keras.layers import Dense # 导入Dense层 import numpy as np
Sequential是一种存储神经网络的模型
Dense是全连接层,每个神经元都与上一层的所有神经元相连
定义网络
model = Sequential() model.add(Dense(6, input_dim=4, activation='relu')) model.add(Dense(1, activation='sigmoid'))
这行代码先创建了一个Sequential模型,然后往里面添加了两个全连接层,第一个全连接层的输入是4个神经元,这一层有6个神经元,激活函数是relu,第二个全连接层只有一个神经元,而它的输入由上一层自动判断,也就是6个神经元,激活函数是sigmoid
模型训练
# 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X, y, epochs=10, batch_size=32)
compile初始化了一些基本设置 ,定义了损失函数(loss),定义了优化器(optimizer),定义了评估模型性能的指标(metrics)
fit开始训练模型,epochs定义了训练批次,batch_size设置了每次训练提取的样本数(深度学习训练过程每次一般都是抽取训练集的一个子集,这样做往往可以提高模型训练速度)
前馈神经网络
特点
前一个神经元的输出是后一个神经元的输入,一般结构如下图所示
常见类型
感知机,全连接神经网络,深度神经网络,卷积神经网络
代码示例
from keras.models import Sequential from keras.layers import Dense import numpy as np # 生成一些示例数据 X = np.random.random((1000, 20)) y = np.random.randint(2, size=(1000, 1)) # 定义简单的前馈神经网络 model = Sequential() model.add(Dense(64, input_dim=20, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X, y, epochs=10, batch_size=32)
这段代码定义了一个最简单的前馈神经网络,整个模型结构有一个输入层(就是我们输入的数据,这个层没有添加到Sequential中),一个隐藏层,一个输出层
反馈神经网络
特点
某一个神经元的输入不只与前一个神经元有关,而是可能与之前的所有神经元有关
作用
反馈神经网络通常用来处理序列数据,如语音,文本等,因为这些数据通常跟前后文有关,我们需要反馈神经网络的结构来记忆前后文的关系
常见类型
循环神经网络,长短时记忆网络
代码示例
from keras.models import Sequential from keras.layers import SimpleRNN, Dense import numpy as np # 生成一些示例数据 X = np.random.random((1000, 10, 20)) # 1000个样本,每个样本有10个时间步,每个时间步有20个特征 y = np.random.randint(2, size=(1000, 1)) # 定义简单的反馈神经网络 model = Sequential() model.add(SimpleRNN(64, input_shape=(10, 20), activation='relu')) model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X, y, epochs=10, batch_size=32)
这段代码定义了一个最简单的反馈神经网络,隐藏层为RNN层,设置时间步为10,这意味着数据会在RNN层循环十次后再输入到下一层
结语
对于深度学习,我们主要要了解以下几个方面
- 神经网络中层与层的连接方式(前馈,反馈)
- 各种神经网络层的作用(卷积层,池化层)
- 激活函数(relu)
- 损失函数
- 优化方法