• 『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:

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

  • 相关阅读:
    cocos2dx——九宫格CCScale9Sprite
    COCOS学习笔记--TexturePacker使用详解
    leetcode 旋转数组
    leetcode 从排序数组中删除重复项
    使用javascript随机生成斗地主玩家手牌
    模仿w3c school的示例导航栏
    c#中快速排序的学习
    常用语法梳理
    技巧类
    markdown备忘
  • 原文地址:https://www.cnblogs.com/hellcat/p/6861340.html
Copyright © 2020-2023  润新知