博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归
阅读量:6805 次
发布时间:2019-06-26

本文共 6314 字,大约阅读时间需要 21 分钟。

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.322 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 + biases30 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.py2017-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_b11     else:12         outputs = activation_function(Wx_plus_b)13     return outputs14 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.33250.04966120.01665550.01048330.008237580.007225970.006597820.006052790.00560590.005263850.004961260.004718070.004495890.004313830.004181030.004058190.003951020.003850270.00376830.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.shape14 # Out[12]: 15 # (5,)16 a[:,np.newaxis].shape17 # Out[10]: 18 # (5, 1)19 a[np.newaxis,:].shape20 # 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:

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

转载地址:http://vwnwl.baihongyu.com/

你可能感兴趣的文章
TCP/IP协议栈中,为什么选择IP层负责分片?
查看>>
使用Sphinx对MySQL数据库进行全文检索
查看>>
基于WinSvr2012共享文件夹的Hyper-V实时迁移之二文件服务器及迁移用虚拟机的创建...
查看>>
linux运行级别0-6的各自含义(考试题答案系列)
查看>>
buffer 与cache 的区别
查看>>
Exchange邮箱数据库事务日志引起磁盘暴涨
查看>>
通过帮网友解答问题训练同学们使用awk,sed案例
查看>>
统计客户端连接数
查看>>
OSSIM中主动与被动探测工具(arpwatch+p0f+pads)组合应用
查看>>
腾讯微博等7家网站实行实名制
查看>>
分布式日志收集系统实践(视频教程)
查看>>
业界大佬患互联网手机焦虑症 圈地运动骤然爆发
查看>>
拍拍二手重装上阵,京东剑指闲鱼胜算几何?
查看>>
看看其实挺心酸的。
查看>>
实操总结:小程序裂变0成本获客3要素
查看>>
ARM给服务器厂商更多创新机会
查看>>
[2011 年终项目总结] 第六章、网站测试
查看>>
找到7天内要过生日的记录
查看>>
获取桌面DC: GetDC(GetDesktopWindow())与GetDC(NULL)
查看>>
Objective-C 基础,类和对象,方法和消息,已声明的属性和存取方法,块对象,协议和范畴类,预定义类型和编码策略...
查看>>