import tensorflow as tf def myregession(): """ 自实现一个线性回归预测 :return: None """ #1. 准备数据 x 特征值,[100,1], 100个样本,1个特征 # y 目标值 ,[100] x=tf.random_normal([10,1],mean=1.75,stddev=0.5,name="x_data")#这个是真实的特征值 y_true= tf.matmul(x,[[0.7]])+0.8 #先假设已经知道这个线性关系,其实现实中是不知道的,为了准备准据,才这样假设的 #注:矩阵相乘必须是二维的 # 2. 建立线性回归模型,一个特征,1个权重,一个偏置,y=wx+b #w,b需要随机初始化一个值,从这个地方开始优化,从这个地方计算损失,然后在当前状态下优化 #trainable参数是指定这个变量能否跟着梯度下降一起优化 weight= tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name="w",trainable=False) #权重必须定义成tf的变量,因为只有用变量定义才能优化,必须是二维的,所以定义成1行1列 bias=tf.Variable(0.0,name='b') y_predict=tf.matmul(x,weight)+bias # 3. 建立损失函数,求均方误差 loss=tf.reduce_mean(tf.square(y_true-y_predict)) # 3. 梯度下降优化损失,learning_rate:0~1,2,3,5,7,10 train_op=tf.train.ProximalGradientDescentOptimizer(0.1).minimize(loss) #定义个一个初始化变量的 op init_op=tf.global_variables_initializer() #通过会话运行程序 with tf.Session() as sess: # 初始化变量 sess.run(init_op) #打印最先随机初始化的权重和偏置 print("随机初始化的参数,权重为:%f,偏置为:%f"%(weight.eval(),bias.eval())) #注:weight,bias是不能直接打印的,因为它们是op # 运行优化 #循环训练,持续优化 for i in range(300): sess.run(train_op) print("第%d次运行优化后的参数,权重为:%f,偏置为:%f" % (i,weight.eval(), bias.eval())) return None if __name__=="__main__": myregession()
运行结果:
随机初始化的参数,权重为:0.923550,偏置为:0.000000
第0次运行优化后的参数,权重为:0.923550,偏置为:0.067194
第1次运行优化后的参数,权重为:0.923550,偏置为:0.135915
第2次运行优化后的参数,权重为:0.923550,偏置为:0.186926
第3次运行优化后的参数,权重为:0.923550,偏置为:0.225835
第4次运行优化后的参数,权重为:0.923550,偏置为:0.257090
第5次运行优化后的参数,权重为:0.923550,偏置为:0.287806
第6次运行优化后的参数,权重为:0.923550,偏置为:0.299400
第7次运行优化后的参数,权重为:0.923550,偏置为:0.315512
第8次运行优化后的参数,权重为:0.923550,偏置为:0.341794
第9次运行优化后的参数,权重为:0.923550,偏置为:0.345407
第10次运行优化后的参数,权重为:0.923550,偏置为:0.358482
第11次运行优化后的参数,权重为:0.923550,偏置为:0.369397
第12次运行优化后的参数,权重为:0.923550,偏置为:0.372021
第13次运行优化后的参数,权重为:0.923550,偏置为:0.399361
第14次运行优化后的参数,权重为:0.923550,偏置为:0.394093
第15次运行优化后的参数,权重为:0.923550,偏置为:0.399880
第16次运行优化后的参数,权重为:0.923550,偏置为:0.398234
第17次运行优化后的参数,权重为:0.923550,偏置为:0.399431
第18次运行优化后的参数,权重为:0.923550,偏置为:0.400979
第19次运行优化后的参数,权重为:0.923550,偏置为:0.399697
第20次运行优化后的参数,权重为:0.923550,偏置为:0.405342
第21次运行优化后的参数,权重为:0.923550,偏置为:0.403404
第22次运行优化后的参数,权重为:0.923550,偏置为:0.409384
第23次运行优化后的参数,权重为:0.923550,偏置为:0.421517
...
第296次运行优化后的参数,权重为:0.923550,偏置为:0.397181
第297次运行优化后的参数,权重为:0.923550,偏置为:0.397113
第298次运行优化后的参数,权重为:0.923550,偏置为:0.392938
第299次运行优化后的参数,权重为:0.923550,偏置为:0.405100
Process finished with exit code 0
可见,trainable设为false的时候,weight是没有跟着梯度下降一起优化的。