tensorflow使用笔记(二)
tensorflow使用笔记(一)Session的两种使用方式和tensorflow中的变量tensorflow使用笔记(二)简单神经网络模型的搭建tensorflow使用笔记(三)tensorboard可视化
目录
- tensorflow使用笔记(二)
- 搭建一个简单的网络模型
搭建一个简单的网络模型
简单的搭建一个三层网络结构的模型:
import tensorflow as tf
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 定义一个网络层
def add_layer(inputs, in_size, out_size, activation_function=None):
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
# tf.cast(inputs, tf.float32): 把inputs转化成tf中float32的格式
Wx_plus_b = tf.matmul(tf.cast(inputs, tf.float32), Weights) + biases
# 如果没有激活函数,直接输出输入值
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
# 定义输入值为 从 -1 到 1 范围的 300*1 的矩阵
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]
# 定义 noise 往 y_data 中加入 一些随机偏差, 使其 不完全等于 x的 平方 - 0.5 ,作用:看起来更接近真实分布
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise
# l1 为 隐藏层 的输出,激活函数为 ReLu函数
l1 = add_layer(x_data, 1, 10, tf.nn.relu)
# prediction 为 输出层的输出,没有激活函数
prediction = add_layer(l1, 10, 1, None)
# 计算损失值 ,reduction_indices=[1] 是把 计算结果压缩成一列 reduction_indices=[0] 是把 计算结果压缩成一行
loss = tf.reduce_mean(tf.reduce_sum(tf.square(y_data - prediction), reduction_indices=[1]))
# 使用梯度下降法训练模型 ,学习率为 0.2
train = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(2000):
sess.run(train)
if step % 100 == 0:
print('loss:%f' % (sess.run(loss)))
结果:
接着我们使用matplotlib模块把模型的数据分布用图形显示:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 定义一个网络层
def add_layer(inputs, in_size, out_size, activation_function=None):
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
# tf.cast(inputs, tf.float32): 把inputs转化成tf中float32的格式
Wx_plus_b = tf.matmul(tf.cast(inputs, tf.float32), Weights) + biases
# 如果没有激活函数,直接输出输入值
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
# 定义输入值为 从 -1 到 1 范围的 300*1 的矩阵
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]
# 定义 noise 往 y_data 中加入 一些随机偏差, 使其 不完全等于 x的 平方 - 0.5 ,作用:看起来更接近真实分布
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise
# l1 为 隐藏层 的输出,激活函数为 ReLu函数
l1 = add_layer(x_data, 1, 10, tf.nn.relu)
# prediction 为 输出层的输出,没有激活函数
prediction = add_layer(l1, 10, 1, None)
# 计算损失值 ,reduction_indices=[1] 是把 计算结果压缩成一列 reduction_indices=[0] 是把 计算结果压缩成一行
loss = tf.reduce_mean(tf.reduce_sum(tf.square(y_data - prediction), reduction_indices=[1]))
# 使用梯度下降法训练模型 ,学习率为 0.2
train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
# 开启一个画图的窗口
fig = plt.figure()
# 设置图像显示的时候 x, y轴比例1:1
ax = fig.add_subplot(1,1,1)
# 以离散点的形式显示真实分布情况
ax.scatter(x_data, y_data)
# 开启连续画图
plt.ion()
plt.show()
for step in range(1000):
sess.run(train)
# 在绘制出图形时我们随即移除,然后让他显示下一条,以实现动态展示模型更新
try:
ax.lines.remove(lines[0])
except:
pass
if step % 10 == 0:
# print('loss:%f' % (sess.run(loss)))
sess.run(l1)
lines = ax.plot(x_data, sess.run(prediction), 'r-', lw=5)
plt.pause(0.5)
plt.pause(0)
结果:
参考:莫烦python教程 https://www.bilibili.com/video/av16001891/