第一章 最小二乘法
tensorflow
是机器学习中一个优秀的框架,这一系列的教程是通过实例来介绍tensorflow
的使用。慢慢的对tensorflow
的一些重要的概念进行介绍,把tensorflow
的使用方法融入到各个算法中,而不是一味的去专门学习tensorflow
的使用。
张量
tensorflow
可以分成两个词, 一个是tensor
,另外一个是flow
, tensor
说的是数据模型, 把它叫做 张量
,flow
是一种流式的计算流行以后会慢慢的明白这种方式。
几种变量形式:
placeholder:占位符,通常是在训练的时候把数据
喂给
他们。Variable:求变量,我们在训练的过程中,就是为了求出这些值来。
constant:常变量,可以进行赋值计算等。
>>> import tensorflow as tf >>> a = tf.constant([3],name="a") >>> b = tf.constant([4],name="b") >>> c = a + b >>> sess = tf.Session() >>> sess.run(c) array([7], dtype=int32) >>> print c Tensor("add_1:0", shape=(1,), dtype=int32) >>>
constant
的计算过程,特别注意的是要得到变量具体的值,需要创建一个上下文sess = tf.Session()
才能访问到变量的资源。
评价函数和梯度上升下降
评价函数
是我们需要求解的方程,如在最小二乘法中评价函数为方差最小, 梯度下降
:是我们求解问题的方式,简单的认为是,我们沿着坡就能达到山的波峰或者波谷,波峰或者波谷代表了评价函数的最大值或最小值。
最小二乘法评价函数
用数学公式表示为:
$$\sum_{n=0}^N(y_i-a-bx_i)^2$$
用tensorflow
表示为:
X = tf.placeholder("float") Y = tf.placeholder("float") W = tf.Variable(rng.randn(), name="weight") b = tf.Variable(rng.randn(), name="bias") pred = tf.add(tf.multiply(X, W), b) cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
使用梯度,求得最值:
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
其中 learning_rate
为学习因子,代表梯度的步长。
代码如下所示:
import matplotlib matplotlib.use('Agg') import tensorflow as tf import numpy import matplotlib.pyplot as plt rng = numpy.random learning_rate = 0.01 training_epochs = 13 display_step = 1 train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167, 7.042,10.791,5.313,7.997,5.654,9.27,3.1]) train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221, 2.827,3.465,1.65,2.904,2.42,2.94,1.3]) n_samples = train_X.shape[0] X = tf.placeholder("float") Y = tf.placeholder("float") W = tf.Variable(rng.randn(), name="weight") b = tf.Variable(rng.randn(), name="bias") pred = tf.add(tf.multiply(X, W), b) cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for epoch in range(training_epochs): for (x, y) in zip(train_X, train_Y): sess.run(optimizer, feed_dict={X: x, Y: y}) if (epoch+1) % display_step == 0 or epoch == 0: c = sess.run(cost, feed_dict={X: train_X, Y:train_Y}) print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \ "W=", sess.run(W), "b=", sess.run(b)) plt.figure() plt.title('step:' + str(epoch)) plt.plot(train_X, train_Y, 'ro', label='Original data') plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line') plt.legend() out_png = '%d.png'%(epoch) plt.savefig(out_png, dpi=150) print("Optimization Finished!") training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y}) print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')
求解的过程如下:

转载请标明来之:http://www.bugingcode.com/
更多教程:阿猫学编程
所有评论
写了这么多年博客,收到的优秀评论少之又少。在这个属于 SNS 的时代也并不缺少向作者反馈的渠道。
撰写评论