Tensorflow的基本使用 以线性回归为例

参考来源:博客链接

使用线性模型来对数据点进行建模。线性模型的数学表示是:

  y = W.x + b
   Where:
   x: house size, in sqm
   y: predicted house price, in $

(1) Tensors
TensorFlow中使用tensor数据结构(实际上就是一个多维数据)表示所有的数据,并在图计算中的节点之间传递数据一个tensor具有固定的类型、级别和大小,更加深入理解这些概念可参考Rank, Shape, and Type

(2) 在线性模型中,tensorflow 的基本组件是:

  • 占位符(Placeholder)- 表示执行梯度下降时将实际数据值输入到模型中的一个入口点。例如房子面积 (x) 和房价 (y_),

     x=tf.placeholder(tf.float32,[None,1])
     y_=tf.placeholder(tf.float32,[None,1])
    
  • 变量:表示我们试图寻找的能够使成本函数降到最小的 「good」值的变量,例如 W 和 b,

     W=tf.Variable(tf.zeros([1,1]))
     b=tf.Variable(tf.zeros[1]))
     y=tf.matmul(x,W)+b    
    
  • 成本函数:

     cost=tf.reduce_sum(tf.pow((y_ - y),2))   
    
  • 梯度下降:有了线性模型、成本函数和数据,我们就可以开始执行梯度下降从而最小化代价函数,以获得 W、b 的「good」值。

     train_step = tf.train.GradientDescentOptimizer(0.00001).minimize(cost)  
    

0.00001 是我们每次进行训练时在最陡的梯度方向上所采取的「步」长;它也被称作学习率(learning rate).

(3)训练模型
训练包含以预先确定好的次数执行梯度下降,或者是直到成本函数低于某个预先确定的临界值为止。TensorFlow的使用,所有变量都需要在训练开始时进行初始化,否则它们可能会带有之前执行过程中的残余值。

    init = tf.initialize_all_variables()  

虽然 TensorFlow 是一个 Python 库,Python 是一种解释性的语言,但是默认情况下不把 TensorFlow 运算用作解释性能的原因,因此不执行上面的 init 。相反 TensorFlow 是在一个会话中进行;创建一个会话 (sess) 然后使用 sess.run() 去执行.

       sess = tf.Session()
       sess.run(init) 

完整代码

import numpy as np
import tensorflow as tf

# Model linear regression y = Wx + b
x = tf.placeholder(tf.float32, [None, 1])
W = tf.Variable(tf.zeros([1,1]))
b = tf.Variable(tf.zeros([1]))
product = tf.matmul(x,W)
y = product + b
y_ = tf.placeholder(tf.float32, [None, 1])

# Cost function sum((y_-y)**2)
cost = tf.reduce_mean(tf.square(y_-y))

# Training using Gradient Descent to minimize cost
train_step = tf.train.GradientDescentOptimizer(0.0000001).minimize(cost)

sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
steps = 1000
for i in range(steps):
 # Create fake data for y = W.x + b where W = 2, b = 0
 xs = np.array([[i]])
 ys = np.array([[2*i]])
 # Train
 feed = { x: xs, y_: ys }
 sess.run(train_step, feed_dict=feed)
 print("After %d iteration:" % i)
 print("W: %f" % sess.run(W))
 print("b: %f" % sess.run(b))
 # Suggested by @jihobak
 print("cost: %f" % sess.run(cost, feed_dict=feed))

# NOTE: W should be close to 2, and b should be close to 0

在上面的训练中,我们在每个 epoch 送入单个数据点,这被称为随机梯度下降(stochastic gradient descent)。我们也可以在每个 epoch 送入一堆数据点,这被称为 mini-batch 梯度下降,或者甚至在一个 epoch 一次性送入所有的数据点,这被称为 batch 梯度下降。
请看下图的比较,注意这 3 张图的 2 处不同:

  • 每个 epoch 送入 TensorFlow 图(TF.Graph)的数据点的数量(图右上方)
  • 梯度下降优化在调整 W 和 b 值时所考虑的数据点的数量(图右下方)


    随机梯度下降

    mini-batch 梯度下降

    batch梯度下降

    要在随机/mini-batch/batch 梯度下降之间切换,我们只需要在将数据点送入训练步骤[D]之前将这些数据点分成不同的 batch 大小,即为 [C] 使用如下的代码片段:

# * all_xs: 所有的特征值
# * all_ys: 所有的输出值
# datapoint_size: all_xs/all_ys 中点/项的数量
# batch_size: 配置如下:
#             1: 随机模型
#            integer < datapoint_size: mini-batch模式
#             datapoint_size: batch模式
# i: 当前epoch数量

if datapoint_size == batch_size:
   Batch 模式,所以选择所有数据点从 index 0 开始
  batch_start_idx = 0
elif datapoint_size < batch_size:
   不可能
  raise ValueError(“datapoint_size: %d, must be greater than         
                    batch_size: %d” % (datapoint_size, batch_size))
else:
   随机/mini-batch模式: 从所有可能的数据点中分批选择数据点
  batch_start_idx = (i * batch_size) % (datapoint_size — batch_size)
  batch_end_idx = batch_start_idx + batch_size
  batch_xs = all_xs[batch_start_idx:batch_end_idx]
  batch_ys = all_ys[batch_start_idx:batch_end_idx]

 将分批的数据点定义为xs, ys, 它们会被送入 'train_step'训练步骤
xs = np.array(batch_xs)
ys = np.array(batch_ys)
  • 学习率变化
    学习率(learn rate)是指梯度下降调整 W 和 b 递增或递减的速度。学习率较小时,处理过程会更慢,但肯定能得到更小成本;而当学习率更大时,我们可以更快地得到最小成本,但有「冲过头」的风险,导致我们没法找到最小成本。为了克服这一问题,许多机器学习实践者选择开始时使用较大的学习率(假设开始时的成本离最小成本还很远),然后随每个 epoch 而逐渐降低学习率。
    TensorFlow 带有多种支持学习率变化的梯度下降优化器,例如 tf.train.AdagradientOptimizer 和 tf.train.AdamOptimizer.
    使用 tf.placeholder 调整学习率如同前面所看到的,如果我们在这个例子中声明了 tf.placeholder 来设置学习率,然后在 tf.train.GradientDescentOptimizer 中使用它,我们可以在每个训练 epoch 向其送入一个不同的值,这很像我们给x 和 y_ 送入不同的数据点,这也是每个 epoch 的 tf.placeholders.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 简单线性回归 import tensorflow as tf import numpy # 创造数据 x_dat...
    CAICAI0阅读 3,540评论 0 49
  • 本以为你已习惯,毕竟每个人的为人处事有所不同,其实也没什么了不起呀!不是吗?大不了再回到一个人的生活,那不是你一直...
    阿莫哦阅读 205评论 0 0
  • 『金色的国度不断飘逸风中 有一种神秘灰色的漩涡 将我卷入了迷雾中 看不清的双手 一朵花传来谁经过的温柔 穿越千年的...
    张鑫景阅读 363评论 0 1
  • 郁闷毁乳房。暴躁伤子宫 别让情绪左右你 暴躁会存在子宫里 压力会存在于颈肩 郁闷会存在乳房里 委屈纠结会存在胃...
    3416d651093a阅读 231评论 0 1
  • 书包纸笔课本, 竖子手机教室, 一人一书一桌, 白雪飞扬, 考试人在复习。
    恰好爱你阅读 203评论 0 0