ejemplo básico de tensorflow (1)

      En este artículo, explico principalmente los conceptos básicos de TensorFlow, las sesiones de uso común, las definiciones constantes, la generación de modelos y el almacenamiento de modelos, y cómo ver el contenido guardado real en el modelo.

1. Modelo de TensorFlow

    El nombre de TensorFlow proviene de su principio operativo. Tensor (tensor) representa una matriz N-dimensional, Flujo (flujo) significa cálculo basado en el gráfico de flujo de datos.

    Tensorflow es el cálculo (modelo de programación) donde un tensor fluye de un extremo de la imagen al otro .

2. El mecanismo operativo del modelo

    El mecanismo operativo de TensorFlow está separado de "definición" y "operación". Desde el punto de vista operativo, se divide en dos capas: construcción del modelo y operación del modelo.

    Los conceptos necesarios para la construcción de modelos son los siguientes:

    

      La definición anterior es una "imagen":

  •  Un "gráfico" es una tarea computacional
  • Cuando el modelo se está ejecutando, el "gráfico" se iniciará en la sesión,
  • La sesión distribuye la operación del gráfico a la CPU o al dispositivo GPU y luego proporciona un método para ejecutar la operación. Después de la ejecución, devolverá un valor de Tensor. En Python, el Tensor devuelto es un objeto ndarry numpy; en C o C ++, devuelve una instancia de Tensor.

   La relación de trabajo entre la sesión y el gráfico es la siguiente:

  

    En el entorno real, el funcionamiento de la figura anterior se divide en tres tipos, escenarios de entrenamiento, escenarios de prueba y escenarios de uso. La escena de entrenamiento es diferente a las otras dos escenas.

  (1) Escenario de formación: El proceso de realización del modelo desde cero, mediante el aprendizaje y entrenamiento de muestras, ajustando los parámetros de aprendizaje y conformando el modelo final.

           Proceso: Tomando la muestra y etiqueta dadas como el nodo de entrada, a través de un gran número de iteraciones de bucle, el valor obtenido por la operación directa (desde la muestra de entrada a través de la operación op para obtener la dirección de salida) en el gráfico, y la operación inversa (desde la salida A la dirección de entrada), para actualizar los parámetros de aprendizaje en el modelo y, finalmente, obtener la etiqueta de muestra cercana que maximiza el resultado positivo del modelo.

   (2) Escenario de prueba y escenario de aplicación: El escenario de prueba usa el cálculo hacia adelante del gráfico para comparar el resultado con el valor real para obtener el valor de error; el escenario de uso también usa el cálculo hacia adelante del gráfico para obtener el resultado y usarlo directamente. En una función, se puede dividir en parámetros reales, parámetros formales, cuerpo de la función y valor de retorno. En el modelo, los parámetros reales son las muestras de entrada, los parámetros formales son los marcadores de posición, el proceso de operación es equivalente al cuerpo de la función y el resultado obtenido es el valor de retorno.

Otros flujos de datos definidos bajo la interacción entre sesión y gráfico:

  • Mecanismo de inyección (alimentación): pasa datos al patrón a través de marcadores de posición
  • Mecanismo de recuperación (recuperación): obtiene resultados del patrón

Tres, ejemplos

   1. La función de la sesión y ejemplos de uso

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2019/5/15 11:32
# @Author  : xhh
# @Desc    :  session的演示
# @File    : tensor_tf4.py
# @Software: PyCharm

import tensorflow as tf

hello = tf.constant('hello, tensorflow')  # 定义一个常量
sess = tf.Session()  # 建立一个session
print(sess.run(hello))  # 通过sess中的run函数来运行结果
sess.close()  # 关闭session

resultado de la operación:

Nota: Si la constante que define contiene chino,

hello = tf.constant('你好, tensorflow')  # 定义一个常量

Sí, habrá problemas de codificación.

En el código anterior, tf.constant define una constante y el contenido de hello solo se puede devolver en la ejecución de la sesión.

2. Uso de con sesión

Con session es lo que usaremos con frecuencia en el futuro. Utiliza con el uso en Python. Cuando el programa finalice, la sesión se cerrará automáticamente. No es necesario cerrar manualmente.

Ejemplo: use el método de sesión con para establecer una sesión y calcule los valores de suma y multiplicación de dos variables (3 y 4) en la sesión

import tensorflow as tf

a = tf.constant(3)  # 定义常量3
b = tf.constant(4)  # 定义常量4
with tf.Session() as sess:   # 建立session
    print("相加: %i"%sess.run(a+b))
    print("相乘: %i"%sess.run(a*b))

     resultado de la operación:

3. Mecanismo de inyección

Inyecte parámetros reales específicos en el marcador de posición correspondiente. El feed solo es válido en el método que lo llama, y ​​el feed desaparece una vez finalizado el método.

Defina marcadores de posición, utilice el mecanismo de alimentación para pasar valores específicos a través de los marcadores de posición y agréguelos y multiplíquelos.

import tensorflow as tf
a = tf.placeholder(tf.int16)
b = tf.placeholder(tf.int16)
add = tf.add(a, b)
mul = tf.multiply(a, b)

with tf.Session() as sess:
    # 计算具体数值
    print("feed相加:%i"%sess.run(add, feed_dict={a:3, b:4}))
    print("feed相乘:%i"%sess.run(mul, feed_dict={a:3, b:4}))

resultado de la operación:

Método de marcado: use tf.placeholder para crear marcadores de posición para estas operaciones, y luego use feed_dict para poner valores específicos en los marcadores de posición.

 4. Guardar / cargar modelo de regresión lineal

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

# 反向优化
cost = tf.reduce_mean(tf.square(Y-z))
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)

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

        # 显示训练中的详细信息
        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()

El modelo se genera en la carpeta de registro en el mismo directorio:

Después de reiniciar una sesión y nombrarla sess2, cargue el modelo a través de la función de restauración del protector

    # 重启一个Session
    with tf.Session() as sess2:
        sess2.run(tf.global_variables_initializer())
        saver.restore(sess2, savedir+"linermodel.cpkt")
        print("x=0.2, z=",sess2.run(z, feed_dict={X: 0.2}))

Resultados de la prueba:

5. Ver el contenido del modelo

Ver el contenido interno del modelo guardado

from tensorflow.python.tools.inspect_checkpoint import print_tensors_in_checkpoint_file

savedir = "log/"
print_tensors_in_checkpoint_file(savedir+"linermodel.cpkt",None,True)

resultado de la operación:

A través de los resultados de la operación, puede ver que el nombre de la variable creada y su valor se guardan en el modelo.

 

Puedes prestar atención a la cuenta oficial mía y de mis amigos ~~~ ¡Aquí hay algunos materiales técnicos de Python que mis amigos y yo actualizamos de vez en cuando! ! También puede dejar un mensaje para discutir problemas técnicos, espero que pueda apoyar, prestar atención, haga clic en el pequeño anuncio, gracias ~~

 

Supongo que te gusta

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