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實踐》學習記錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM