Aprendizaje profundo para principiantes (1) Entrenamiento iterativo y uso de modelos de los pasos de desarrollo básicos de TensorFlow

Este artículo utiliza la regresión logística para ajustar datos bidimensionales como ejemplo para demostrar los pasos básicos de desarrollo de tensorflow.

Ejemplo: Encuentre la ley de y≈2x a partir de un conjunto de datos aparentemente caóticos

Descripción de ejemplo:

Suponga que hay un conjunto de conjuntos de datos cuya relación correspondiente entre xey es y≈2x.

Hay aproximadamente cuatro pasos en el aprendizaje profundo:

(1) Preparar datos
(2) Construir modelo
(3) Entrenamiento iterativo
(4) Usar modelo

3. Entrenamiento iterativo

(1) Modelo de formación

A través del primer paso para aprender el aprendizaje profundo (1) Pasos básicos de desarrollo de TensorFlow: preparar datos y construir un modelo (avance + retroceso) El segundo paso para construir el modelo, el modelo se puede entrenar a través de la iteración .

Nota: las tareas en tensorflow se llevan a cabo a través de la sesión

# 初始化变量
init = tf.global_variables_initializer() # global_variables_initializer()函数初始化所有变量

# 训练参数
training_epochs = 20 # 设置迭代次数为20次
display_step = 2

# 启动session
with tf.Session() as sess:
    sess.run(init) # 通过sess.进行网络节点的运算
    plotdata = {
    
    "batchsize":[],"loss":[]} # 存放批次值和损失值

    # 向模型输入数据
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={
    
    X: x, Y: y}) # 通过feed机制将真实数据灌到占位符(第二步创建模型时)对应的位置

        # 输出显示训练中的详细信息,每执行一次都会将网络结构的节点打印出来
        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!")
    print ("cost=", sess.run(cost, feed_dict={
    
    X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))

Los resultados muestran que:
Inserte la descripción de la imagen aquí

Se puede ver en los resultados anteriores que el costo (la brecha entre el valor predicho generado y el valor real) es cada vez más pequeño, y W yb (dos parámetros) cambian constantemente.

(2) Visualización del modelo de entrenamiento

# 初始化变量
init = tf.global_variables_initializer() # global_variables_initializer()函数初始化所有变量

# 训练参数
training_epochs = 20 # 设置迭代次数为20次
display_step = 2

# 启动session
with tf.Session() as sess:
    sess.run(init) # 通过sess.进行网络节点的运算
    plotdata = {
    
    "batchsize":[],"loss":[]} # 存放批次值和损失值

    # 向模型输入数据
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={
    
    X: x, Y: y}) # 通过feed机制将真实数据灌到占位符(第二步创建模型时)对应的位置

        # 输出显示训练中的详细信息,每执行一次都会将网络结构的节点打印出来
        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!")
    print ("cost=", sess.run(cost, feed_dict={
    
    X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))

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

    #图形显示
    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()

Los resultados muestran que:
Inserte la descripción de la imagen aquí

  • La línea oblicua que se muestra en la primera imagen es la ecuación lineal de xey formada cuando los parámetros w y b del modelo son constantes, es casi una línea recta con y = 2x.
  • En la segunda imagen, se puede ver que el valor de la pérdida ha ido disminuyendo al principio y se ha estabilizado alrededor de la quinta vez.

4. Usa el modelo

Una vez entrenado el modelo, solo necesita pasar un valor de entrada y luego usar sess.run para ejecutar cada nodo en el modelo para usar el modelo.

# 初始化变量
init = tf.global_variables_initializer() # global_variables_initializer()函数初始化所有变量

# 训练参数
training_epochs = 20 # 设置迭代次数为20次
display_step = 2

# 启动session
with tf.Session() as sess:
    sess.run(init) # 通过sess.进行网络节点的运算
    plotdata = {
    
    "batchsize":[],"loss":[]} # 存放批次值和损失值

    # 向模型输入数据
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={
    
    X: x, Y: y}) # 通过feed机制将真实数据灌到占位符(第二步创建模型时)对应的位置

        # 输出显示训练中的详细信息,每执行一次都会将网络结构的节点打印出来
        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!")
    print ("cost=", sess.run(cost, feed_dict={
    
    X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))

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

    #图形显示
    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}))

Por ejemplo, la última línea del código anterior es: pasar un 0.2 (feed_dict = {X: 0.2}), y luego usar sess.run para ejecutar el nodo z en el modelo, y luego puede ver el valor que genera .

produce resultado:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_45154565/article/details/109800508
Recomendado
Clasificación