本文基于tensorflow官网教程(https://tensorflow.google.cn/guide/keras),
机器环境为ubuntu14.04LTS+tensorflow1.8.0

1.Keras模块配置

        Keras模块是tensorflow提供的一个高级api,主要有以下优点:用户友好,一致性强,通过keras模块可以更方便、


快捷地构建神经网络模型。keras默认储存训练好的神经网络的权重的方式是断点,如果要使用h5格式,需要指定。


#引入tensorflow、keras模块


import tensorflow as tf


from tensorflow import keras


#设置网络权重保存文件格式


#用来保存训练好的神经网络


save_format='h5'



2.建立模型

        keras模块通过指定神经网络中的层来建立模型。一个神经网路的模型通常是层的计算图。最常见的神经网络模型

是顺序型,即神经网络层的堆叠。

#建立神经网络模型
#指定顺序模型
model=keras.Sequential()
#添加层1 64节点 relu激活函数
model.add(keras.layers.Dense(64,activation='relu',input_shape=(1000,)))
#添加层2 64节点 relu激活函数
model.add(keras.layers.Dense(64,activation='relu'))
#添加层3 输出层 10节点 softmax激活函数
model.add(keras.layers.Dense(10,activation='softmax'))
#打印神经网络模型
#注意,要使用summary()打印网络模型,需要指定层1的输入维度
model.summary()
#指定顺序模型的另一种语法
#将每一层的参数作为顺序模型构造函数的参数
#反斜杠'\'代表换行符
'''
model=keras.Sequential([\
keras.layers.Dense(64,activation='relu',input_shape=(1000,)),\
keras.layers.Dense(64,activation='relu')],\
keras.layers.Dense(10,activation='softmax'))
'''

kera TensorFlow 预测 tensorflow keras模块_权重


        计算图:神经网络的模型与层还有节点的关系,add()添加的层是非输入层,因为输入层

只需要指定输入节点,Dense层是全连接层,全连接层的意思是前一层的某个节点与下一层

的所有节点都有连接,这样输入变量的维度是1000,隐藏层1有64个节点,有(1000+1)×64

=64064个权重需要根据训练集(及对应标签)优化,隐藏层1(64节点)与隐藏层2(64节点)

之间有(64+1)*64=4160个权重需要根据训练集(及对应标签)优化,隐藏层2(64节点)与

输出层(10节点)之间有(64+1)×10=650个权重需要根据训练集(及对应标签)优化。

        激活函数:激活函数的作用是使模型具有处理非线性数据的能力,如果模型的所有关系都

是线性加权,那么模型无法处理非线性数据。在计算图中,节点是计算,节点间的连接表明了

此计算与上一级计算的依赖关系。以上所有层间的权重都可以分别设置为可优化(利用训练集

改变其值)和不可优化(常数)。

        前向传播算法:输入-隐藏层1-隐藏层2-...-输出层,利用当前权重,将输入数据按神经网络

前进方向计算。即由输入值计算输出值。

        反向传播算法:由前向传播算法得到的输出值与标签做比较,按神经网络的反向,修改每

一层的权重。

        正则化选项:表征数据复杂程度的参数,防止复杂(隐藏层多,隐藏层的节点多)的神经

网络模型过度拟合训练集数据,而导致在测试集上的表现不好。

3.神经网络层的参数

        对于神经网络的每一层,有以下参数需要指定:层间的连接方式、层的节点数、激活函数、
正则化选项。
#指定某一层的参数
#创建非线性层(relu) 全连接 64节点
keras.layers.Dense(64,activation='relu')
#创建线性层 全连接 64节点 L1正则化
keras.layers.Dense(64,kernel_regularizer=keras.regularizers.l1(0.01))
#创建线性层 全连接 64节点 L2正则化
keras.layers.Dense(64,bias_regularizer=keras.regularizers.l2(0.01))

4.训练和评估神经网络

训练神经网络

#指定优化器,损失函数和参数
#损失函数为前向传播的计算值与标签值差异的计算方法
#参数metrics可以选为准确度或是交叉熵
model.compile(optimizer=tf.train.AdamOptimizer(0.001),loss=\
'categorical_crossentropy',metrics=['accuracy'])
#指定了模型的训练参数后需要将数据导入模型中
#数据可以使用公开数据集 也可以使用自己的实验数据
#对于曲线拟合,可以使用numpy生成一个函数的输入输出真值作为测试集,使用噪声生成
#一组数据作为训练集
#这里只为了说明神经网络的训练过程 使用随机数数据集
#使用numpy随机生成训练集
import numpy as np
#训练集有1000个数据,每个数据有32位,共有10个标签,每个
#数据对应一个标签
train_data=np.random((1000,32))
train_labels=np.random((1000,10))
model.fit(train_data,trian_labels,epochs=10,batch_size=32)


        建立一个分类问题的训练集,共有1000个数据,每个数据有32个因素,共有10个标签
每个数据对应一个标签。
        使用训练集数据和训练集标签训练模型,训练轮数为10,每一轮训练使用32个数据。
batch_size指定了每一轮训练使用的数据量,对于输入数据太多的情况,每一轮都使用所有
输入数据会导致计算代价太大,而且模型也容易过度拟合训练数据。因此一个比较好的方法是
在每一轮训练中使用一组训练集数据而不是所有数据。

评估神经网络

#增加验证集并指定使用验证集训练模型
'''
val_data=np.random((1000,32))
val_labels=np.random((1000,10))
model.fit(train_data,train_labels,epochs=10,batch_size=32,\
validation_data=(val_data,val_labels))
'''
#在测试集上评估模型
test_data=np.random((500,32))
test_labels=np.random((500,10))
model.evaluate(test_data,test_labels)
#使用模型做预测
model.predict(test_data)

        多输入所输出模型上文已经提到,在隐藏层1中指定输入节点个数就指定了输入值的维度,
在输出层中指定节点个数就指定了输出值的维度。如果要自己指定前向传播过程,那么需要对model类
进行继承,自行指定前向传播算法,同样的,如果要自行指定层,也需要对layers进行继承并自定义。
神经网络的训练中,如果想在每一轮训练完成打印当前进度或是一些损失值,准确度等有用信息,那么
需要指定回调函数。这里直接贴出官网的代码。

自定义模型:

函数定义:

kera TensorFlow 预测 tensorflow keras模块_数据_02


kera TensorFlow 预测 tensorflow keras模块_kera TensorFlow 预测_03


调用方法:

kera TensorFlow 预测 tensorflow keras模块_神经网络_04

自定义层:

函数定义:

kera TensorFlow 预测 tensorflow keras模块_神经网络_05


kera TensorFlow 预测 tensorflow keras模块_权重_06


调用方法:

kera TensorFlow 预测 tensorflow keras模块_神经网络_07

自定义回调函数:

函数定义:

kera TensorFlow 预测 tensorflow keras模块_数据_08


调用方法:

kera TensorFlow 预测 tensorflow keras模块_kera TensorFlow 预测_09


关于回调函数的使用在前面教程有实例。

5.保存和载入神经网络

只保存权重(即训练好的神经网络):

#保存权重到断点文件,断点文件为tensorflow默认的权重保存方法
#上文提到可以指定为h5文件 ./代表储存到当前路径
model.save_weights('./my_model')
#读取权重文件到新的神经网络,要求读取的网络结构和新的网络相同
model.load_weights('my_model')
#使用h5文件储存权重
model.save('my_model.h5',save_format='h5')
#读取h5文件到新的网络,同样要求结构相同
model.load_weights('my_model.h5')

只保存模型配置(即模型结构)

#保存神经网络模型结构
#使用json格式保存已有网络结构
json_string=model.to_json()
#读取json文件创建新的神经网络
fresh_model=keras.models.from_json(json_string)
#使用YAML格式保存已有网络结构
yaml_string=model.to_yaml()
#读取yaml格式文件创建新的神经网络
fresh_model=keras.models.from_yaml(yaml_string)

6.完整过程


1.创建模型(输入维度,模型层数,层的节点数,激活函数,正则化选项,层间连接方法等)
2.定义训练过程(优化器,损失函数,评估量等)
3.训练模型(指定训练集及标签,验证集及标签或验证集的分割率(可选),轮数,回调函数等)


4.保存训练好的模型或是网络结构

5.建立新的网络载入保存的数据

kera TensorFlow 预测 tensorflow keras模块_神经网络_10