神经网络的核心组件:层,网络,目标函数和优化器。
训练神经网络主要围绕,1:层。多个层组合成网络(或模型);2:输入数据数据和相应的目标;3:损失函数(用于学习的反信号);4:优化器,决定学习过程如何进行。训练过程如图所示
多个层链接在一起组成网络,将输入数据映射为预测值。然后损失函数将这些预测值与目标进行比较,得到损失值,用于衡量网络预测值与预期结果的匹配程度,优化器使用这个损失值来更新网络的权重。
层
层是神经网络的基本数据结构。层是一个数据处理模块,将一个或多个输入张量转换为一个或多个输出张量。
不同的张量格式与不同的数据处理类型需要用不同的层。
1 简单的向量数据保存在形状为(Samples,feature)2D的张量中,通常用密集连接层,对应kears的Dense类。
2 序列数据保存在形状为(samples,timesteps,feature)的3D张量中,比如Keras的LSTM层。
3 图像数据保存在4D张量中,通常用二维卷积层(Keras的Conv2D)来处理。
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(16, input_shape=(10000,))) # 第一层
model.add(layers.Dense(16)) #第二层
上述代码的意思是第一层,只接受第一个维度大小为10000的2D张量作为输入,这个层将返回一个张量,第一维度大小变为16。这个层后面只能连接一个接受32维向量作为输入的层,这里keras会自动定义输入形状。
模型:层构成的网络
深度学习模型是层构成的有向无环图。网络拓扑结构定义了假设空间,将输入数据映射为输出数据。常见的网络拓扑结构有线性堆叠、多分支网络、多头网络、Inception模块。
损失函数和优化器
对于分类、回归、序列预测等常见问题遵循以下指导原则来选择正确的损失函数
1 对于二分类问题,你可以使用二元交叉熵(binary crossentropy)损失函数;
2 对于多分类问题,可以使用分类交叉熵(categorical crossentropy)损失函数;
3 对于回归问题,可以使用均方误差(mean-squared error)损失函数;
4 对于序列学习问题,可以使用联结主义时序分类(CTC)损失函数
Keras开发工作流程
1 定义训练数据:输入张量和目标张量。
2 定义层组成的网络(或模型)、将输入映射到目标。
3 配置学习过程:选择损失函数、优化器和需要监控的指标。
4 调用模型的fit方法在训练数据上进行迭代。
定义模型有两种方法:一是使用Sequential类(仅用于层的线性堆叠),另一种是函数式API。
使用使用Sequential类定义两层模型。
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
使用函数式API定义相同的模型
imput_tensor = layers.Input(shape=(784,))
x = layers.Dense(32,activation='relu')(input_tensor)
output_tensor = layers.Dense(10,activation='softmax')(x)
model = models.model(inputs=imput_tensor,outputs=output_tensor)
配置学习过程,指定模型使用的优化器和损失函数。例:单一损失函数
model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss=losses.binary_crossentropy, metrics=['accuracy'])
最后学习过程通过fit()方法将输入的数据的Numpy数组(和对应的目标数据)传入模型。