TF multivariable de regresión lineal --- problema de la vivienda Boston

la diversidad de regresión lineal

En comparación con el de regresión lineal anterior: modelos son lineales, pero las dimensiones de entidad de entrada es multidimensional, debe tenerse en cuenta los datos de predicción para aplicaciones lineales multidimensionales. Este será un ejemplo para los precios de Boston multidimensional modelo lineal, de formación y de pronóstico.

Descripción de datos

  1. Total de 506 muestras, en el que cada muestra estuvo constituida por 12;
  2. datos Csv formato en el almacenamiento, el rendimiento de la fila 13 en una csv 507; la primera columna de nombres de línea, las primeras 12 columnas representan características, los últimos columna muestra el valor del tag.

Leer datos:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn.utils import shuffle

df = pd.read_csv("Boston.csv")
print(df.describe())
print(df)

El código para la carga logra datos CSV. El módulo principal es el uso de los pandas, pandas se basa en bibliotecas de terceros abierto pitón fuente, la carga puede ser utilizado incluyendo varias formas de datos, incluyendo csv, y cuando los datos puede ser índice de la columna csv cargado; utilizando el código de la penúltima línea, se puede obtener para cada archivo de parámetros indicativos columna csv, incluyendo el mayor valor, la media y similares; csv todos los datos utilizando la última fila se pueden imprimir en forma de una tabla. Y, pandas utilizan para formar transformado adicionalmente en np, con el fin de procesamiento adicional, por lo que el numpy módulo de carga.

Preparación de datos

# 将pandas文件转化为numpy格式,因为后续数据分离以及归一化对是基于numpy
df = df.values
df = np.array(df)
print(df)  # 打印所有数据

# 数据归一化,已知有13列数据,前12列是特征,最后一列是标签
# 数据归一化是为了压缩各个特征的取值范围,有利于loss的收敛
# 但是注意是对特征信息给归一化,不要压缩标签值
for i in range(12):
    df[:, i] = df[:, i]/(df[:, i].max()-df[:, i].min())

# 分离csv数据
x_data = df[:, :12]  # 取前12列
y_data = df[:, 12]  # 取第13列

csv lectura de datos después de que el primer formato en np, a hacer después de la matriz de transformación. Debido a las diferentes características de cada una influencia real en el resultado final, así que la convergencia rápida y eficaz de la normalización de datos, compresión de su gama, es un entrenamiento bueno cuando. Nótese, sin embargo, normalizaron contra el valor de entrada, no para valores de variables se normalizaron.

La construcción del modelo

# 建立模型
# 此处的x即为对于一个样本的概述,一个样本有12个特征;为了适应batchsize,此处不指明有几个样本;None可以为1,也可以是更大的
# y同理,每个标签只有一个维度
x = tf.placeholder(tf.float32, [None, 12], name='X')
y = tf.placeholder(tf.float32, [None, 1], name='Y')

with tf.name_scope("Model"):  # 封装权重、偏差、loss以及前向计算于一个命名空间
    w = tf.Variable(tf.random_normal([12, 1], stddev=0.01), name='W')
    b = tf.Variable(1.0, name='b')


    def model(x, w, b):  # 定义前行计算模型
        return(tf.matmul(x,w)+b)


    preb = model(x, w, b)  # 建立前向计算操作

El código anterior para el modelo lineal multidimensional, y establecer una operación de cálculo hacia adelante correspondiente; el código anterior utilizando un espacio de nombres, que es un espacio de nombres algo similar c ++ es, excepto que, el efecto como se usa aquí no sólo más código legible en un espacio de nombres en el gráfico que muestra un subgrafo, es decir, en el gráfico de cómputo tiene una buena legibilidad. Enfoque NINGUNO marcador de posición apreciada, es decir, el número de muestras introducidos no es fijo, lo que tendrá un papel importante en el entrenamiento por lotes.

Preparación antes del entrenamiento

# 设置超参
train_epochs = 200
learning_rate = 0.01
logdir = 'E:/log'

with tf.name_scope("Loss_Function"):  # 封损失函数在此命名空间
    loss_function = tf.reduce_mean(tf.pow(y-preb, 2))

# 优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
# 将loss记录在graph上
sum_loss_op = tf.summary.scalar("loss", loss_function)
merged = tf.summary.merge_all()

Para establecer un buen entrenamiento antes de que los parámetros de Super, el modelo aquí es simple, hyperparametric incluyen sólo el número de rondas de formación y la tasa de aprendizaje, y para establecer la pérdida de la función y el optimizador para el modelo, y, por la pérdida de valor se muestra en el gráfico, este a una sum_loss_op tiempo definido, ya que es tensorboard summary.scalar representada en el escalar, se observa para lograr la pantalla, operación de combinación es necesario, especialmente en una pluralidad de datos a ser tensorboard se muestra, este paso se requiere para tener a.

formación

# 启动会话
sess = tf.Session()
sess.run(tf.global_variables_initializer())
writer = tf.summary.FileWriter(logdir,sess.graph)  # 记录日志
print('***********TRAIN***********')
loss_list = []  # loss统计值集合
for epoch in range(train_epochs):  # 逐轮次训练
    loss_sum = 0.0  # 统计每轮训练的loss值
    for xs, ys in zip(x_data, y_data):  # 从训练数据与标签值中对应抽取数据
        xs = xs.reshape(1, 12)  # feeddict前一定要确保尺寸与占位符规定的一致
        ys = ys.reshape(1, 1)
        _, summary_str, loss = sess.run([optimizer, sum_loss_op, loss_function], feed_dict={x: xs, y: ys})# 进行优化、记录loss,计算loss三个操作
        loss_sum = loss_sum+loss  # 统计每轮训练的loss值
        writer.add_summary(summary_str, epoch)  # 将记录loss的返回值与轮数对应绘制图像
    xvalues, yvaules = shuffle(x_data, y_data)  # 每次训练打乱原数据集

    btemp = b.eval(session=sess)  # 获取此轮训练得到的b值
    wtemp = w.eval(session=sess)  # 获取本轮训练得到的w值
    loss_average = loss_sum/len(y_data)  # 计算本轮评价loss值
    loss_list.append(loss_average)  # 记录本轮评价loss值
    # 打印本轮训练结果
    print("epoch:", epoch+1, "loss: ", loss_average, "b: ", btemp, "w: ", wtemp) 

El código implementado para la formación del modelo; Nota Antes feed_dict, a una dimensión predeterminada para garantizar el valor del marcador de posición de alimentación constante; Después de cada alterar el conjunto de datos de entrenamiento a ser, con el fin de impedir que el modelo de recuperar la respuesta , en otras palabras, para evitar que el modelo como una secuencia de características estaban aprendiendo.

la solicitud de modelo

# 检验模型
n = np.random.randint(506)
print(n)
x_test = x_data[n]
target = y_data[n]
x_test = x_test.reshape(1, 12)
predict = sess.run(preb, feed_dict={x: x_test})

print("prediction: ", predict, "Target: ", target)

writer.close()

Uso de la detección de código de modelo; Como tutorial inicial, el conjunto de datos no es un conjunto de entrenamiento y de prueba división conjunto de validación, sólo los fines experimentales, donde el valor del índice utilizando un generador de números aleatorios, usando el valor de índice para una muestra, para valor de detección de contraste y el valor real de la etiqueta.

 

 

 

 

 

 

Publicado cinco artículos originales · ganado elogios 0 · Vistas 64

Supongo que te gusta

Origin blog.csdn.net/weixin_41707744/article/details/104701216
Recomendado
Clasificación