蛙蛙推荐: TensorFlow Hello World 之平面拟合

tensorflow 已经发布了 2.0 alpha 版本,所以是时候学一波 tf 了。官方教程有个平面拟合的类似Hello World的例子,但没什么解释,新手理解起来比较困难。

所以本文对这个案例进行详细解释,对关键的numpy, tf, matplotlib 函数加了注释,并且对原始数据和训练效果进行了可视化展示,希望对你理解这个案例有所帮助。

因为 2.0 成熟还需要一段时间,所以本文使用的是 tf 1.13.1 版本,Python 代码也从 Python 2 迁移到了 Python 3。

原始代码见如下链接:
http://www.tensorfly.cn/tfdoc/get_started/introduction.html

原始代码如下:

import tensorflow as tf
import numpy as np

# 使用 NumPy 生成假数据(phony data), 总共 100 个点.
x_data = np.float32(np.random.rand(2, 100)) # 随机输入
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 构造一个线性模型
#
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 初始化变量
init = tf.initialize_all_variables()

# 启动图 (graph)
sess = tf.Session()
sess.run(init)

# 拟合平面
for step in xrange(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print step, sess.run(W), sess.run(b)

# 得到最佳拟合结果 W: [[0.100  0.200]], b: [0.300]

使用 NumPy 生成假数据(phony data), 总共 100 个点.

x_data 是二维数组,每个维度各 100 个点,定义了一个平面

import tensorflow as tf
import numpy as np

x_data = np.float32(np.random.rand(2, 100)) # 随机输入
x_data[0][:10]
array([0.35073978, 0.16348423, 0.7059651 , 0.7696817 , 0.4036316 ,
       0.52306384, 0.8748454 , 0.52280265, 0.9512267 , 0.10213694],
      dtype=float32)
x_data[1][:10]
array([0.33513898, 0.07861521, 0.58426493, 0.87010854, 0.24188931,
       0.64622885, 0.39593607, 0.4805421 , 0.6906034 , 0.41190282],
      dtype=float32)

y_datax_data 经过变换得到,np.dot 实现矩阵乘法,要求第一个矩阵的列数和第二个矩阵的行数相同,最后加一个偏移量

比如 y_data[0] 就等于 x_data[0][0]*0.1 + x_data[1][0]*0.2 +0.3

这里整体的效果,相当于对原始的平面在三维空间进行了一个倾斜旋转,倾斜的参数由一个权重 W=[0.1, 0.2] 和偏移量 b=0.3 来确定

y_data = np.dot([0.100, 0.200], x_data) + 0.300
y_data[:10]
array([0.40210177, 0.33207147, 0.4874495 , 0.55098988, 0.38874102,
       0.48155215, 0.46667175, 0.44838868, 0.53324335, 0.39259426])

原始数据可视化

使用 matplotlib 的 scatter 功能实现 3D 散点图,x 轴是 x_data[0], y 轴是 x_data[1],z 轴是 y_data

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x, y, z = x_data[0], x_data[1], y_data
fig = plt.figure(figsize=(20, 14))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c='y')
plt.show()

构造一个线性模型

线性模型一般由权重 W 和偏移量 b 来描述,平面上直线拟合 W 是一个标量数字,而本例在三维空间进行平面拟合,所以 W 是一个有两个分量的向量。

b = tf.Variable(tf.zeros([1]))
b
<tf.Variable 'Variable:0' shape=(1,) dtype=float32_ref>
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
W
<tf.Variable 'Variable_1:0' shape=(1, 2) dtype=float32_ref>

y 是模拟的结果,tf.matmul 将矩阵 A 乘以矩阵 B,生成 A * B,最后加上偏移量 b

y = tf.matmul(W, x_data) + b
y
<tf.Tensor 'add:0' shape=(1, 100) dtype=float32>

最小化方差

定义损失函数,线性回归里常用的是均方误差,就是真实值和预测值的差的平方和

loss = tf.reduce_mean(tf.square(y - y_data))

定义优化器,这里使用梯度下降算法

optimizer = tf.train.GradientDescentOptimizer(0.5)

使用指定的优化器和损失函数定义一个训练

train = optimizer.minimize(loss)

初始化变量

init = tf.global_variables_initializer()

启动图 (graph)

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

拟合平面

我们知道真实的 W[0.1, 0.2]b0.3,看下迭代训练 200 次的拟合效果怎么样

for step in range(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))
0 [[ 0.8425213  -0.12354811]] [0.13099673]
20 [[0.289453   0.12614608]] [0.2357107]
40 [[0.15044135 0.18556874]] [0.28013656]
60 [[0.11361164 0.19769716]] [0.29380444]
80 [[0.10372839 0.1998468 ]] [0.29805225]
100 [[0.10103785 0.20009856]] [0.2993837]
120 [[0.1002938  0.20006898]] [0.29980397]
140 [[0.1000846  0.20003161]] [0.2999374]
160 [[0.10002476 0.20001256]] [0.29997995]
180 [[0.10000735 0.20000464]] [0.29999357]
200 [[0.10000221 0.20000164]] [0.29999793]

这里迭代 200 次的结果 W[0.10000221 0.20000164], b0.29999793,可以看出跟真实值差别非常小了

拟合效果可视化

把原始的分布在三维空间的点,组成一个个的三元组,分别表示 x, y, z 的坐标值

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

points = list(zip(x_data[0],x_data[1],y_data))
points[:10]
[(0.35073978, 0.33513898, 0.40210177302360534),
 (0.16348423, 0.07861521, 0.33207146525382997),
 (0.7059651, 0.58426493, 0.4874494969844818),
 (0.7696817, 0.87010854, 0.5509898781776428),
 (0.4036316, 0.24188931, 0.3887410223484039),
 (0.52306384, 0.64622885, 0.4815521538257599),
 (0.8748454, 0.39593607, 0.4666717529296875),
 (0.52280265, 0.4805421, 0.44838868379592894),
 (0.9512267, 0.6906034, 0.5332433462142945),
 (0.10213694, 0.41190282, 0.3925942569971085)]
w_val = sess.run(W)
b_val = sess.run(b)
def cross(a, b):
    return [a[1]*b[2] - a[2]*b[1],
            a[2]*b[0] - a[0]*b[2],
            a[0]*b[1] - a[1]*b[0]]

# https://stackoverflow.com/questions/20699821/find-and-draw-regression-plane-to-a-set-of-points
def show(points, a, b, c):
    # 定义画布
    fig = plt.figure(figsize=(20, 14))
    ax = fig.add_subplot(111, projection='3d')

    # 绘制原始的散点
    xs, ys, zs = zip(*points)
    ax.scatter(xs, ys, zs)

    # 绘制拟合平面
    point  = np.array([0.0, 0.0, c])
    normal = np.array(cross([1,0,a], [0,1,b]))
    d = -point.dot(normal)
    xx, yy = np.meshgrid([0,1], [0,1])
    z = (-normal[0] * xx - normal[1] * yy - d) * 1. / normal[2]
    ax.plot_surface(xx, yy, z, alpha=0.2, color=[0,1,0])

    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')

    plt.show()
show(points, w_val[0][0],w_val[0][1],b_val[0])

原文地址:https://www.cnblogs.com/onlytiancai/p/tf_hello_world.html

时间: 2024-10-25 08:43:38

蛙蛙推荐: TensorFlow Hello World 之平面拟合的相关文章

html打造动画【系列2】- 可爱的蛙蛙表情

先感受一下全部表情包: 在开始之前先安利一个知识点:Flex弹性布局 我们一般做水平三列布局都是用的float方法,将每一块浮动显示在同一行.这种方法会导致元素没有原来的高度属性,要用清除浮动来解决空间占据问题.对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了几乎所有浏览器的支持,这意味着,现在就能很安全地使用这项功能.基本语法查看博客:Flex 布局教程:语法篇

[CC]平面拟合

MainWindow中的平面拟合方法,调用了ccPlane的Fit方法. 1 void MainWindow::doActionFitPlane() 2 { 3 doComputePlaneOrientation(false); 4 } 5 6 void MainWindow::doActionFitFacet() 7 { 8 doComputePlaneOrientation(true); 9 } 10 11 static double s_polygonMaxEdgeLength = 0;

简单的线性回归问题-TensorFlow+MATLAB&#183;

首先我们要试验的是 人体脂肪fat和年龄age以及体重weight之间的关系,我们的目标就是得到一个最优化的平面来表示三者之间的关系: TensorFlow的程序如下: import tensorflow as tf import numpy as np import matplotlib.pyplot as plt W = tf.Variable(tf.zeros([2, 1], name="weight_age")) b = tf.Variable(0.0, name="

芝麻HTTP:TensorFlow基础入门

本篇内容基于 Python3 TensorFlow 1.4 版本. 本节内容 本节通过最简单的示例 -- 平面拟合来说明 TensorFlow 的基本用法. 构造数据 TensorFlow 的引入方式是: ?import tensorflow as tf 接下来我们构造一些随机的三维数据,然后用 TensorFlow 找到平面去拟合它,首先我们用 Numpy 生成随机三维点,其中变量 x 代表三维点的 (x, y) 坐标,是一个 2×100 的矩阵,即 100 个 (x, y),然后变量 y 代

TensorFlow中国研发负责人李双峰演讲实录:TensorFlow从研究到实践

5 月 23 日周三晚,TensorFlow 中国研发负责人.Google 搜索架构技术总监李双峰受邀参与北京大学"人工智能前沿与产业趋势"系列座谈会,分享了深度学习的发展与应用.TensorFlow 从研究到实践的相关内容. 感谢作为北京大学"人工智能前沿与产业趋势"系列座谈会合作媒体的量子位旗下公众号"吃瓜社"俞晶翔.张康对活动的记录,演讲嘉宾李双峰也参与本文的联合撰写和修改. 主讲嘉宾:李双峰,TensorFlow 中国研发负责人.Goog

tensorflow op tf.global_variables_initializer

一.安装目前用了tensorflow.deeplearning4j两个深度学习框架, tensorflow 之前一直支持到python 3.5,目前以更新到3.6,故安装最新版体验使用. 慢慢长征路:安装过程如下 WIN10: anaconda3.5: PYTHON3.6: tensorflow1.4: 二.TensorFlow 基本概念与原理理解 1.TensorFlow 的工作原理 TensorFlow是用数据流图(data flow graphs)技术来进行数值计算的.数据流图是描述有向图

TensorFlow高效读取数据的方法——TFRecord的学习

关于TensorFlow读取数据,官网给出了三种方法: 供给数据(Feeding):在TensorFlow程序运行的每一步,让python代码来供给数据. 从文件读取数据:在TensorFlow图的起始,让一个输入管线从文件中读取数据. 预加载数据:在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况). 对于数据量较小而言,可能一般选择直接将数据加载进内存,然后再分batch输入网络进行训练(tip:使用这种方法时,结合yeild 使用更为简洁).但是如果数据量较

当Spark遇上TensorFlow分布式深度学习框架原理和实践

近年来,机器学习和深度学习不断被炒热,tensorflow 作为谷歌发布的数值计算和神经网络的新框架也获得了诸多关注,spark和tensorflow深度学习框架的结合,使得tensorflow在现有的spark集群上就可以进行深度学习,而不需要为深度学习设置单独的集群,为了深入了解spark遇上tensorflow分布式深度学习框架的原理和实践,飞马网于4月10日晚,邀请到先后就职于百度.腾讯,负责过多个大数据研发工作的李曙鹏老师进行线上直播,主要向我们介绍spark和深度学习的基本原理.sp

C# webbrowser专题

C# .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧 2 Study Case 4:高亮显示 上一个例子中我们学会了查找文本——究跟到底,对Web页面还是只读不写.那么,如果说要把所有的搜索结果高亮显示呢?我们很快会想到把所有匹配的文字颜色.背景改一下就可以了.首先想到的可能是直接修改HTML文本吧……但是,与SourceCode的高亮显示不同,我们需要并且只需要高亮页面中的文本部分.HTML标签.脚本代码等等是绝对不应该去改动的.因此我们不能把整个页面的Source