文章目录
- 一些概念、函数、用法
- TensorFlow实现一元线性回归
- TensorFlow实现多元线性回归
一些概念、函数、用法
对象Variable
创建对象Variable:
tf.Variable(initial_value,dtype)
利用这个方法,默认整数为int32,浮点数为float32,注意Numpy默认的浮点数类型是float64,如果想和Numpy数据进行对比,则需要修改与numpy一致,否则在机器学习中float32位够用了。
将张量封装为可训练变量
print(tf.Variable(tf.random. normal([2,2])))
<tf.Variable ‘Variable:0’ shape=(2, 2) dtype=float32, numpy=array([[-1.2848959 , -0.22805293],[-0.79079854, 0.7035335 ]], dtype=float32)>
trainalbe属性
用来检查Variable变量是否可训练
x.trainalbe
可训练变量赋值,注意x是Variable对象类型,不是tensor类型
x.assign()
x.assign_add()
x.assign_sub()
用isinstance()方法来判断是tensor还是Variable
自动求导
with GradientTape() as tape:
函数表达式
grad=tape.gradient(函数,自变量)
x=tf.Variable(3.)
with tf.GradientTape() as tape:y=tf.square(x)
dy_dx = tape.gradient(y,x)
print(y)
print(dy_dx)
tf.Tensor(9.0, shape=(), dtype=float32)
tf.Tensor(6.0, shape=(), dtype=float32)
GradientTape函数
GradientTape(persistent,watch_accessed_variables)
第一个参数默认为false,表示梯度带只使用一次,使用完就销毁了,若为true则表明梯度带可以多次使用,但在循环最后要记得把它销毁
第二个参数默认为true,表示自动添加监视
tape.watch()函数
用来添加监视非可训练变量
多元函数求一阶偏导数
x=tf.Variable(3.)
y=tf.Variable(4.)
with tf.GradientTape(persistent=True) as tape:f=tf.square(x)+2*tf.square(y)+1
df_dx,df_dy = tape.gradient(f,[x,y])
first_grade = tape.gradient(f,[x,y])
print(f)
print(df_dx)
print(df_dy)
print(first_grade)
del tape
tf.Tensor(42.0, shape=(), dtype=float32)
tf.Tensor(6.0, shape=(), dtype=float32)
tf.Tensor(16.0, shape=(), dtype=float32)
[<tf.Tensor: id=36, shape=(), dtype=float32, numpy=6.0>, <tf.Tensor: id=41, shape=(), dtype=float32, numpy=16.0>]
多元函数求二阶偏导数
x=tf.Variable(3.)
y=tf.Variable(4.)
with tf.GradientTape(persistent=True) as tape2:with tf.GradientTape(persistent=True) as tape1:f=tf.square(x)+2*tf.square(y)+1first_grade = tape1.gradient(f,[x,y])
second_grade = [tape2.gradient(first_grade,[x,y])]
print(f)
print(first_grade)
print(second_grade)
del tape1
del tape2
tf.Tensor(42.0, shape=(), dtype=float32)
[<tf.Tensor: id=27, shape=(), dtype=float32, numpy=6.0>, <tf.Tensor: id=32, shape=(), dtype=float32, numpy=16.0>]
[[<tf.Tensor: id=39, shape=(), dtype=float32, numpy=2.0>, <tf.Tensor: id=41, shape=(), dtype=float32, numpy=4.0>]]
TensorFlow实现一元线性回归
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
#设置字体
plt.rcParams['font.sans-serif'] =['SimHei']
#加载样本数据
x=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])
y=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])
#设置超参数,学习率
learn_rate=0.0001
#迭代次数
iter=100
#每10次迭代显示一下效果
display_step=10
#设置模型参数初值
np.random.seed(612)
w=tf.Variable(np.random.randn())
b=tf.Variable(np.random.randn())
#训练模型
#存放每次迭代的损失值
mse=[]
for i in range(0,iter+1):with tf.GradientTape() as tape:pred=w*x+bLoss=0.5*tf.reduce_mean(tf.square(y-pred))mse.append(Loss)#更新参数dL_dw,dL_db = tape.gradient(Loss,[w,b])w.assign_sub(learn_rate*dL_dw)b.assign_sub(learn_rate*dL_db)#plt.plot(x,pred)if i%display_step==0:print("i:%i,Loss:%f,w:%f,b:%f"%(i,mse[i],w.numpy(),b.numpy()))
TensorFlow实现多元线性回归
import numpy as np
import tensorflow as tf #=======================【1】加载样本数据===============================================
area=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])
room=np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2])
price=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])
num=len(area) #样本数量
#=======================【2】数据处理===============================================
x0=np.ones(num)
#归一化处理,这里使用线性归一化
x1=(area-area.min())/(area.max()-area.min())
x2=(room-room.min())/(room.max()-room.min())
#堆叠属性数组,构造属性矩阵
#从(16,)到(16,3),因为新出现的轴是第二个轴所以axis为1
X=np.stack((x0,x1,x2),axis=1)
print(X)
#得到形状为一列的数组
Y=price.reshape(-1,1)
print(Y)
#=======================【3】设置超参数===============================================
learn_rate=0.001
#迭代次数
iter=500
#每10次迭代显示一下效果
display_step=50
#=======================【4】设置模型参数初始值===============================================
np.random.seed(612)
W=tf.Variable(np.random.randn(3,1))
#=======================【4】训练模型=============================================
mse=[]
for i in range(0,iter+1):with tf.GradientTape() as tape:PRED=tf.matmul(X,W)Loss=0.5*tf.reduce_mean(tf.square(Y-PRED))mse.append(Loss)#更新参数dL_dw = tape.gradient(Loss,W)W.assign_sub(learn_rate*dL_dw)#plt.plot(x,pred)if i % display_step==0:print("i:%i,Loss:%f"%(i,mse[i]))
喜欢的话点个赞和关注呗!