Python通过TensorFLow进行线性模型训练原理与实现方法详解
本文实例讲述了Python通过TensorFLow进行线性模型训练原理与实现方法。分享给大家供大家参考,具体如下:
1、相关概念
2、算法设计与训练
准备数据
#在jupyter中设置图像的显示方式inline,否则图像不显示 %matplotlibinline importtensorflowastf importnumpyasnp#Python的一种开源的数值计算扩展 importmatplotlib.pyplotasplt#Python的一种绘图库 np.random.seed(5)#设置产生伪随机数的类型 x=np.linspace(-1,1,100)#在-1到1之间产生100个等差数列作为图像的横坐标 #根据y=2*x+1+噪声产生纵坐标 #randn(100)表示从100个样本的标准正态分布中返回一个样本值,0.4为数据抖动幅度 y=2*x+1.0+np.random.randn(100)*0.4 plt.scatter(x,y)#生成散点图 plt.plot(x,2*x+1,color='red',linewidth=3)#生成直线y=2x+1
构建模型
#定义函数模型,y=kx+b defmodel(x,k,b): returntf.multiply(k,x)+b #定义模型中的参数变量,并为其赋初值 k=tf.Variable(1.0,name='k') b=tf.Variable(0,name='b') #定义训练数据的占位符,x为特征值,y为标签 x=tf.placeholder(name='x') y=tf.placeholder(name='y') #通过模型得出特征值x对应的预测值yp yp=model(x,k,b)
训练模型
#训练模型,设置训练参数(迭代次数、学习率)
train_epoch=10
rate=0.05
#定义均方差为损失函数
loss=tf.reduce_mean(tf.square(y-yp))
#定义梯度下降优化器,并传入参数学习率和损失函数
optimizer=tf.train.GradientDescentOptimizer(rate).minimize(loss)
ss=tf.Session()
init=tf.global_variables_initializer()
ss.run(init)
#进行多轮迭代训练,每轮将样本值逐个输入模型,进行梯度下降优化操作得出参数,绘制模型曲线
for_inrange(train_epoch):
forx1,y1inzip(sx,sy):
ss.run([optimizer,loss],feed_dict={x:x1,y:y1})
tmp_k=k.eval(session=ss)
tmp_b=b.eval(session=ss)
plt.plot(sx,tmp_k*sx+tmp_b)
ss.close()
进行预测
3、数组操作
scalar=1
scalar_np=np.array(scalar)#将标量转化为np的数组类型
print(scalar_np.shape)#只有np才有shape属性,标量对应的shape输出为()
#二维以上的有序数组才可以看作矩阵
matrix=[[1,2,3],[4,5,6]]
matrix_np=np.array(matrix)#将list转化为np矩阵
print('二维数组:',matrix)#输出为单行数组
print('矩阵形式:\n',matrix_np)#结果将以多行矩阵的形式输出
print('矩阵转置:\n',matrix_np.T)
print('shape值',matrix_np.shape)
ma=np.array([[1,2,3],[4,5,6]]) mb=np.array([[1,2],[3,4],[5,6]]) print(ma+ma) print(ma*ma)#矩阵点乘 print(np.matmul(ma,mb))#矩阵叉乘
4、多元线性回归模型
%matplotlibnotebook
importtensorflowastf
importmatplotlib.pyplotasplt
importnumpyasnp
importpandasaspd
fromsklearn.utilsimportshuffle
#利用pandas读取数据csv文件
data=pd.read_csv('D:/Temp/data/boston.csv',header=0)
#显示数据摘要描述信息
#print(data.describe())
data=np.array(data.values)#将data的值转换为np数组
foriinrange(12):#将所有数据进行归一化处理
data[:,i]=data[:,i]/(data[:,i].max()-data[:,i].min())
x_data=data[:,:12]#截取所有行,0到11列作为特质值x
y_data=data[:,12]#截取所有行,第12列作为标签值y
x=tf.placeholder(tf.float32,[None,12],name='x')
#None代表行数不确定,12代表一行特征值有12个子数据
y=tf.placeholder(tf.float32,[None,1],name='y')
withtf.name_scope('Model'):#定义命名空间
k=tf.Variable(tf.random_normal([12,1],stddev=0.01),name='k')
b=tf.Variable(1.0,name='b')
defmodel(x,k,b):
returntf.matmul(k,x)+b#数组k,x进行叉乘运算再加上b
yp=model(x,k,b)
#定义超参数:训练次数、学习率、损失函数
train_epochs=50
learning_rate=0.01
withtf.name_scope('Loss'):
loss_function=tf.reduce_mean(tf.square(y-yp))
#使用梯度下降法定义优化器
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
ss=tf.Session()
init=tf.global_variables_initializer()
ss.run(init)
loss_list=[]
for_inrange(train_epochs):
loss_sum=0
for(xs,ys)inzip(x_data,y_data):
xs=xs.reshape(1,12)#调整数据的维数格式以匹配占位符x
ys=ys.reshape(1,1)
_,loss=ss.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
loss_sum+=loss
shuffle(x_data,y_data)#每轮循环后,打乱数据顺序
k_tmp=k.eval(session=ss)
b_tmp=b.eval(session=ss)
print('k:',k_tmp,',b:',b_tmp)
loss_avg=loss_sum/len(y_data)#求每轮的损失值
loss_list.append(loss_avg)
plt.plot(loss_list)
注:
运行结果如下,截取部分的参数值以及损失值的曲线:
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。