1. 程式人生 > >tensorflow的歸一化與梯度下降

tensorflow的歸一化與梯度下降

程式碼:

# coding=utf-8
# By author MZ


import  numpy as np
from sklearn.datasets import load_boston
import tensorflow as tf
from sklearn.preprocessing import StandardScaler


## 從sklearn的資料集中拿出波士頓房價資料
boston = load_boston()
x=boston.data #獲取資料集中的真實資料
y=boston.target #資料的標籤
print(y.shape) # 列印下資料的shape
m,n = boston.data.shape
## numpy的.c_是combine,用來將兩個矩陣進行相加(按列)
X = np.c_[np.ones((m, 1)), x]
## 使用sklearn中的StandardScaler類可以將資料按期屬性(按列進行)減去其均值,併除以其方差。
## 得到的結果是,對於每個屬性/每列來說所有資料都聚集在0附近,方差為1。
## 好處在於可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料
## 對資料進行歸一化後,梯度下降的速度會有明顯的提升
scaler = StandardScaler().fit(X)
scaled_housing_data_plus_bias = scaler.transform(X)



## 定義兩個常量,一個是x一個是y
X_true = tf.constant(scaled_housing_data_plus_bias, dtype=tf.float32, name="xx")
y_true = tf.constant(y, dtype=tf.float32, name="yy")

# tf.random_uniform類似於numpy的ranom.rand
theta=tf.Variable(tf.random_uniform([n + 1, 1],-1.0,1.0),name="theta")


y_hat=tf.matmul(X_true,theta,name="y_hat")
erro=y_hat-y_true
# print(y_true.shape)
# print(y_hat.shape)

##求資料的均方根誤差
mse = tf.reduce_mean(tf.square(erro), name="mse")
## 直接使用tensorflow定義好的gradients方法求梯度
gradients = tf.gradients(mse, [theta])[0]

##定義學習率為0.01
learning_rate=0.01
##tf的assign方法,是賦值操作,將後一個引數的值賦給前一個引數
training_op = tf.assign(theta, theta - learning_rate * gradients)

## 初始化變數
initializer = tf.global_variables_initializer()
# epochs是訓練次數
n_epochs = 1000
with tf.Session() as sess:
    sess.run(initializer) #初始化
    ## 迭代,等待梯度下降
    for epochs in range(n_epochs):
        ## eval方法類似於session的run方法,也是啟動計算的一種方式
        ## mse.eval()等價於sess.run(mse)
        print("epochs: ",epochs," MSE: ",mse.eval())
        sess.run(training_op)
    best_theta = theta.eval()
    print(best_theta)