TensorFlow1.x入门(5)——构建非线性回归模型

系列文章

本教程有同步的github地址

0. 统领篇

1. 计算图的创建与启动

2. 变量的定义及其操作

3. Feed与Fetch

4. 线性回归

5. 构建非线性回归模型

6. 简单分类问题

7. Dropout与优化器

8. 手动调整学习率与TensorBoard

9. 卷积神经网络(CNN)

10. 循环神经网络(RNN)

11. 模型的保存与恢复

构建非线性回归模型

知识点

np.linsapce(-0.5, 0.5, 200)生成从-0.5到0.5的均匀分布的200个数据点。包含首尾
numpy中花式索引的一个实例——数据升维,即原来是1维的数据列表,经过升维后形成每个数值为1维列表的2为列表。结果类似如下:

[1, 2, 3, 4] ==> [[1], [2], [3]]

arr = arr[:, np.newaxis]

np.random.normal(mean, stddev, shape)用于生成一个随机正态分布(高斯分布)的数据,正态分布的均值为mean,方差为stddev,数据的维度为shape
tf.random_normal([1,10])在tensorflow中形成[1,10 ]大小的张量,数据服从高斯分布。默认的均值为0,方差为0.1。
tf.nn.tanh()是激活函数,图形类似于sigmod,但是tanh比sigmod更陡。
tf.global_variables_initializer()初始化整个计算图中的变量。

示例

#%% md
# 回归模型
#%%
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#%% md
## 使用numpy生成200个随机的数据点
#%% md
生成从-0.50.5均匀分布的200个数据点,包含首尾数据
#%%
x_data = np.linspace(-0.5, 0.5, 200) 
#%%
x_data
#%% md1维数据升成2维数据
#%%
x_data = x_data[:, np.newaxis]
#%%
x_data
#%% md
生成噪声数据与`x_data`的shape一致
#%%
noise = np.random.normal(0, 0.02,  x_data.shape)
#%% md
noise为均值为0,方差为0.02的高斯分布
#%%
noise
#%% md
构建数据y_data

$y\_data = x\_data^2 + noise$
#%%
y_data = np.square(x_data) + noise
#%%
y_data
#%% md
## 定义placeholder用于接收训练的数据

可以认为是输入层
#%%
x = tf.placeholder(tf.float32, [None, 1], name="x_input")
y = tf.placeholder(tf.float32, [None, 1], name="y_input")
#%%
x
#%%
y
#%% md
定义隐藏层

即:

$$a_1 = w_1 \times x + b_1$$
$$out_1 = activation(a_1)$$
#%%
W_1 = tf.Variable(tf.random_normal([1, 10]))
b_1 = tf.Variable(tf.zeros([1, 10]))
a_1 = tf.matmul(x, W_1) + b_1
out_1 = tf.nn.tanh(a_1)
#%%
W_1
#%%
b_1
#%%
a_1
#%%
out_1
#%% md
## 定义输出层

即输出变为维度为1的数据

$$a_2=out_1 \times w_2 + b_2$$
$$out_2 = activation(a_2)$$
#%%
W_2 = tf.Variable(tf.random_normal([10, 1]))
b_2 = tf.Variable(tf.zeros([1, 1]))
a_2 = tf.matmul(out_1, W_2) + b_2
out_2 = tf.nn.tanh(a_2)
#%%
W_2
#%%
b_2
#%%
a_2
#%%
out_2
#%% md
## 定义损失函数
#%%
loss = tf.reduce_mean(tf.square(out_2- y_data))
#%%
loss
#%%
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#%%
train_step
#%% md
## 初始化变量
#%%
init = tf.global_variables_initializer()
#%%
init
#%% md
## 训练
#%%
with tf.Session() as sess:
    sess.run(init)
    for epc in range(10000):
        sess.run([loss, train_step], {x:x_data,y:y_data})
        if epc % 10 == 0:
 #           loss_value = sess.run([loss])
            loss_value = sess.run([loss], {x:x_data,y:y_data})

            print(epc, loss_value)
    prediction_value = sess.run(out_2, feed_dict={x:x_data})
#%% md
## 画图
#%%
prediction_value
#%%
plt.figure()
plt.scatter(x_data, y_data)
plt.plot(x_data, prediction_value, "r-", lw=3)
plt.show()
#%%

#%%

注意

当使用tf.nn.relu()替换tf.nn.tanh()就会绘制的图像就会出现一条折线,并且loss也不会降到很低。这可能是由于relu激活函数不光滑(不连续可导)导致的。

猜你喜欢

转载自blog.csdn.net/qq_19672707/article/details/105542426