『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归

Step1:

目标:

使用线性模拟器模拟指定的直线:y = 0.1*x + 0.3

代码:

 1 import tensorflow as tf
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 
 5 def show_data(x,y,w,b):
 6     '''
 7     绘图函数
 8     :param x: 横坐标散点 
 9     :param y: 纵坐标散点
10     :param w: 权重
11     :param b: 偏移量
12     :return:  无
13     '''
14     plt.figure()
15     plt.scatter(x,y,marker='.')
16     plt.scatter(x,(w*x+b),marker='.')
17     plt.show()
18 
19 ### 生成数据 ###
20 x_data = np.random.rand(100).astype(np.float32)
21 y_data = 0.1*x_data + 0.3
22 
23 
24 ### 创建结构 ###
25 
26 Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
27 biases = tf.Variable(tf.zeros([1]))
28 
29 y = Weights*x_data + biases
30 
31 loss = tf.reduce_mean(tf.square(y-y_data))              # 损失函数
32 optimizer = tf.train.GradientDescentOptimizer(0.5)      # 优化器&学习率选择
33 train = optimizer.minimize(loss)                        # 优化器优化目标选择
34 
35 init = tf.global_variables_initializer()                # 初始化全变量节点
36 
37 
38 ### 训练部分
39 
40 with tf.Session() as sess:
41     sess.run(init)
42     for step in range(200):
43         sess.run(train)
44         if step % 20 == 0:
45             print(step,sess.run(Weights),sess.run(biases))
46             show_data(x_data, y_data, sess.run(Weights), sess.run(biases))

 返回:

/home/hellcat/anaconda2/envs/python3_6/bin/python /home/hellcat/PycharmProjects/data_analysis/TensorFlow/line_polyfit.py
2017-05-16 14:30:21.054380: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-16 14:30:21.054405: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-16 14:30:21.054412: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
0 [-0.04776853] [ 0.48895872]
20 [ 0.05342153] [ 0.32313728]
40 [ 0.08880574] [ 0.30556062]
60 [ 0.09730968] [ 0.30133641]
80 [ 0.09935342] [ 0.30032119]
100 [ 0.0998446] [ 0.3000772]
120 [ 0.09996266] [ 0.30001855]
140 [ 0.09999102] [ 0.30000448]
160 [ 0.09999786] [ 0.30000108]
180 [ 0.09999949] [ 0.30000028]

Process finished with exit code 0

给出第一次(左)和最后一次(右)的图,直观的感受一下拟合效果(蓝色为标准,黄色为拟合):

 step2:

目标:

使用神经网络拟合二次函数(加噪声)

代码:

 1 import numpy as np
 2 import tensorflow as tf
 3 
 4 def add_layer(input,in_size,out_size,activation_function=None):
 5     Weights = tf.Variable(tf.random_normal([in_size,out_size]))
 6     biases = tf.Variable(tf.zeros([1,out_size]) + 0.1)
 7     # [in]*[[out]*in]+[out]
 8     Wx_plus_b = tf.matmul(input,Weights) + biases
 9     if activation_function is None:
10         outputs = Wx_plus_b
11     else:
12         outputs = activation_function(Wx_plus_b)
13     return outputs
14 
15 x_data = np.linspace(-1,1,300)[:,np.newaxis]  # 插入新维度(300)->(300,1)
16 noise = np.random.normal(0,0.05,x_data.shape)
17 y_data = np.square(x_data) - 0.5 + noise      # 平方
18 
19 # 这样也可以在feed时修改标准数据的类型
20 xs = tf.placeholder(tf.float32,[None,1])
21 ys = tf.placeholder(tf.float32,[None,1])
22 
23 l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
24 prediction =add_layer(l1,10,1,activation_function=None)
25 
26 loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
27 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
28 
29 init = tf.global_variables_initializer()
30 
31 with tf.Session() as sess:
32     sess.run(init)
33     for i in range(1000):
34         sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
35         if i % 50 == 0:
36             print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
37             # print(sess.run(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]), feed_dict={xs: x_data, ys: y_data}))

返回:

10.3325
0.0496612
0.0166555
0.0104833
0.00823758
0.00722597
0.00659782
0.00605279
0.0056059
0.00526385
0.00496126
0.00471807
0.00449589
0.00431383
0.00418103
0.00405819
0.00395102
0.00385027
0.0037683
0.00369631

np.newaxis维度扩充:

 1 import numpy as np
 2 a = np.array([1,2,3,4,5])
 3 a[:,np.newaxis]
 4 # Out[7]: 
 5 # array([[1],
 6 #        [2],
 7 #        [3],
 8 #        [4],
 9 #        [5]])
10 a[np.newaxis,:]
11 # Out[8]: 
12 # array([[1, 2, 3, 4, 5]])
13 a.shape
14 # Out[12]: 
15 # (5,)
16 a[:,np.newaxis].shape
17 # Out[10]: 
18 # (5, 1)
19 a[np.newaxis,:].shape
20 # Out[11]: 
21 # (1, 5)

loss函数计算分析:

将输出改成下面:

1 with tf.Session() as sess:
2     sess.run(init)
3     for i in range(1000):
4         sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
5         if i % 50 == 0:
6             #print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
7             print(sess.run(tf.square(ys - prediction),feed_dict={xs:x_data,ys:y_data}))                                         # 300行
8             print(sess.run(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]), feed_dict={xs: x_data, ys: y_data}))  # 300列

会发现tf.square(ys - prediction)输出:

[[  1.27196927e-02]
 [  3.22369207e-03]
 [  1.74964982e-04]
 ....
 [  1.06449667e-02]
 [  4.93255538e-05]
 [  3.47382086e-03]]

 共计300个元素[300,1]。

而tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1])输出:

[  1.27196927e-02   3.22369207e-03   1.74964982e-04   3.40620875e-02
   1.67742800e-02   7.89122283e-03   8.79658014e-03   3.09832394e-04
   2.58327164e-02   8.12971615e-04   3.06550064e-03   2.16252869e-04
   .....
   7.49099301e-04   9.10352624e-04   1.99158350e-03   2.43023387e-04
   5.97979059e-04   8.30261386e-04   1.25318235e-02   1.10179959e-02
   5.22381114e-03   1.06449667e-02   4.93255538e-05   3.47382086e-03]

共计300个元素[300]。

修改如下的话:

1 with tf.Session() as sess:
2     sess.run(init)
3     for i in range(1000):
4         sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
5         if i % 50 == 0:
6             #print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
7             print(sess.run(tf.square(ys - prediction),feed_dict={xs:x_data,ys:y_data}).shape)                                         # 300行
8             print(sess.run(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]), feed_dict={xs: x_data, ys: y_data}).shape)  # 300列
(300, 1)
(300,)

有意思的发现是sess.run的输出是numpy.ndarray类型

查询reduction_indices=[1]可知是指定操作坐标轴的函数:

即把[300,1]按行求和后拼接为新的数组,也就是[300]的尺寸。

step3:

之前学习的记忆渐渐复苏,感觉,还真的恰是故人归。

原文地址:https://www.cnblogs.com/hellcat/p/6861340.html