TensorFlow入门（1）：求N元一次方程

背景

• 能够在你的环境中安装好 Python、TensorFlow
• 了解基本的 Python 语法和数据结构
• 有基础的线性代数知识
• 英语水平能够大概看懂TensorFlow 官方入门教程

解决什么问题？

``````import tensorflow as tf
import numpy as np
``````

``````t_x = np.floor(10 * np.random.random([5]),dtype=np.float32)
print t_x
``````

``````[ 4.  2.  3.  2.  9.]
``````

``````t_y = t_x * 3.0   8.0
print t_y
``````

``````[ 20.  14.  17.  14.  35.]
``````

``````x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
``````

``````a = tf.Variable(0.0)
b = tf.Variable(0.0)
``````

``````curr_y = x * a   b
``````

``````loss = tf.reduce_sum(tf.square(curr_y - y))   #损失函数，实际输出数据和训练输出数据的方差
``````

``````optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)                     #训练的结果是使得损失函数最小
``````

``````sess = tf.Session()
sess.run(tf.global_variables_initializer())
``````

``````sess.run(train, {x:t_x, y:t_y})
``````

``````for i in range(10000):
sess.run(train, {x:t_x, y:t_y})
print sess.run([a,b,loss],{x:t_x, y:t_y})
``````

``````#!/usr/bin/python
#coding=utf-8
import tensorflow as tf
import numpy as np

tf.logging.set_verbosity(tf.logging.ERROR)              #日志级别设置成 ERROR，避免干扰
np.set_printoptions(threshold='nan')                    #打印内容不限制长度

t_x = np.floor(10 * np.random.random([5]),dtype=np.float32)
print t_x

t_y = t_x * 3.0   8.0
print t_y

x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
a = tf.Variable(0.0)
b = tf.Variable(0.0)
curr_y = x * a   b

loss = tf.reduce_sum(tf.square(curr_y - y))             #损失函数，实际输出数据和训练输出数据的方差
train = optimizer.minimize(loss)                        #训练的结果是使得损失函数最小

sess = tf.Session()                                     #创建 Session
sess.run(tf.global_variables_initializer())             #变量初始化

for i in range(10000):
sess.run(train, {x:t_x, y:t_y})
print sess.run([a,b,loss],{x:t_x, y:t_y})

exit(0)
``````

``````\$ python ./test1.py
[ 4. 2. 3. 2. 9.]
[ 20. 14. 17. 14. 35.]
[1.0040001, 0.2, 1381.1299]
[1.7710881, 0.35784, 839.84033]
[2.3569665, 0.48341811, 522.96967]
[2.8042414, 0.58430529, 337.39871]
[3.1455021, 0.66629255, 228.64702]
[3.4056759, 0.73380953, 164.84021]
[3.6038294, 0.7902444, 127.32993]
[3.7545466, 0.83818877, 105.2057]
[3.8689826, 0.87962502, 92.084335]
[3.9556696, 0.91606945, 84.231171]
[4.0211344, 0.94868195, 79.461243]
[4.0703683, 0.97834975, 76.496269]
[4.1071901, 1.0057515, 74.588219]
[4.1345205, 1.0314064, 73.299591]
...
[3.0000157, 7.9999132, 1.0950316e-08]
[3.0000157, 7.9999132, 1.0950316e-08]
[3.0000157, 7.9999132, 1.0950316e-08]
[3.0000157, 7.9999132, 1.0950316e-08]
[3.0000157, 7.9999132, 1.0950316e-08]
[3.0000157, 7.9999132, 1.0950316e-08]
[3.0000157, 7.9999132, 1.0950316e-08]
``````

再深入一点：多元一次方程

``````test_count = 10         #数据集数量
param_count = 5         #变量数
t_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)

#要求的值
t_w = np.floor(1000 * np.random.random([param_count,1]),dtype=np.float32)

#根据公式 t_y = t_x * t_w 算出值 t_y
t_y = t_x.dot(t_w)

print t_x
print t_w
print t_y
``````

``````#x 是输入量，对应 t_x，用于训练输入，在训练过程中，由外部提供，因此是 placeholder 类型
x = tf.placeholder(tf.float32,shape=[test_count,param_count])
y = tf.placeholder(tf.float32,shape=[test_count,1])
``````

``````#w 是要求的各个参数的权重，是目标输出，对应 t_w
w = tf.Variable(np.zeros(param_count,dtype=np.float32).reshape((param_count,1)), tf.float32)
``````

``````curr_y = tf.matmul(x, w)                         #实际输出数据
loss = tf.reduce_sum(tf.square(t_y - curr_y))    #损失函数，实际输出数据和训练输出数据的方差之和
train = optimizer.minimize(loss)                 #训练的结果是使得损失函数最小
``````

``````LOSS_MIN_VALUE = tf.constant(1e-5)               #达到此精度的时候结束训练
``````

``````sess = tf.Session()
sess.run(tf.global_variables_initializer())
run_count = 0
last_loss = 0
``````

``````while True:
run_count  = 1
sess.run(train, {x:t_x, y:t_y})

curr_loss,is_ok = sess.run([loss,loss < LOSS_MIN_VALUE],{x:t_x, y:t_y})
print "运行%d 次,loss=%s" % (run_count,curr_loss)

if last_loss == curr_loss:
break

last_loss = curr_loss
if is_ok:
break
``````

``````curr_W, curr_loss = sess.run([w, loss], {x:t_x,y:t_y})
print("t_w: %snw: %snfix_w: %snloss: %snfix_w_loss:%s" % (t_w, curr_W, np.round(curr_W), curr_loss, np.sum(np.square(t_w - np.round(curr_W)))))

exit(0)
``````

``````#!/usr/bin/python
#coding=utf-8
import tensorflow as tf
import numpy as np

tf.logging.set_verbosity(tf.logging.ERROR)              #日志级别设置成 ERROR，避免干扰
np.set_printoptions(threshold='nan')                    #打印内容不限制长度

test_count = 10         #数据集数量
param_count = 5         #变量数
t_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)

#要求的值
t_w = np.floor(1000 * np.random.random([param_count,1]),dtype=np.float32)

#根据公式 t_y = t_x * t_w 算出值 t_y
t_y = t_x.dot(t_w)

print t_x
print t_w
print t_y

#x 是输入量，对应 t_x，用于训练输入，在训练过程中，由外部提供，因此是 placeholder 类型
x = tf.placeholder(tf.float32,shape=[test_count,param_count])
y = tf.placeholder(tf.float32,shape=[test_count,1])

#w 是要求的各个参数的权重，是目标输出，对应 t_w
w = tf.Variable(np.zeros(param_count,dtype=np.float32).reshape((param_count,1)), tf.float32)

curr_y = tf.matmul(x, w)                         #实际输出数据
loss = tf.reduce_sum(tf.square(t_y - curr_y))    #损失函数，实际输出数据和训练输出数据的方差之和
train = optimizer.minimize(loss)                 #训练的结果是使得损失函数最小

LOSS_MIN_VALUE = tf.constant(1e-5)               #达到此精度的时候结束训练

sess = tf.Session()
sess.run(tf.global_variables_initializer())
run_count = 0
last_loss = 0
while True:
run_count  = 1
sess.run(train, {x:t_x, y:t_y})

curr_loss,is_ok = sess.run([loss,loss < LOSS_MIN_VALUE],{x:t_x, y:t_y})
print "运行%d 次,loss=%s" % (run_count,curr_loss)

if last_loss == curr_loss:
break

last_loss = curr_loss
if is_ok:
break

curr_W, curr_loss = sess.run([w, loss], {x:t_x,y:t_y})
print("t_w: %snw: %snfix_w: %snloss: %snfix_w_loss:%s" % (t_w, curr_W, np.round(curr_W), curr_loss, np.sum(np.square(t_w - np.round(curr_W)))))

exit(0)
``````

``````\$ python ./test1.py
[[ 842.  453.  586.  919.   91.]
[ 867.  600.  156.  993.  558.]
[ 795.  809.  146.  793.  118.]
[ 202.  184.  125.  132.  450.]
[ 214.   36.  436.  118.  290.]
[ 207.  916.  757.  647.  670.]
[ 679.  176.  872.  522.  927.]
[ 552.  602.  981.  563.  937.]
[  31.  519.  718.  226.  178.]
[ 571.  464.  289.  141.  769.]]
[[  42.]
[ 465.]
[ 890.]
[  84.]
[ 488.]]
[[  889153.]
[  809970.]
[  663711.]
[  435982.]
[  565200.]
[ 1489672.]
[ 1382662.]
[ 1680752.]
[  987505.]
[  884068.]]

...

t_w: [[ 117.]
[ 642.]
[ 662.]
[ 318.]
[ 771.]]
w: [[ 117.0872879 ]
[ 641.80706787]
[ 662.05078125]
[ 318.10388184]
[ 771.01501465]]
fix_w: [[ 117.]
[ 642.]
[ 662.]
[ 318.]
[ 771.]]
loss: 6637.81
fix_loss:0.0
``````

参考资料

TensorFlow 入门（2）：使用DNN分类器对数据进行分类

TensorFlow入门（3）：使用神经网络拟合N元一次方程

0 条评论

• 腾讯赵建春：AI浪潮下的高效运维思考及实践

腾讯 SNG 助理总经理、GOPS 金牌讲师赵建春老师受邀出席大会，并带来精彩演讲《AI 浪潮下的高效运维思考与实践》。

• 机器学习概念总结笔记（一）

本部分介绍了机器学习算法的四大分类，即：监督学习、半监督学习、无监督学习和增强学习以及包括最小二乘回归、岭回归、LASSO回归、LARS回归在内的26大常见算法...

• 腾讯AI Lab斩获知识图谱顶级赛事KBP 2017世界冠军

谢阅读腾讯AI Lab微信号文章，恭喜知识图谱团队首次出战KBP大赛就获得实体发现与链接任务三语总分第一名好成绩！

• Tensorflow 的 word2vec 详细解释：basic篇

Word2Vec即Word to vector（词汇转向量）。我们希望词义相近的两个单词，在映射之后依然保持相近，词义很远的单词直接则保持很远的映射距离。

• Tensorflow 术语表

本文主要简要介绍了广播操作、Graph(图)、Session(会话)、Tensor 等13个 Tensorflow 术语表。希望对大家了解学习 Tensorfl...

• XGBoost 源码阅读笔记（2）：树构造之 Exact Greedy Algorithm

本篇将继续向大家介绍 XGBoost 源码是如何构造一颗回归树，不过在分析源码之前，还是有必要先和大家一起推导下 XGBoost 的目标函数。

• 一个 RNN 调研引发的点评推荐血案

在这篇文章里，作者基于用户的评论内容，评估了十多种不同的 RNN 框架。这些 RNN 框架包括多层双向 GRU 和 LSTM，同时有 attention-bas...

• 学习笔记DL001 : 数学符号、深度学习的概念

深度学习是机器学习拉出的分支，它试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。本文主要介绍深度学习中的数学符号、数和数组。

• 腾讯AI Lab斩获知识图谱顶级赛事KBP 2017世界冠军

感谢阅读腾讯AI Lab微信号文章，恭喜知识图谱团队首次出战KBP大赛就获得实体发现与链接任务三语总分第一名好成绩！

• 机器学习库初探之 Caffe

Caffe 是一个清晰而高效的深度学习框架，其作者是博士毕业于 UC Berkeley 的贾扬清，目前在 Facebook 工作。Caffe 是纯粹的 C++/...