tensorflow的歸一化與梯度下降
阿新 • • 發佈:2018-11-28
程式碼:
# 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)