欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

tensorflow结果可视化-【老鱼学tensorflow】

程序员文章站 2022-03-21 19:37:32
这次我们把上次的结果进行可视化显示,我们会把神经网络的优化过程以图像的方式展示出来,方便我们了解神经网络是如何进行优化的。 首先,我们把测试数据显示出来: 这里为了能够更加灵活地控制显示的图形,因此增加了subplot,这样方便对其中画出的线进行删除。 plt.ion()开启了交互模式,这样不会使图 ......

这次我们把上次的结果进行可视化显示,我们会把神经网络的优化过程以图像的方式展示出来,方便我们了解神经网络是如何进行优化的。

首先,我们把测试数据显示出来:

# 显示测试数据
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(x_data, y_data)

plt.ion()
plt.show()

这里为了能够更加灵活地控制显示的图形,因此增加了subplot,这样方便对其中画出的线进行删除。
plt.ion()开启了交互模式,这样不会使图形显示后一直处于等待状态。

在绘制每一次的拟合曲线中:

        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass

        lines = ax.plot(x_data, prediction_value, c='r')
        plt.pause(0.1)

首先把之前的线进行删除,然后添加预测值的直线段,最后还在屏幕上暂停一下绘制。
这样图形显示为:
tensorflow结果可视化-【老鱼学tensorflow】

完成的代码为:

import tensorflow as tf
import matplotlib.pyplot as plt

def add_layer(inputs, in_size, out_size, activation_function=None):
    """
    添加层
    :param inputs: 输入数据
    :param in_size: 输入数据的列数
    :param out_size: 输出数据的列数
    :param activation_function: 激励函数
    :return:
    """

    # 定义权重,初始时使用随机变量,可以简单理解为在进行梯度下降时的随机初始点,这个随机初始点要比0值好,因为如果是0值的话,反复计算就一直是固定在0中,导致可能下降不到其它位置去。
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 偏置shape为1行out_size列
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    # 建立神经网络线性公式:inputs * Weights + biases,我们大脑中的神经元的传递基本上也是类似这样的线性公式,这里的权重就是每个神经元传递某信号的强弱系数,偏置值是指这个神经元的原先所拥有的电位高低值
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        # 如果没有设置激活函数,则直接就把当前信号原封不动地传递出去
        outputs = Wx_plus_b
    else:
        # 如果设置了激活函数,则会由此激活函数来对信号进行传递或抑制
        outputs = activation_function(Wx_plus_b)
    return outputs


import numpy as np
# 创建一列(相当于只有一个属性值),300行的x值,这里np.newaxis用于新建出列数据,使其shape为(300, 1)
x_data = np.linspace(-1, 1, 300)[:,np.newaxis]
# 增加噪点,噪点的均值为0,标准差为0.05,形状跟x_data一样
noise = np.random.normal(0, 0.05, x_data.shape)
# 定义y的函数为二次曲线的函数,但同时增加了一些噪点数据
y_data = np.square(x_data) - 0.5 + noise

# 显示测试数据
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(x_data, y_data)
plt.ion()
plt.show()


# 定义输入值,这里定义输入值的目的是为了能够使程序比较灵活,可以在神经网络启动时接收不同的实际输入值,这里输入的结构为输入的行数不国定,但列就是1列的值
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

# 定义一个隐藏层,输入为xs,输入size为1列,因为x_data就只有1个属性值,输出size我们假定输出的神经元有10个神经元的隐藏层,激励函数用relu
l1 = add_layer(xs, 1, 10, tf.nn.relu)
# 定义输出层,输入为l1,输入size为10列,也就是l1的列数,输出size为1,因为这里直接输出为类似y_data了,因此为1列,假定没有激励函数,也就是输出是啥就直接传递出去了。
predition = add_layer(l1, 10, 1, activation_function=None)

# 定义损失函数为差值平方和的平均值
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - predition), axis=1))
# 进行逐步优化的梯度下降优化器,学习效率为0.1,以最小化损失函数的方式进行优化
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 初始化所有定义的变量
init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)

# 学习1000次
for i in range(1000):
    sess.run(train_step, feed_dict={xs:x_data, ys:y_data})
    # 打印期间的误差值,看这个误差值是否在减少
    if i % 50 == 0:
        # print(sess.run(loss, feed_dict={xs:x_data, ys:y_data}))
        prediction_value = sess.run(predition, feed_dict={xs:x_data, ys:y_data})
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass

        lines = ax.plot(x_data, prediction_value, c='r')
        plt.pause(0.1)

在进行绘制图形时,也可以用如下的方式进行:
绘制原始数据的图形:

plt.scatter(x_data, y_data)
plt.ion()
plt.show()

在每个测试步骤中绘制的图形:

        prediction_value = sess.run(predition, feed_dict={xs:x_data, ys:y_data})
        try:
            plt.axes().lines.remove(lines[0])
        except Exception:
            pass

        lines = plt.plot(x_data, prediction_value, c='r')
        plt.pause(0.1)