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

## 如何实现

``````#!/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')                    #打印内容不限制长度
``````

``````param_count = 5         #变量数
``````

``````#要求的值
t_w = np.floor([511,231,86,434,523],dtype=np.float32).reshape([param_count,1])
print t_w
``````

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

``````feature_columns = [tf.contrib.layers.real_valued_column("x")]
``````

``````regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_columns,
hidden_units=[5,5],
model_dir="/tmp/testtest")
``````

``````LOSS_MIN_VALUE = 10
while True:
t_x = np.floor(1000 * np.random.random([1,param_count]),dtype=np.float32)
t_y = t_x.dot(t_w)
regressor.fit(x=t_x,y=t_y, steps=2000)

e_x = np.floor(1000 * np.random.random([1,param_count]),dtype=np.float32)
e_y = e_x.dot(t_w)
evaluate_result = regressor.evaluate(x=e_x,y=e_y)
print evaluate_result

if evaluate_result['loss'] < LOSS_MIN_VALUE:
break
``````

``````p_x = np.floor(1000 * np.random.random([1,param_count]),dtype=np.float32)
p_y = p_x.dot(t_w)
print "预测输入:%s" % p_x
print "实际结果:%s" % p_y
print "预测值:", str(list(regressor.predict(p_x)))
``````

``````#!/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')                    #打印内容不限制长度

param_count = 5         #变量数

#要求的值
t_w = np.floor([511,231,86,434,523],dtype=np.float32).reshape([param_count,1])
print t_w

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

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

feature_columns = [tf.contrib.layers.real_valued_column("")]
regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_columns,
hidden_units=[5,5],
model_dir="/tmp/test")

LOSS_MIN_VALUE = 10
while True:
t_x = np.floor(1000 * np.random.random([1,param_count]),dtype=np.float32)
t_y = t_x.dot(t_w)
regressor.fit(x=t_x,y=t_y, steps=2000)

e_x = np.floor(1000 * np.random.random([1,param_count]),dtype=np.float32)
e_y = e_x.dot(t_w)
evaluate_result = regressor.evaluate(x=e_x,y=e_y)
print evaluate_result

if evaluate_result['loss'] < LOSS_MIN_VALUE:
break

p_x = np.floor(1000 * np.random.random([1,param_count]),dtype=np.float32)
p_y = p_x.dot(t_w)
print "预测输入:%s" % p_x
print "实际结果:%s" % p_y
print "预测值:" % str(list(regressor.predict(p_x)))
``````

``````...
{'loss': 55225.0, 'global_step': 748001}
{'loss': 24404.297, 'global_step': 750001}
{'loss': 8824.2539, 'global_step': 752001}
{'loss': 3.515625, 'global_step': 754001}

``````

``````#!/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')                    #打印内容不限制长度

param_count = 5         #变量数
test_count = 20         #每次训练的样本数

#要求的值
t_w = np.floor([511,231,86,434,523],dtype=np.float32).reshape([param_count,1])
print(t_w)

#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)

feature_columns = [tf.contrib.layers.real_valued_column("")]
regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_columns,
hidden_units=[5,5],
model_dir="/tmp/test2")

LOSS_MIN_VALUE = 200

while True:
t_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
t_y = t_x.dot(t_w)
regressor.fit(x=t_x,y=t_y, steps=2000)

e_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
e_y = e_x.dot(t_w)
evaluate_result = regressor.evaluate(x=e_x,y=e_y)
print evaluate_result

if evaluate_result['loss'] < LOSS_MIN_VALUE:
break

p_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
p_y = p_x.dot(t_w)
print("预测输入:%s" % p_x)
print("实际结果:%s" % p_y)
print("预测值:" % str(list(regressor.predict(p_x))))
``````

``````...
{'loss': 294.09082, 'global_step': 1540000}
{'loss': 366.38013, 'global_step': 1542000}
{'loss': 354.60809, 'global_step': 1544000}
{'loss': 258.04257, 'global_step': 1546000}
{'loss': 225.32999, 'global_step': 1548000}
{'loss': 229.31587, 'global_step': 1550000}
{'loss': 196.7415, 'global_step': 1552000}

[ 659.  816.   95.  529.  240.]
[ 411.  970.  963.   95.  378.]
[ 739.  568.  467.  124.  469.]
[ 461.   60.  616.  774.  500.]
[ 876.   28.  483.  106.  532.]
[ 283.  447.  340.  541.  165.]
[ 838.  802.  105.  578.  171.]
[ 224.  160.  620.  837.  173.]
[ 815.  969.  483.  997.  576.]
[ 986.  492.  948.  215.  609.]
[ 676.  817.  119.  300.  709.]
[ 377.  327.  536.  759.  331.]
[ 601.  991.  602.  491.  750.]
[ 656.  802.  498.  757.  939.]
[ 269.  572.  805.  192.  328.]
[ 114.  968.   34.  154.  772.]
[ 687.  504.  466.  213.  143.]
[ 467.  327.  637.  698.  791.]
[ 993.  520.   29.  543.  233.]]

[  888521.]
[  755833.]
[  848102.]
[  899823.]
[  819882.]
[  598199.]
[  962795.]
[  658481.]
[ 1415788.]
[ 1110843.]
[ 1045404.]
[  816799.]
[ 1193148.]
[ 1382941.]
[  593693.]
[  755378.]
[  674788.]
[ 1085581.]
[  987558.]]

``````

## 通过函数传入训练数据

TensorFlow 还提供通过函数的方式传入输入数据，上面的例子是在 while 循环中将训练数据生成好传入，如果训练数据比较复杂或者不想将其与训练的代码耦合太大，可以将读取训练数据封装成一个函数传给 fit、evaluate 和 predict。 这个函数需要返回 2 个值，第一个返回值是输入，它是一个字典，Key 是特征列，Value 是特征值，第二个返回值是输入对应的输出值，比如上面的例子，可以这样构造训练集：

``````def get_train_inputs():
t_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
t_y = t_x.dot(t_w)

#第一个参数是一个字典，Key 是变量名称，Value 是变量的值转成 Tensor
feature_cols = {'x': tf.constant(t_x)}

#第二个参数就是结果值，也要转成 Tensor
return feature_cols,tf.constant(t_y)
``````

``````regressor.fit(input_fn=lambda: get_train_inputs(), steps=2000)
``````

``````#!/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')                    #打印内容不限制长度

param_count = 5         #变量数
test_count = 20         #每次训练的样本数

#要求的值
t_w = np.floor([511,231,86,434,523],dtype=np.float32).reshape([param_count,1])

print(t_w)

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

feature_columns = [tf.contrib.layers.real_valued_column("x")]
regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_columns,
hidden_units=[5,5],
model_dir="/tmp/test6")

def get_train_inputs():
t_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
t_y = t_x.dot(t_w)

#第一个参数是一个字典，Key 是变量名称，Value 是变量的值转成 Tensor
feature_cols = {'x': tf.constant(t_x)}

#第二个参数就是结果值，也要转成 Tensor
return feature_cols,tf.constant(t_y)

def get_test_inputs():
e_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
e_y = e_x.dot(t_w)

feature_cols = {'x': tf.constant(e_x)}
return feature_cols,tf.constant(e_y)

def get_predict_inputs():
p_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
feature_cols = {'x': tf.constant(p_x)}
p_y = p_x.dot(t_w)
print("预测输入:%s" % p_x)
print("实际结果:%s" % p_y)
return feature_cols

LOSS_MIN_VALUE = 50
while True:
regressor.fit(input_fn=lambda: get_train_inputs(), steps=2000)
evaluate_result = regressor.evaluate(input_fn=lambda: get_test_inputs(),steps=1)
print(evaluate_result)

if evaluate_result['loss'] < LOSS_MIN_VALUE:
break

result = str(list(regressor.predict(input_fn=lambda: get_predict_inputs())))
print("预测结果:%s" % result)

...
{'loss': 71.71196, 'global_step': 2078000}
{'loss': 71.513145, 'global_step': 2080000}
{'loss': 79.737793, 'global_step': 2082000}
{'loss': 69.766647, 'global_step': 2084000}
{'loss': 91.727737, 'global_step': 2086000}
{'loss': 49.118164, 'global_step': 2088000}
{'loss': 89.724609, 'global_step': 2090000}
{'loss': 48.275196, 'global_step': 2092000}
{'loss': 54.506691, 'global_step': 2094000}
{'loss': 50.299416, 'global_step': 2096001}

[ 304.  281.  179.  669.  688.]
[ 156.  785.  812.  535.  715.]
[  32.  821.  266.  107.  416.]
[ 132.  912.  561.  215.  688.]
[ 786.  665.  117.  864.  779.]
[ 561.  403.  257.  520.  787.]
[ 233.  614.  735.  854.  271.]
[ 516.  888.  904.  263.   64.]
[ 851.  858.  576.  402.  957.]
[ 391.  445.  224.  319.  161.]
[ 586.  260.  565.  143.  293.]
[ 440.  406.  304.  249.  552.]
[ 912.  211.  985.  953.  326.]
[  86.  302.  444.  385.  724.]
[ 345.  488.  654.  903.  408.]
[ 994.  118.  197.  266.  851.]
[ 828.  846.  235.   10.  574.]
[ 493.   31.  151.  592.  866.]
[ 126.  593.  229.  904.  606.]]

[  885819.]
[  937018.]
[  492885.]
[  779504.]
[ 1347716.]
[ 1039147.]
[  836476.]
[  694162.]
[ 1357574.]
[  544509.]
[  623397.]
[  741532.]
[ 1183583.]
[  697634.]
[  950553.]
[ 1112651.]
[  943286.]
[  981916.]
[  930337.]]

``````

``````def get_predict_inputs():
#p_x = np.floor(1000 * np.random.random([test_count,param_count]),dtype=np.float32)
p_x = np.floor(1000 * np.zeros([test_count,param_count]),dtype=np.float32)
p_x[0] = [2,112,2,3,4]
feature_cols = {'x': tf.constant(p_x)}
p_y = p_x.dot(t_w)
print("预测输入:%s" % p_x)
print("实际结果:%s" % p_y)
return feature_cols
``````

``````预测输入:[[   2.  112.    2.    3.    4.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]
[   0.    0.    0.    0.    0.]]

[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]
[     0.]]

``````

3 篇文章11 人订阅

0 条评论

842

1364

2195

4625

3479

1422

3366

30910

5015

2255