个人理解,深度学习模型其实保存的是权重和偏置。构建最好的网络,就是要找到特定情况下最好的偏置和权重。
模型训练开始前一般都会初始化网络中的权重和偏置,当然,当前的权重和偏置不是最终模型中的值,这些值需要在训练过程中不断的更新,最后达到一个更为“乐观”的情况。
模型训练时,一般都有对应的训练数据,也就是对应的数据和标签。数据用于输入你构建的神经网络。输出的结果与标签做比对(也就是计算损失),然后再通过反向传播的方法,依次寻找每一层神经网络中,每个节点的权重值和偏置对这种误差损失的“贡献”,然后通过一定方法更新参数。
模型已经训练好,通过计算,准确率也可以达到一定的值。那么预测的时候,就需要将数据按照神经网络输入数据的特定格式进行输入,然后再输出结果。当然也会出现错误的情况,根据上述的简介,我们可以清楚的之后没有能达到百分之百准确的模型。
我会通过一个函数的例子带大家初步了解TensorFlow和简单的例子,体会模型是如何去训练的。
首先我们使用numpy 随机生成一百个点,然后再构建一个函数,作为我们要训练模型所要达到的目标
#使用numppy 生成一百个随机点
x_data =np.random.rand(100)
y_data = x_data *0.1+0.2
那么y_data 使用做监督的数据,也就是“标签”。接下来我们构建初始化的权重和偏置
#构造一个线性模型
b=tf.Variable(0.)
k=tf.Variable(0.)
k表示权重,b表示偏执,训练后,我们希望k无限接近于0.1,b无限接近于0.2。然后我们需要确定计算损失的函数,学习率,梯度优化下降得方法等。如果对这些概念不是很清楚,我推荐大家去看一本书《深度学习入门:基于Python的理论与实现》。
下面是设置这些方法的代码:
#计算损失,均方差
loss = tf.reduce_mean(tf.square(y_data-y))
#定义一个梯度下降方法的训练优化器
optimizer = tf.train.GradientDescentOptimizer(0.1) #传入的参数是学习率
#最小化待见函数
train = optimizer.minimize(loss)
init = tf.global_variables_initializer() #初始化变量
然后使用TensorFlow训练这个模型,因为训练一次对参数的影响并不大,所以每训练一百次输出一次权重和偏执。
with tf.Session() as sess:
sess.run(init)
for step in range(2001):
sess.run(train)
if step%100 ==0:
print(step,sess.run([k,b]))
这里我训练了2000次,然后我们查看输出结果:
第一个参数代表权重,第二个代表偏置两个值都无线接近于0.1,0.2(我们一开始设置的值)。
下面是完整代码:
import tensorflow as tf
import numpy as np
#使用numppy 生成一百个随机点
x_data =np.random.rand(100)
y_data = x_data *0.1+0.2
#构造一个线性模型
b=tf.Variable(0.)
k=tf.Variable(0.)
y= k*x_data +b
#计算损失,均方差
loss = tf.reduce_mean(tf.square(y_data-y))
#定义一个梯度下降方法的训练优化器
optimizer = tf.train.GradientDescentOptimizer(0.1) #传入的参数是学习率
#最小化待见函数
train = optimizer.minimize(loss)
init = tf.global_variables_initializer() #初始化变量
with tf.Session() as sess:
sess.run(init)
for step in range(2001):
sess.run(train)
if step%100 ==0:
print(step,sess.run([k,b]))
本人小白刚开始学习,如果有错误的地方还请各位指正。谢谢。