目录
神经网络的训练过程包含以下几个步骤:
张量和标量的概念:
tensorflow 基础操作
pandas 读取数据并转化为矩阵
保存训练过程与载入训练数据
通过命令行参数控制
数据流图的概念
用TensorBoard查看数据流图
打开tensorboard工具
用训练好的模型进行预测
Keras实现神经网络模型
保存和载入Keras模型
keras和tensorflow中的方便与灵活度的取舍
另外一种保存数据模型的办法并能让其他语言调用模型
主流优化方法
1、输入数据
2、计算结果
3、计算误差
4、调整神经网络可变参数
5、再次训练
张量(tensor):神经网络中神经元节点接收输入数据后经过一定计算操作输出的结果对象;张量在神经网络模型图中表现为各层的节点的输出数据。
标量:普通的一个数字,就叫做标量(scalar)
张量的阶(rank)和形态(shape)
0阶:标量,()或者[]
1阶:向量,一维数组
2阶:二维数组
3阶:三维数组(以此类推)
tf.placeholder 定义占位符,如:输入 x, 输出y等(所为占位符,就是在编写程序的时候还不确定输入什么数,而是在程序运行的时候才会输入,编程时仅仅把这个节点先定义好,先“占个位置”)
tf.Variable 定义可变参数, 如:w
tf.Session() 定义sess变量,包含了一个TensorFlow的会话(session)对象。
会话对象管理神经网络的第一步,一般是要把所有的可变参数初始化,也就是给所有可变参数一个各自的初始值,用下面语句实现:
init = tf.global_variables_initializer
sees.run(init)
result = sess.run([x1, x2, x3, w1, w2, w3, y], feed_dict={x1: 90, x2: 80, x3: 70})
sess.run函数的第一个参数为一个数组,代表我们需要查看那些结果项,feed_dict:代表我们需要输入的数据。
四种变量
tf.GraphKeys.GLOBAL_VARIABLES #=> 'variables'
tf.GraphKeys.LOCAL_VARIABLES #=> 'local_variables'
tf.GraphKeys.MODEL_VARIABLES #=> 'model_variables'
tf.GraphKeys.TRAINABLE_VARIABLES #=> 'trainable_variables'
对于局部变量来说,其变量也是一种普通的变量,不过其定义在tf.GraphKeys.LOCAL_VARIABLES。通常该集合用于保存程序用于初始化的默认变量列表,因此local指定的变量在默认情况下不会保存。即不会保存到checkpoint中
fileData = pd.read_csv('data.csv', dtype=np.float32, header = None, usecols = (1, 2, 3, 4)
whoeData = fileData.as_matrix()
tf.train.Saver().save(sess, save_path=trainReseltPath)
tf.train.Saver().restore(sess, save_path=trainReseltPath)
调用了Tensorflow下train包中的Saver函数返回的Saver对象的save成员函数来进行保存,该函数的第一个参数需要传入当前的会话对象(在本程序中是sess),命名参数save_path中要传入保存位置。
载入训练数据只需要把函数换成restore即可。
import sys
argt = sys.argv
print(argt)
print("Parameter 1 : %s" % argt[1])
python demo.py abc
输出的变量argt(被赋值为sys.argv)的内容是一个一维数组,其中每一项均是在命令行中的参数(命令体python不包含在其中)。然后输出argt的下标为1的项,结果是abc。
在tensorflow中,我们用程序定义的模型都是用“数据流图”(DataflowGraph)来表示的,也称其为“计算图”,有时简称“图”。tensorflow的数据流图中,主要就是由张量、可变参数和操作这些要素组成的。
writer = tf.summary.FileWriter("graph", sess.graph)
调用tf.summary.FileWriter函数,就把当前的数据流图保存下来,第一个参数用于指定保存的目录,第二个参数用于保存哪一张数据流图,因为在程序中可以定义多张图,我们只使用了默认的图,所有直接传入sess.graph表示保存sess会话对象默认的图。
到达需要打开图文件的上一层文件夹子,然后用命令“tensorboard --logdir=path”来启动
y.eval(session=sess, feed_dict={x: predictData})
直接调用张量的eval函数,并在命名参数session中传入会话对象sess,在命名参数feed_dict中传入需要预测的输入数据。
model = k.models.Sequential()
定义一个model变量,调用上诉函数生成了一个顺序化的模型
model.add(k.layers.Dense(32, input_dim=4, activation='tanh'))
第一个参数是输入维度,第二个参数是输出纬度,第三个是激活函数
model.compile(loss='mean_squared_error', optimizer="RMSProp", metrics=['accuracy'])
complie函数用来设置误差函数和优化器等,metrics指定训练的指标,一般我们会指定为“['accuracy']”,即精确度
model.fit(xData, yTtain, epochs=10, batch_size=1, verbose=2)
fit函数用来进行训练,第一个值是输入的训练数据集,第二参数是输入的目标值,第三个参数epochs用于指定训练多少轮次,第四个参数batch_size用于指定训练多少批次后进行可变参数调节的梯度更新,这个主要影响可变参数的调整速度,因此也就会影响整个训练过程的速度,默认值是32,第五个参数verbose用于指定keras在训练过程中输出信息的频繁程度,0代表最少的输出信息,一般用2代表尽量多一点输出信息。
result = model.predict(xTestData)
predict函数用来进行预测。
model.save("model1.h5")
model.save_weights("model1Weights.h5")
第一条语句是把Keras格式的神经网络模型保存到文件“model1.h5”中,第二条语句是保存当前时刻神经网络的可变参数取值情况到文件“model1Weights.h5”中。对应的载入训练过程的程序语句如下
model = k.models.load_model("model1.h5")
model.load_weights("model1Weights.h5")
其中也要先后载入Keras模型和可变参数取值
keras有很多封装的接口,在方便的同时也存在一些弊端,我们不能够看到其中的细节,反而不利于精细的调节。应先充分掌握Tensorflow的基础知识和具体运用方法;在理解透彻的基础上,在真正应用中可以考虑使用Keras这类高级工具实现快速开发与测试。
1、调用tf.saved_model.builder.SavedModekBuilder("export")函数来生成用于保存神经网络模型的对象builder,并指定保存位置为程序执行目录下的export子目录。
2、调用builder.add_meta_graph_and_variables(sess, ["tag"])来指定保存会话对象sess中的默认数据流图和可变参数(这就是要保存模型的主要内容),并给它起一个标记名“tag",这个标记名以后将会在其他语言调用时会被应用到。
3、调用builder.save函数来执行保存操作
执行代码并选择保存模型后,会在当前目录下生成一个export子目录,其中包含了需要传递给其他语言程序的神经网络模型的相关文件。以后在其他语言调用时,要把这个文件夹整个复制到需要使用的计算机上。
GradientDescentOptimizer: 建议学习率0.001
AdagradOptimizer:建议学习率0.01
AdadeltaOptimizer:建议学习率1.0
RMSPropOptimizer:建议学习率0.001
AdamOptimizer:建议学习率0.001