Código de visualización de regresión lineal TensorFlow-GPU y resumen del problema

Muestre visualmente el proceso de entrenamiento del modelo de TensorFlow a través de TensorBoard, muestre el cambio del valor de pérdida de entrenamiento con el número de iteraciones y la estructura interna de la red neuronal para comprender mejor la red neuronal.

Uno, crea un mapa

   Al agregar datos escalares y datos de histograma al archivo de registro, y luego mostrarlo a través de TensorBoard, el primer paso se agrega al resumen y el segundo paso se escribe en el archivo.

 El valor generado del modelo se agrega a los datos del histograma (el nombre del histograma es z) y la función de pérdida se agrega a los datos escalares (el nombre escalar es loss_function).

El siguiente código es para crear un Summary_writer después de iniciar la sesión, ejecutar el valor de resumen en la iteración y guardarlo en el archivo.

   el código se muestra a continuación:

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2019/5/16 9:47
# @Author  : xhh
# @Desc    :  线性回归的TensorBoard
# @File    : tensor_tensorBoard.py
# @Software: PyCharm

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

plotdata = {"batchsize":[], "loss":[]}

def moving_average(a, w=10):
    if len(a)<w:
        return a[:]
    return [val if idx < w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]

#  模拟数据
train_X = np.linspace(-1, 1, 100)
train_Y = 2*train_X + np.random.randn(*train_X.shape)*0.3  # 加入了噪声

# 图形展示
plt.plot(train_X,train_Y,'ro',label="original data") # label数据标签
plt.legend()
plt.show()

tf.reset_default_graph()  # 重置会话

# 创建模型
# 占位符
X = tf.placeholder("float")
Y = tf.placeholder("float")
# 模型参数
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.zeros([1]), name="bias")

# 前向结构
z = tf.multiply(X, W) +b
tf.summary.histogram('z',z)  #将预测值以直方图显示

# 反向优化
cost = tf.reduce_mean(tf.square(Y-z))
tf.summary.scalar('loss_function', cost)  #将损失以标量显示
learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# 初始化变量
init = tf.global_variables_initializer()
# 参数设置
training_epochs = 20
display_step = 2
saver = tf.train.Saver() # 模型生成,并保存
savedir = "log/"

# 启动session
with tf.Session() as sess:
    sess.run(init)


    merged_summary_op = tf.summary.merge_all()  # 合并所以summary
    # 创建summary_writer,用于写文件
    summary_writer = tf.summary.FileWriter('log/mnist_with_summaries', sess.graph)

    for epoch in range(training_epochs):
        for (x, y) in zip(train_X,train_Y):
            sess.run(optimizer, feed_dict={X:x, Y:y})

            # 生成summary
            summary_str = sess.run(merged_summary_op, feed_dict={X:x, Y:y})
            summary_writer.add_summary(summary_str, epoch) # 将summary写入文件

        # 显示训练中的详细信息
        if epoch % display_step == 0:
            loss = sess.run(cost, feed_dict={X:train_X, Y:train_Y})
            print("Epoch:",epoch+1,"cost=", loss,"W=",sess.run(W),"b=",sess.run(b))
            if not (loss=="NA"):
                plotdata["batchsize"].append(epoch)
                plotdata["loss"].append(loss)

        print("finished!")
        saver.save(sess, savedir+"linermodel.cpkt")
        print("cost=",sess.run(cost, feed_dict={X:train_X, Y:train_Y}),"W=", sess.run(W),"b=",sess.run(b))

        # 图形显示
        plt.plot(train_X, train_Y, 'ro', label='Original data')
        plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
        plt.legend()
        plt.show()

        plotdata["avgloss"] = moving_average(plotdata["loss"])
        plt.figure(1)
        plt.subplot(211)
        plt.plot(plotdata["batchsize"], plotdata["avgloss"], 'b--')
        plt.xlabel('Minibatch number')
        plt.ylabel('Loss')
        plt.title('Minibatch run vs. Training loss')
        plt.show()

        print("x=0.2, z=",sess.run(z, feed_dict={X: 0.2}))

Para los resultados finales de ejecución, los cambios en el modelo lineal de ajuste durante el proceso de modelado y los cambios en su pérdida se publican a continuación:

Los gráficos de tres líneas en la figura siguiente son los cambios en la función de pérdida al ajustar el modelo, que son los cambios en 2, 8 y 19 veces, respectivamente. El diagrama de dispersión es el modelo ajustado final.

 

La siguiente figura es el archivo de visualización adicional después de la ejecución:

Ingrese a la carpeta, ingrese cmd, active su entorno de Python con la versión TensorFlow-gpu

Luego ingrese:

Es necesario cambiar la dirección. El puerto en la parte posterior se cambió a 8080, y no se puede acceder a mi 6006 predeterminado.

tensorboard --logdir F:\code\tensor_test\log\mnist_with_summaries --port=8080

Los resultados después de la ejecución final son los siguientes:

Luego abra el navegador de Google (preferiblemente Google), ingrese http: // localhost: 8080 para visitar y podrá ver:

El valor de pérdida cambia con el número de iteraciones:

La estructura interna de la red neuronal:

Haga clic en ESCALARES y verá la función loss_function creada antes. Después de hacer clic en ella, puede ver el cambio del valor de pérdida con el número de iteraciones. Como se muestra arriba.

2. Problemas que pueden surgir

(1) Estos problemas pueden ocurrir en cmd:

No se puede acceder a lo anterior porque no hay una python TensorFlow-gpu correspondiente.

(2) Problemas con TensorFlow-GPU y el entorno de Python

El mío es Python == 3.6.2 en la siguiente figura, tensorflow-gpu == 1.13.1

El entorno de python y la versión de tensorflow-gpu no son compatibles, por lo que ocurren los siguientes problemas, es mejor cambiar el entorno de python a python = 3.6.7 e instalar TensorFlow-gpu = 1.13.1 y luego ejecutarlo correctamente

(3) Problemas de acceso

Cuando se usa 127.0.0.1:6006, se deniega el acceso al acceder, de la siguiente manera:

Esto se debe a que la dirección IP predeterminada de la máquina es localhost, por lo que no se puede acceder a ella. Se puede acceder cambiando a localhost.

Puede parecer que no se puede acceder al puerto 6006. En este momento, debe especificar IP = 8080 en la parte posterior, y luego el acceso es correcto.

 

Puedes prestar atención a la cuenta oficial de mi amigo y yo ~~~ ¡Aquí hay información técnica de Python que mi amigo y yo actualizamos de vez en cuando! ! También puede dejar un mensaje y discutir problemas técnicos. Espero que pueda apoyarlo y prestarle atención. Gracias ~~

 

 

 

 

 

 

       

  

Supongo que te gusta

Origin blog.csdn.net/weixin_39121325/article/details/90257354
Recomendado
Clasificación