关闭

机器学习小试(1)TensorFlow的第一个程序

标签: 机器学习算法预测
402人阅读 评论(2) 收藏 举报
分类:

最近,因为项目需要开始接触机器学习。虽然在学校对神经网络等算法已有接触,但早已忘得差不多了。在学习TF之前,建议和我一样,先从理论背景开始看起。我随便搜索到这个视频教程,很全面:
http://mooc.guokr.com/note/16274/

一些概念

  1. 对数据进行预测/分类的算法很多,如线性回归/逻辑回归,神经网络模型只是其中的一种。
  2. TensorFlow(TF)是一个计算工具,与Numpy等Python库配合,可以进行复杂的科学计算。
  3. TF把计算工作分为准备/执行两个阶段。在准备阶段,涉及的矩阵、向量运算并不执行,而是将其执行关系变为“计划”存储起来。整体存储的计划有利于TF对其进行优化,自动分配到CPU与GPU上工作。
  4. 在准备阶段,只要使用了TF已经提供的各类核函数原型,就可让系统自动计算反向传播所需的偏微分、规划加权训练算法。这一步非常方便,使得代码中不再需要人工返回代价函数、代价函数的偏微分。

第一个线性回归程序

我们来实现一个含有128个特征的线性回归模型:

from __future__ import print_function
import tensorflow as tf
import numpy as np
n = 128;      # features
m = 10240;    # data  sets
#generate a m x n training input data
x_raw = np.random.rand(m,n)
#extension mat with a 1 column , standing for constant theta0
ones  = np.ones([m,1])
x_data = np.column_stack([ones,x_raw])
#generate random thetas
theta = np.random.rand(n+1,1);
theta = theta * 2 - 1;
#calc the y for each training sets
y_data = np.matmul(x_data, theta);
print ("theta = ",theta.T,"'\n")


### create tensorflow structure start
Weights = tf.Variable(np.random.rand(n+1,1).astype(np.float64))
y = tf.matmul(x_data, Weights);
loss = tf.reduce_mean(tf.square(y-y_data))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
### create tensorflow structure end ###

sess = tf.Session()
sess.run(init)          # Very important

for step in range(10000):
    sess.run(train)
    if step % 1000 == 0:
        print(step, sess.run(loss),sess.run(tf.matrix_transpose(Weights)))

执行结果:

theta =  [[-0.80665497 -0.40706353 -0.37761216 ...,  0.65120158 -0.63642329
   0.57260276]] '

0 112.51848133 [[-0.49501238  0.43201934  0.00480166 ...,  0.11337306 -0.10528878
   0.52174486]]
1000 0.168146119232 [[-0.82618873 -0.27271341 -0.37158313 ...,  0.53085349 -0.55767108
   0.51410246]]
2000 0.00666182695066 [[-0.8286265  -0.37849185 -0.38191747 ...,  0.63142187 -0.62048383
   0.55830972]]
3000 0.000293393778021 [[-0.8282109  -0.40045689 -0.37905998 ...,  0.64834207 -0.63311107
   0.56955442]]
4000 1.50198864068e-05 [[-0.82729713 -0.40528635 -0.37776924 ...,  0.65103949 -0.63555686
   0.5722022 ]]
5000 1.69560505968e-06 [[-0.82632623 -0.40639715 -0.37741158 ...,  0.65142738 -0.63602249
   0.57279029]]
6000 9.33044122985e-07 [[-0.82538174 -0.40666756 -0.37733408 ...,  0.65146524 -0.63611686
   0.57290744]]
7000 8.13146604533e-07 [[-0.82447858 -0.40674281 -0.37732706 ...,  0.65145661 -0.63614405
   0.5729203 ]]
8000 7.34752335864e-07 [[-0.82361809 -0.40677164 -0.37733615 ...,  0.65144394 -0.63615934
   0.57291092]]
9000 6.65400707021e-07 [[-0.82279896 -0.40678893 -0.37734842 ...,  0.65143191 -0.63617228
   0.57289731]]

可以发现,对含有128个变量的线性回归问题,梯度下降10000次即可达到1e-7的收敛程度。代码量与Ocatve相仿,还是很方便的。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:307839次
    • 积分:4327
    • 等级:
    • 排名:第7309名
    • 原创:87篇
    • 转载:3篇
    • 译文:0篇
    • 评论:327条