为了学习深度学习,深入了解Tensorflow,所以学习了网课Tensorflow实践,以下代码主要来自于该网站:https://www.icourse163.org/learn/ZUCC-1206146808?tid=1206445215#/learn/content?type=detail&id=1211172103&cid=1213735441&replay=true
该模型研究的是关于波士顿房价预测,基于Tensorflow使用了线性回归模型将12组影响房价因素和标签值进行拟合。
加载模块
第一行和第二行用来代替import tensorflow as tf,因为pip下载的最新的2.0.0本版tensorflow中省略安装placeholder函数。
pandas用于读取本地数据
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.utils import shuffle
数据预处理
由于12组数据的大小相差很大,所以将每一行的数据进行归一化处理,都缩放到[0,1]之间。
df=pd.read_csv("e:boston housing price/boston_data.csv",header=0)
#print(df.describe())
df=df.values
df=np.array(df)
for i in range(12):
df[:,i]=df[:,i]/(df[:,i].max()-df[:,i].min())
x_data=df[:,:12]
'''逗号前面表示数据取到每一行,逗号后面表示取12行'''
y_data=df[:,12]
'''逗号前面表示数据取到每一行,逗号后面只取第12行'''
定义数据创建预留空间
x定义了未知行数,12列的空间内存,y定义了未知行数,1列的空间内存
x=tf.placeholder(tf.float32,[None,12],name="X")
y=tf.placeholder(tf.float32,[None,1],name="Y")
#命名空间为Model
with tf.name_scope("Model"):
#w为权重,设置为[12,1]的随机数组,标准差设为0.01
w=tf.Variable(tf.random_normal([12,1],stddev=0.01),name="W")
#b为固定值1
b=tf.Variable(1.0,name="b")
#函数返回矩阵x与w的相乘加上b
def model(x,w,b):
return tf.matmul(x,w)+b
#前向节点
pred=model(x,w,b)
定义损失函数
这里调用传统的梯度下降模型进行计算,并且启动会话。
with tf.name_scope("LossFunction"):
loss_function=tf.reduce_mean(tf.pow(y-pred,2))
#对数据的均方误差进行梯度下降,y-pred是损失值
#设置模型参数:训练次数为50次,学习率为0.01
train_epochs=8000
learning_rate=0.01
#选择一个合适的优化器,有GRADIENTDESCENTOPTIMIZER,ADAGRADOPTIMIZER等等,我们选用第一个
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
#会话是tensorflow重要元素之一,模型的训练就是在会话中进行的
sess= tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
开始训练并且检测
#reshape的,train_epochs为8000
for epoch in range(train_epochs):
loss_sum=0.0
for xs,ys in zip(x_data,y_data):
#xs,ys取x_data和y_data的每一行,这时xs,ys都是一维数据,因此要转换为二维数组与x,y数据类型保持一致
xs =xs.reshape(1,12)
ys=ys.reshape(1,1)
#feed函数用于将xs,ys数据带入x,y中
_,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
loss_sum=loss_sum+loss
xvalues,yvalues=shuffle(x_data,y_data)
btemp=b.eval(session=sess)
wtemp=w.eval(session=sess)
loss_average=loss_sum/len(y_data)
print("epoch=",1+epoch,"loss=",loss_average)
print("w的权值为:",wtemp,"\nb的权值为:",btemp)
#导入测试样本,这里的样本从训练集中随机抽出
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)