Tensorflow之多元线性回归问题(以波士顿房价预测为例)
一、根据波士顿房价信息进行预测,多元线性回归+特征数据归一化
#读取数据 %matplotlib notebook import tensorflow as tf import matplotlib.pyplot as plt import numpy as np import pandas as pd #能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具 from sklearn.utils import shuffle #随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值 #读取数据文件 df = pd.read_csv("data/boston.csv",header=0) #显示数据描述信息 # print(df.describe()) # print(df) #数据准备 #获取df的值 df = df.values #把df转换成np的数组格式 df = np.array(df) #特征数据归一化 #对特征数据{0到11}列 做(0-1)归一化 for i in range(12): df[:,i] = (df[:,i]-df[:,i].min())/(df[:,i].max()-df[:,i].min()) #x_data为归一化后的前12列特征数据 x_data = df[:,:12] #y_data为最后1列标签数据 y_data = df[:,12] #模型定义 #定义特征数据和标签数据的占位符 #shape中None表示行的数量未知,在实际训练时决定一次带入多少行样本,从一个样本的随机SDG到批量SDG都可以 x = tf.placeholder(tf.float32,[None,12],name = "X") #12个特征数据(12列) y = tf.placeholder(tf.float32,[None,1],name = "Y") #1个标签数据(1列) #定义模型函数 #定义了一个命名空间. #命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/ #因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级 with tf.name_scope("Model"): # w 初始化值为shape=(12,1)的随机数 w = tf.Variable(tf.random_normal([12,1],stddev=0.01),name="W") # b 初始化值为1.0 b = tf.Variable(1.0,name="b") # w和x是矩阵相乘,用matmul,不能用mutiply或者* def model(x,w,b): return tf.matmul(x,w) + b #预测计算操作,前向计算节点 pred = model(x,w,b) #模型训练 #设置训练超参数 #迭代轮次 train_epochs = 50 #学习率 learning_rate = 0.01 #定义均方差损失函数 #定义损失函数 with tf.name_scope("LossFunction"): loss_function = tf.reduce_mean(tf.pow(y-pred,2)) #均方误差 #创建优化器 optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function) #声明会话 sess = tf.Session() #定义初始化变量的操作 init = tf.global_variables_initializer() #启动会话 sess.run(init) #迭代训练 for epoch in range(train_epochs): loss_sum = 0.0 for xs,ys in zip(x_data,y_data): xs = xs.reshape(1,12) ys = ys.reshape(1,1) #feed数据必须和Placeholder的shape一致 _,loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys}) loss_sum = loss_sum + loss #打乱数据顺序,防止按原次序假性训练输出 x_data,y_data = shuffle(x_data,y_data) b0temp = b.eval(session=sess) #训练中当前变量b值 w0temp = w.eval(session=sess) #训练中当前权重w值 loss_average = loss_sum/len(y_data) #当前训练中的平均损失 print("epoch=",epoch+1,"loss=",loss_average,"b=",b0temp,"w=",w0temp) #模型应用 n = np.random.randint(506) #随机确定一条来看看效果 print(n) x_test = x_data[n] x_test = x_test.reshape(1,12) predict = sess.run(pred,feed_dict={x:x_test}) print("预测值:%f"%predict) target = y_data[n] print("标签值:%f"%target)
二、根据波士顿房价信息进行预测,多元线性回归+特征数据归一化+可视化
#读取数据 %matplotlib notebook import tensorflow as tf import matplotlib.pyplot as plt import numpy as np import pandas as pd #能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具 from sklearn.utils import shuffle #随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值 #读取数据文件 df = pd.read_csv("data/boston.csv",header=0) #显示数据描述信息 # print(df.describe()) # print(df) #数据准备 #获取df的值 df = df.values #把df转换成np的数组格式 df = np.array(df) #特征数据归一化 #对特征数据{0到11}列 做(0-1)归一化 for i in range(12): df[:,i] = (df[:,i]-df[:,i].min())/(df[:,i].max()-df[:,i].min()) #x_data为归一化后的前12列特征数据 x_data = df[:,:12] #y_data为最后1列标签数据 y_data = df[:,12] #模型定义 #定义特征数据和标签数据的占位符 #shape中None表示行的数量未知,在实际训练时决定一次带入多少行样本,从一个样本的随机SDG到批量SDG都可以 x = tf.placeholder(tf.float32,[None,12],name = "X") #12个特征数据(12列) y = tf.placeholder(tf.float32,[None,1],name = "Y") #1个标签数据(1列) #定义模型函数 #定义了一个命名空间. #命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/ #因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级 with tf.name_scope("Model"): # w 初始化值为shape=(12,1)的随机数 w = tf.Variable(tf.random_normal([12,1],stddev=0.01),name="W") # b 初始化值为1.0 b = tf.Variable(1.0,name="b") # w和x是矩阵相乘,用matmul,不能用mutiply或者* def model(x,w,b): return tf.matmul(x,w) + b #预测计算操作,前向计算节点 pred = model(x,w,b) #模型训练 #设置训练超参数 #迭代轮次 train_epochs = 50 #学习率 learning_rate = 0.01 #定义均方差损失函数 #定义损失函数 with tf.name_scope("LossFunction"): loss_function = tf.reduce_mean(tf.pow(y-pred,2)) #均方误差 #创建优化器 optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function) #声明会话 sess = tf.Session() #定义初始化变量的操作 init = tf.global_variables_initializer() #启动会话 sess.run(init) #迭代训练 loss_list = [] #用于保存loss值的列表 for epoch in range(train_epochs): loss_sum = 0.0 for xs,ys in zip(x_data,y_data): xs = xs.reshape(1,12) ys = ys.reshape(1,1) #feed数据必须和Placeholder的shape一致 _,loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys}) loss_sum = loss_sum + loss loss_list.append(loss) #每步添加一次 #打乱数据顺序,防止按原次序假性训练输出 x_data,y_data = shuffle(x_data,y_data) b0temp = b.eval(session=sess) #训练中当前变量b值 w0temp = w.eval(session=sess) #训练中当前权重w值 loss_average = loss_sum/len(y_data) #当前训练中的平均损失 # loss_list.append(loss_average) #每轮添加一次 print("epoch=",epoch+1,"loss=",loss_average,"b=",b0temp,"w=",w0temp) plt.plot(loss_list) #模型应用 n = np.random.randint(506) #随机确定一条来看看效果 print(n) x_test = x_data[n] x_test = x_test.reshape(1,12) predict = sess.run(pred,feed_dict={x:x_test}) print("预测值:%f"%predict) target = y_data[n] print("标签值:%f"%target)
三、根据波士顿房价信息进行预测,多元线性回归+特征数据归一化+可视化+TensorBoard可视化
#读取数据 %matplotlib notebook import tensorflow as tf import matplotlib.pyplot as plt import numpy as np import pandas as pd #能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具 from sklearn.utils import shuffle #随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值 #读取数据文件 df = pd.read_csv("data/boston.csv",header=0) #显示数据描述信息 # print(df.describe()) # print(df) #数据准备 #获取df的值 df = df.values #把df转换成np的数组格式 df = np.array(df) #特征数据归一化 #对特征数据{0到11}列 做(0-1)归一化 for i in range(12): df[:,i] = (df[:,i]-df[:,i].min())/(df[:,i].max()-df[:,i].min()) #x_data为归一化后的前12列特征数据 x_data = df[:,:12] #y_data为最后1列标签数据 y_data = df[:,12] #模型定义 #定义特征数据和标签数据的占位符 #shape中None表示行的数量未知,在实际训练时决定一次带入多少行样本,从一个样本的随机SDG到批量SDG都可以 x = tf.placeholder(tf.float32,[None,12],name = "X") #12个特征数据(12列) y = tf.placeholder(tf.float32,[None,1],name = "Y") #1个标签数据(1列) #定义模型函数 #定义了一个命名空间. #命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/ #因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级 with tf.name_scope("Model"): # w 初始化值为shape=(12,1)的随机数 w = tf.Variable(tf.random_normal([12,1],stddev=0.01),name="W") # b 初始化值为1.0 b = tf.Variable(1.0,name="b") # w和x是矩阵相乘,用matmul,不能用mutiply或者* def model(x,w,b): return tf.matmul(x,w) + b #预测计算操作,前向计算节点 pred = model(x,w,b) #模型训练 #设置训练超参数 #迭代轮次 train_epochs = 50 #学习率 learning_rate = 0.01 #定义均方差损失函数 #定义损失函数 with tf.name_scope("LossFunction"): loss_function = tf.reduce_mean(tf.pow(y-pred,2)) #均方误差 #创建优化器 optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function) #声明会话 sess = tf.Session() #定义初始化变量的操作 init = tf.global_variables_initializer() #为TensorBoard可视化准备数据 #设置日志存储目录 logdir='d:/log' #创建一个操作,用于记录损失值loss,后面在TensorBoard中SCALARS栏可见 sum_loss_op = tf.summary.scalar("loss",loss_function) #把所有需要记录摘要日志文件的合并,方便一次性写入 merged = tf.summary.merge_all() #启动会话 sess.run(init) #创建摘要的文件写入器 #创建摘要writer,将计算图写入摘要文件,后面在Tensorflow中GRAPHS栏可见 writer = tf.summary.FileWriter(logdir,sess.graph) #迭代训练 loss_list = [] #用于保存loss值的列表 for epoch in range(train_epochs): loss_sum = 0.0 for xs,ys in zip(x_data,y_data): xs = xs.reshape(1,12) ys = ys.reshape(1,1) #feed数据必须和Placeholder的shape一致 _,summary_str,loss = sess.run([optimizer,sum_loss_op,loss_function],feed_dict={x:xs,y:ys}) writer.add_summary(summary_str,epoch) loss_sum = loss_sum + loss # loss_list.append(loss) #每步添加一次 #打乱数据顺序,防止按原次序假性训练输出 x_data,y_data = shuffle(x_data,y_data) b0temp = b.eval(session=sess) #训练中当前变量b值 w0temp = w.eval(session=sess) #训练中当前权重w值 loss_average = loss_sum/len(y_data) #当前训练中的平均损失 loss_list.append(loss_average) #每轮添加一次 print("epoch=",epoch+1,"loss=",loss_average,"b=",b0temp,"w=",w0temp) plt.plot(loss_list) #模型应用 n = np.random.randint(506) #随机确定一条来看看效果 print(n) x_test = x_data[n] x_test = x_test.reshape(1,12) predict = sess.run(pred,feed_dict={x:x_test}) print("预测值:%f"%predict) target = y_data[n] print("标签值:%f"%target)
———网易云课堂《深度学习应用开发Tensorflow实践》学习记录