tensorflow学习笔记(3)梯度下降法进行曲线拟合和线性回归
实例1:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import tensorflow as tf
import numpy as np# 模拟生成100对数据对, 对应的函数为y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype("float32")
y_data = x_data * 0.1 + 0.3# 指定w和b变量的取值范围(利用TensorFlow来得到w和b的值)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) #随机生成一个在[-1,1]范围的均匀分布数值
b = tf.Variable(tf.zeros([1])) #set b=0
y = W * x_data + b# 最小化均方误差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5) #学习率为0.5的梯度下降法
train = optimizer.minimize(loss)# 初始化TensorFlow参数
init = tf.initialize_all_variables()# 运行数据流图(
sess = tf.Session()
sess.run(init)# 观察多次迭代计算时,w和b的拟合值
for step in range(201):sess.run(train)if step % 20 == 0:print(step, sess.run(W), sess.run(b))
注释:上面代码是要拟合出直线: y=0.1x+0.3,算法原理很简单,就是先初始化一个w和b,然后逐步迭代(代码中用的是学习率为0.5的梯度下降法),使得y和y_data的均方误差最小,主要是学习TensorFlow的实现方法。这里附tf.reduce_mean( )的函数说明:
函数作用:
沿着tensor的某一维度,计算元素的平均值。由于输出tensor的维度比原tensor的低,这类操作也叫降维。参数:
reduce_mean(input_tensor,axis=None,keep_dims=False,name=None, reduction_indices=None)
input_tensor:需要降维的tensor。
axis:axis=none, 求全部元素的平均值;axis=0, 按列降维,求每列平均值;axis=1,按行降维,求每行平均值。
keep_dims:若值为True,可多行输出平均值。
name:自定义操作的名称。
reduction_indices:axis的旧名,已停用。
上面代码执行结果:
0 [ 0.60980111] [ 0.0624467]
20 [ 0.25957468] [ 0.22225133]
40 [ 0.15037055] [ 0.27545825]
60 [ 0.11589972] [ 0.29225329]
80 [ 0.10501883] [ 0.2975547]
100 [ 0.10158423] [ 0.29922813]
120 [ 0.10050007] [ 0.29975638]
140 [ 0.10015786] [ 0.29992309]
160 [ 0.10004983] [ 0.29997572]
180 [ 0.10001571] [ 0.29999235]
200 [ 0.10000496] [ 0.2999976]
迭代到200步时,w和b的值已经接近于最佳。
拟合实质上和回归是一样的,为了更加直观的显示迭代过程中每次拟合的情况,使用matplotlib把图绘制出来,见实例2。
实例2:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import numpy as np
import matplotlib.pyplot as pltnum_points = 1000
vectors_set = []
for i in range(num_points):x1= np.random.normal(0.0, 0.55)y1= x1 * 0.1 + 0.3 + np.random.normal(0.0, 0.03)vectors_set.append([x1, y1])x_data = [v[0] for v in vectors_set]
y_data = [v[1] for v in vectors_set]#Graphic display
plt.plot(x_data, y_data, 'ro')
plt.legend()
plt.show()import tensorflow as tfW = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + bloss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)init = tf.initialize_all_variables()sess = tf.Session()
sess.run(init)for step in range(101):sess.run(train)if step % 20 == 0:print(step, sess.run(W), sess.run(b))print(step, sess.run(loss))#Graphic displayplt.plot(x_data, y_data, 'ro')plt.plot(x_data, sess.run(W) * x_data + sess.run(b))plt.xlabel('x')plt.xlim(-2,2)plt.ylim(0.1,0.6)plt.ylabel('y')plt.legend()plt.show()
执行结果(这里只附1,2,7步的图,中间几步的图结果越来越靠近第7步):
最后的拟合参数为:
100 [ 0.09993903] [ 0.30052763]
100 0.00088246
附录:
生成数据时的分布情况,如正态分布,均匀分布等
Operation | Description |
tf.random_normal | Random values with a normal distribution |
tf.truncated_normal | Random values with a normal distribution but eliminating those values whose magnitude is more than 2 times the standard deviation |
tf.random_uniform | Random values with a uniform distribution |
tf.random_shuffle | Randomly mixed tensor elements in the first dimension |
tf.set_random_seed | Sets the random seed |
实例3:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt# Prepare training data
datasize=100
train_X = np.linspace(0,np.pi, datasize)
train_Y=np.sin(train_X)
# Define the model
X1 = tf.placeholder(tf.float32,shape=(datasize,))
X2 = tf.placeholder(tf.float32,shape=(datasize,))
X3 = tf.placeholder(tf.float32,shape=(datasize,))
X4 = tf.placeholder(tf.float32,shape=(datasize,))
Y = tf.placeholder(tf.float32,shape=(datasize,))
w1 = tf.Variable(0.0,name="weight1")
w2 = tf.Variable(0.0, name="weight2")
w3 = tf.Variable(0.0, name="weight3")
w4 = tf.Variable(0.0, name="weight4")y1=w1*X1+w2*X2+w3*X3+w4*X4
loss = tf.reduce_mean(tf.square(Y - y1))
#use adam method to optimize
optimizer =tf.train.AdamOptimizer()
train=optimizer.minimize(loss)# Create session to run
with tf.Session() as sess:init=tf.global_variables_initializer()sess.run(init)for i in range(5000):_,ww1, ww2,ww3,ww4,loss_= sess.run([train, w1, w2,w3,w4,loss],feed_dict={X1:train_X,X2:train_X**3,X3:train_X**5,X4:train_X**7,Y: train_Y})plt.plot(train_X,train_Y,"+",label='data')
plt.plot(train_X,ww1*train_X+(ww2)*(train_X**3)+ww3*(train_X**5)+ww4*(train_X**7),label='curve')
plt.savefig('1.png',dpi=200)
plt.axis([0,np.pi,-2,2])
plt.legend(loc=1)
plt.show()
实例4:
定义张量和损失函数时,除了上面的方法,还可以写成下面的形式,本质是一样的:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 设置带噪声的线性数据
num_examples = 50
# 这里会生成一个完全线性的数据
X = np.array([np.linspace(-2, 4, num_examples), np.linspace(-6, 6, num_examples)])
# 数据展示
plt.figure(figsize=(4,4))
plt.scatter(X[0], X[1])
plt.show# 给数据增加噪声
X += np.random.randn(2, num_examples)
# 数据展示
plt.figure(figsize=(4,4))
plt.scatter(X[0], X[1])
plt.show# 我们的目标就是通过学习,找到一条拟合曲线,去还原最初的线性数据
# 把数据分离成 x 和 y
x, y = X
# 添加固定为 1 的 bias
x_with_bias = np.array([(1., a) for a in x]).astype(np.float32)
# 用来记录每次迭代的 loss
losses = []
# 迭代次数
training_steps = 50
# 学习率,梯度下降时每次迭代所前进的长度
learning_rate = 0.002with tf.Session() as sess:# 设置所有的张量,变量和操作# 输入层是 x 值和 bias 节点input = tf.constant(x_with_bias)# target 是 y 的值,需要被调整成正确的尺寸(转置一下)target = tf.constant(np.transpose([y]).astype(np.float32))# weights 是变量,每次循环都会变,这里直接随机初始化(高斯分布,均值 0,标准差 0.1)weights = tf.Variable(tf.random_normal([2, 1], 0, 0.1))# 初始化所有的变量tf.global_variables_initializer().run()# 设置循环中所要做的全部操作# 对于所有的 x,根据现有的 weights 来产生对应的 y 值,也就是计算 y = w2 * x + w1 * biasyhat = tf.matmul(input, weights)yerror = tf.subtract(yhat, target)# 最小化 L2 损失,误差的平方loss = tf.nn.l2_loss(yerror)# 上面的 loss 函数相当于0.5 * tf.reduce_sum(tf.multiply(yerror, yerror))update_weights = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)# 上面的梯度下降相当于# gradient = tf.reduce_sum(tf.transpose(tf.multiply(input, yerror)), 1, keep_dims=True)# update_weights = tf.assign_sub(weights, learning_rate * gradient)for _ in range(training_steps):update_weights.run()# 如果没有用 tf.train.GradientDescentOptimizer,就要 sess.run(update_weights)losses.append(loss.eval())# 训练结束betas = weights.eval()yhat = yhat.eval()fig, (ax1, ax2) = plt.subplots(1, 2)
plt.subplots_adjust(wspace=.3)
fig.set_size_inches(10, 4)
ax1.scatter(x, y, alpha=.7)
ax1.scatter(x, np.transpose(yhat)[0], c="g", alpha=.6)
line_x_range = (-4, 6)
ax1.plot(line_x_range, [betas[0] + a * betas[1] for a in line_x_range], "g", alpha=.6)
ax2.plot(range(0, training_steps), losses)
ax2.set_ylabel("Loss")
ax2.set_xlabel("Training steps")
plt.show()
运行结果:
参考:
https://www.tensorflow.org/get_started/get_started
http://www.jeyzhang.com/tensorflow-learning-notes.html
http://wdxtub.com/2017/05/31/tensorflow-learning-note/
http://jorditorres.org/research-teaching/tensorflow/first-contact-with-tensorflow-book/first-contact-with-tensorflow/#cap1
tensorflow学习笔记(3)梯度下降法进行曲线拟合和线性回归相关推荐
- 吴恩达神经网络和深度学习-学习笔记-9-mini-batch梯度下降法
mini-batch梯度下降法 mini-batch梯度下降法的介绍 但是当m是一个很大的数(比如500W),在对整个训练集执行梯度下降算法的时候,我们必须处理整个数据集,才能进行下一步梯度下降算法. ...
- 吴恩达神经网络和深度学习-学习笔记-11-Momentum梯度下降法
Momentum的原理 这个算法肯定要好于没有Momentum的梯度下降算法(This will almost always work better than the straightforword ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...
- TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅
TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...
- 炼数成金Tensorflow学习笔记之2.4_Tensorflow简单示例
炼数成金Tensorflow学习笔记之2.4_Tensorflow简单示例 代码及分析 代码及分析 # -*- coding: utf-8 -*- """ Created ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
- Win10:tensorflow学习笔记(4)
前言 学以致用,以学促用.输出检验,完整闭环. 经过前段时间的努力,已经在电脑上搭好了深度学习系统,接下来就要开始跑程序了,将AI落地了. 安装win10下tensforlow 可以参照之前的例子:w ...
- Win10: tensorflow 学习笔记(3)
前言 学以致用,以学促用.输出检验,完整闭环. 怕什么真理无穷,进一寸有一寸的欢喜--胡适 经过前段时间的努力,已经在电脑上搭好了深度学习系统,接下来就要开始跑程序了,将AI落地了. 安装win10下 ...
- tensorflow学习笔记1
tensorflow学习笔记1 本文主要记录我在慕课上观看北大曹建老师的<人工智能实践:Tensorflow笔记>,链接:https://www.icourse163.org/course ...
- tensorflow学习笔记(八):LSTM手写体(MNIST)识别
文章目录 一.LSTM简介 二.主要函数 三.LSTM手写体(MNIST)识别 1.MNIST数据集简介 2.网络描述 3.项目实战 一.LSTM简介 LSTM是一种特殊的RNN,很好的解决了RNN中 ...
最新文章
- [BZOJ 4551][Tjoi2016Heoi2016]树(并查集)
- 卧槽,又一款Markdown组合神器!!!
- 从最小二乘到岭回归(Ridge Regression)的深刻理解
- 联通培训 老师教的 bootstrap row 里面都是12行不断的分割成小格子
- php7当前目录,PHP获取路径或目录或当前文件名
- android studio 图表,Android Studio——记账本以及图表可视化实现
- 三十年软件开发之路:老码农的自我修养!
- 5 多数据save_[Python] 通过采集两万条数据,对无名之辈影评分析
- Android音视频开发全系列教程
- 请给开源软件一个机会:7-zip / PDFCreator / CDex / VirtualDub 等等
- 计算机图形学入门(十五)-光线追踪(辐射度量学)
- Infor LN咨询服务市场报告-行业发展机遇、市场定位及主要驱动因素
- 【mediasoup】网络控制4 :基于GoogCc 实现网络控制
- js定义函数的两种形式及区别
- 图片水印怎么加?图片加水印方法分享
- 安装Microsoft-project 2016
- 朱阿兴教授报告——SCI文章写作要点与案例分析
- PHP集运系统源码 国际物流集运转运系统源码
- zblogphp登录和注册_基于PHP的登录和注册的功能的实现
- 修改nz-select中的nz-option设置title属性展示内容。