神经网络入门
主要从例子入手,实现向量数据的分类和回归问题。
一、神经网络的剖析
神经网络的四个方面:
(1)层:多个层组合形成网络(模型),将一个或多个输入张量转换为一个或多个输出张量,大多数层都有权重(利用随机梯度下降学到的一个或多个张量,包含网络的知识)。
注意:不同的张量格式和不同的数据处理类型要用到不同的层。例如:(samples, features)2D张量通常使用全连接层Dense来处理。(samples, timestep, features)3D张量序列数据
通常使用循环层LSTM来处理。图像数据4D张量,通常使用卷积层conv2D来处理。在keras中由函数式建模和序列建模(Sequential),只需要堆叠不同的层就可以,比较方面。
tensorflow2.3自带keras2.4而且有一些属性只能是tf自带的keras可用,keras2.4不支持多引擎了,所以直接都是用tf自带的keras。对于低版本的keras还是支持多引擎的。
(2)模型:深度学习模型是层构成的有向无环图。keras中可以使用最简单的线性堆叠,很快的就能建立一个模型。网络的拓扑结构:双分支网络、多头网络、Inception模块等。
选定了网络的拓扑结构,就可以理解为将可能性空间(机器学习的定义:在预定义的可能性空间里,利用反馈信号的指引来寻找输入数据的有用表示)限定为一系列特定的张量运算,将输入数据映射为输出数据。模型由层来组成的,层进行的是一系列的张量运算。
(3)损失函数与优化器:
损失函数(目标函数):衡量当前任务是否成功,需要将其最小化。但要注意过拟合问题。如何选择正确的损失函数十分重要,要使得损失函数和当前的任务相关,否则最终得到的结果可能不符合预期。一般的二分类问题可以使用二元交叉熵(binary crossentropy),多分类问题可以试用分类交叉熵(categorical crossentropy),回归问题可以使用均方误差(mean-squared error),序列学习问题可以使用联结主义时序分类(CTC, connectionist temporal classification)等。
优化器:决定如何基于损失函数对网络进行更新。
注意:多个输出的神经网络可能具有多个损失函数,但是梯度下降过程必须基于单个标量损失值,那么具有多个损失函数的网络,需要将所有损失进行再次操作,变为一个标量值。在计算损失的时候,特别要注意。
二、keras开发
(1)定义训练数据:输入张量和目标张量。
(2)定义层组成的网络(模型):将输入数据映射到目标。
(3)配置学习过程:选择损失函数、优化器和需要监控的指标。
(4)调用模型的fit方法在训练数据上进行迭代。
三、keras开发实例
下面会用三个例子来说明keras开发流程以及神经网络中的细节,代码在jupyter notebook运行,tensorflow2.3。
-
IMDB数据集进行电影评论的二分类
#%%
import tensorflow as tf
from tensorflow.keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000) #筛选出每条评论汇中,排名前10000的词。
#%%
print(train_data[0])
print(train_labels[0])
print(type(train_data))
#%%
t=[]
for sequence in train_data:
t.append(max(sequence))
print(max(t)) #两种是等价的
print(max([max(sequence) for sequence in train_data]))
#%%
word_index = imdb.get_word_index()
reverse_word_index = dict(
[(value, key) for (key, value) in word_index.items()])
decoded_review = ' '.join(
[revers