tensorflow,tensorboard的使用

基于tensorflow的一元二次方程回归预测:

0.检查tensorflow环境

import tensorflow as tf
hello = tf.constant('hello world')
session = tf.Session()
session.run(hello)

运行结果:
在这里插入图片描述

1.准备数据

import numpy as np

X = np.linspace(-1, 1, 300)[:, np.newaxis].astype('float32')#变量a为1维的ndarray对象时,a[:, np.newaxis]与a.reshape(-1, 1)相同。-1代表可以随便取。np.linspace(-1, 1, 300)表示-1到1等间距点取300个。
noise = np.random.normal(0, 0.05, X.shape).astype('float32')#np.random.normal方法初始化符合正态分布的点,第1个参数是正态分布的均值,第2个参数是正态分布的方差,第3个参数是返回值的shape,返回值的数据类型为ndarray对象。
y = np.square(X) - 0.5 + noise#np.square方法对X中的每一个值求平方,- 0.5使用了ndarray对象的广播特性,最后加上噪声noise,将计算结果赋值给变量y。

2.搭建神经网络

import tensorflow as tf 

Weights_1 = tf.Variable(tf.random_normal([1, 10]))#定义Weights,它的形状是连接上一层神经元的个数*连接下一层神经元的个数。
biases_1 = tf.Variable(tf.zeros([1, 10]) + 0.1)#定义biases,它是二维矩阵,行数一直为1,列数为连接下一层神经元的个数,即它的形状为1*连接下一层神经元的个数;
Wx_plus_b_1 = tf.matmul(X, Weights_1) + biases_1#表示wx+b的计算结果
outputs_1 = tf.nn.relu(Wx_plus_b_1)#表示在第1个连接的输出结果,经过激活函数relu得出
#上面4行定义神经网络中的输入层到第1隐层的连接
Weights_2 = tf.Variable(tf.random_normal([10, 1]))
biases_2 = tf.Variable(tf.zeros([1, 1]) + 0.1)
Wx_plus_b_2 = tf.matmul(outputs_1, Weights_2) + biases_2
outputs_2 = Wx_plus_b_2#表示在第2个连接的输出结果,因为此连接的下一层是输出层,所以不需要激活函数
#上面4行定义神经网络中的第1隐层到输出层的连接

loss = tf.reduce_mean(tf.square(y - outputs_2))#定义损失函数,等同于回归预测中的MSE,中文叫做均方误差
optimizer = tf.train.AdamOptimizer(0.1)#调用tf.train库中的AdamOptimizer方法实例化优化器对象
train = optimizer.minimize(loss)#调用优化器的minimize方法定义训练方式,参数为损失函数。方法的返回结果赋值给变量train

3.变量初始化

#对于神经网络模型,重要是其中的W、b这两个参数。开始神经网络模型训练之前,这两个变量需要初始化
init = tf.global_variables_initializer()#tf.global_variables_initializer实例化tensorflow中的Operation对象
session = tf.Session()#调用tf.Session方法实例化会话对象
session.run(init)#调用tf.Session对象的run方法做变量初始化

4.模型训练

#模型训练200次,每运行1次代码session.run(train)则模型训练1次。在训练次数为20的整数倍时,打印训练步数、loss值
for step in range(201):
    session.run(train)
    if step % 20 == 0:
        print(step, 'loss:', session.run(loss))

运行结果:

0 loss: 0.040248208
20 loss: 0.011066726
40 loss: 0.004511993
60 loss: 0.0028382281
80 loss: 0.0026794705
100 loss: 0.0026217068
120 loss: 0.0026041507
140 loss: 0.0025921084
160 loss: 0.002581141
180 loss: 0.0025619685
200 loss: 0.0025474937

在这里插入图片描述
**************************************************************************

基于tensorboard的模型训练可视化:

0.数据准备

在桌面新建一个名为tensorflowtest文件夹,cmd打开jupyter notebook,新建名为tensorflowTest.ipynb
在这里插入图片描述

#检测tensorflow环境
import tensorflow as tf
hello = tf.constant('hello world')
session = tf.Session()
session.run(hello)
import tensorflow as tf
import numpy as np

batch_size = 100
X_data = np.linspace(-1, 1, 300).reshape(-1, 1).astype('float32')
noise = np.random.normal(0, 0.1, X_data.shape).astype('float32')
y_data = np.square(X_data) - 0.5 + noise
with tf.name_scope('inputs'):#scope中文叫做适用范围,每定义一个tf.name_scope,在tensorboard界面的graph中会有一个节点
    X_holder = tf.placeholder(tf.float32, name='input_X')#tf.placeholder方法的第1个参数是tensorflow中的数据类型;第2个关键字参数name的数据类型是字符串,是在tensorboard界面中的显示名
    y_holder = tf.placeholder(tf.float32, name='input_y')

1.搭建神经网络

定义addConnect函数,作用是添加1层连接。
因为该神经网络总共有3层:输入层、隐层、输出层,所以需要调用2次addConnect函数添加2层连接。
addConnect函数第1个参数是输入矩阵,第2个参数是输入矩阵的列数,第3个参数是输出矩阵的列数,第4个参数用来定义是第几层连接,第5个参数是激活函数。
最后6行代码定义损失函数、优化器、训练过程。

def addConnect(inputs, in_size, out_size, n_connect, activation_function=None):
   connect_name = 'connect%s' %n_connect
   with tf.name_scope(connect_name):
       with tf.name_scope('Weights'):
           Weights = tf.Variable(tf.random_normal([in_size, out_size]) ,name='W')
           tf.summary.histogram(connect_name + '/Weights', Weights)
       with tf.name_scope('biases'):
           biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
           tf.summary.histogram(connect_name + '/biases', biases)
       with tf.name_scope('Wx_plus_b'):
           Wx_plus_b = tf.add(tf.matmul(inputs, Weights), biases)
       if activation_function is None:
           return Wx_plus_b
       else:
           return activation_function(Wx_plus_b)
       
connect_1 = addConnect(X_holder, 1, 10, 1, tf.nn.relu)
predict_y = addConnect(connect_1, 10, 1, 2)
with tf.name_scope('loss'):
   loss = tf.reduce_mean(tf.square(y_holder - predict_y))
   tf.summary.scalar('loss', loss)
with tf.name_scope('train'):
   optimizer = tf.train.AdamOptimizer(0.1)
   train = optimizer.minimize(loss)

2.变量初始化

init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)

3.模型训练

import datetime #导入datetime库获取当前时间,从而给文件夹命名
import random

nowTime = datetime.datetime.now()
timestamp = nowTime.strftime('%m%d%H%M%S')
write = tf.summary.FileWriter('logs'+timestamp, session.graph)
#上面三行给新建的日志文件夹命名
merge_all = tf.summary.merge_all()#将绘制标量曲线图SCALARS、变量曲线图DISTRIBUTIONS、变量分布直方图HISTOGRAMS的任务合并交给变量merge_all

for i in range(201):
    select_index = random.sample(range(len(X_data)), k=batch_size)#使用random.sample方法选取数量为batch_size的样本来训练
    select_X = X_data[select_index]
    select_y = y_data[select_index]
    #在200次训练迭代中,第10、11、12行代码选取数量为batch_size的样本来训练
    session.run(train, feed_dict={X_holder:select_X, y_holder:select_y})#每运行1次,即神经网络训练1次
    merged = session.run(merge_all, feed_dict={X_holder:select_X, y_holder:select_y})#获得每次训练后loss、Weights、biases值;
    write.add_summary(merged, i)#把loss、Weights、biases值写入日志文件中

产生日志文件,点进日志文件夹再cmd,输入:tensorboard --logdir ./
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时在浏览器输入上图2或者localhost:6006

4.tensorboard的模型训练可视化

下图为loss的变化曲线图:
在这里插入图片描述
下图为神经网络架构图:
在这里插入图片描述
下图为权重Weights和偏置biases的变化曲线图:
在这里插入图片描述
下图为权重Weights和偏置biases的分布直方图:
在这里插入图片描述
结合matplotlib可视化做对比:在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43435675/article/details/88636622
今日推荐