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)

猜你喜欢

转载自blog.csdn.net/xiaozhaoshigedasb/article/details/84567068
今日推荐