系列文章
本教程有同步的github地址
知识点
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.5到0.5均匀分布的200个数据点,包含首尾数据
#%%
x_data = np.linspace(-0.5, 0.5, 200)
#%%
x_data
#%% md
将1维数据升成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激活函数不光滑(不连续可导)导致的。