简介
代码是通过我最近在开课吧跟高老师学习深度学习进行简单的总结得出的。目的是对波士顿房价进行非线性拟合。由于代码很多都是参考高老师的代码得出,因此存在很多雷同,希望大家谅解。我主要的工作是对每个代码按照我的理解进行解释说明,无意冒犯,希望对大家学习可以有所帮助。
工具
系统:window 10
应用:anaconda3 里的 spyder
解释
1)求损失值(越小说明拟合越好)
我们第一步来理解是怎么通过两个线性函数来求出非线性拟合的。首先是用原始数据的X和W1,b1来求出一个待定的线性函数。通过激活函数后,增加函数的非线性。把激活函数的数值当做X,利用另一个W2,b2通过线性函数,求出Y的预估值。再利用Y的预估值和Y的原值来求出损失函数LOSS值。
2)优化
利用梯度下降的方法慢慢对w1,b1,w2,b2进行逼近,梯度下降法常常用来求损失函数的最小值。用数学公式表示如下:
其中的偏导求法为
由上图我们知道,我们只需要求出各个过程的偏导,就可以依次求出我们需要的偏导数。然后利用梯度下降的方法,就可以优化出我们需要的w和b的值。
python代码
1)加载数据
from sklearn.datasets import load_boston
data = load_boston()#波士顿房价数据
X_, y_ = data['data'], data['target']
X_rm = X_[:,5]#选择数据里的第五列,是对价格影响因子最大的选项,平均房间数RM
导入boston房价的相关数据到data里面,对X_和y_分别赋值data[‘data’]和data[‘target’]。其中data[‘data’]是指那些对房价有影响的数据,data[‘target’]是指房价。X_[:, 5],是指把对波士顿房价影响最大的平均房价数那一列的数据保存进X_rm中。如何求出影响因子最大的数,后续会更新。
2)随机取w和b
import random
w1_, b1_ = np.random.normal(), np.random.normal()#正态分布
w2_, b2_ = np.random.normal(), np.random.normal()
利用正态分布的方法对w和b取两组随机数,我觉得他的作用是为接下来的线性拟合提供一个随机的w和b,其中的思想是利用梯度下降的方法来求得近似的w和b,后续会更新关于梯度下降的文章。而之所以要用到两个,我觉得是利用两个线性函数来求得一个非线性函数,增加w和b的个数可以提高其中的非线性。同样的所需要的样本也会增大,因此实际应用的时候要选择合适的个数。
3) 占位符
X, y = Placeholder(name='X', is_trainable=False), Placeholder(name='y', is_trainable=False)
w1, b1 = Placeholder(name='w1'), Placeholder(name='b1')
w2, b2 = Placeholder(name='w2'), Placeholder(name='b2')
占位符是指可以由人输入数据的量。我们的目的是通过对x,y的已经样本进行训练,因此x,y是属于占位符。而w,b是我们前面随机出来的值,理论上也是人为输入,因此也是属于占位符。占位符会由一个class类来表示,后续会更新如何用python写占位符函数。
4)建立模型
#建立模型
output1 = Linear(X, w1, b1, name='linear-01')
output2 = Sigmoid(output1, name='activation')
y_hat = Linear(output2, w2,b2, name='y_hat')
cost = L2_LOSS(y, y_hat, name='cost')
5)输入数据
feed_dict = {
X: X_rm, #给X连接平均房间数
y: y_, #给y连接价格
w1: w1_, #给w1连接w1_的值,下同
w2: w2_,
b1: b1_,
b2: b2_,
}
6)拓扑排序
graph_sort = topological_sort_feed_dict(feed_dict)#平面
7)运行
from tqdm import tqdm
epoch = 1000#步数
batch_num = len(X_rm)
learning_rate = 1e-3#步长
losses = []#损失
for e in tqdm(range(epoch)):
loss = 0
for b in range(batch_num):
index = np.random.choice(range(len(X_rm)))
X.value = X_rm[index]
y.value = y_[index]
run_one_epoch(graph_sort, monitor=False)#前进一步
optimize(graph_sort, learning_rate)#更新优化
loss += cost.value#损失值
losses.append(loss / batch_num)
8)画图
import matplotlib.pyplot as plt
plt.plot(losses)
plt.figure(2)
predicate(7, graph_sort)
plt.scatter(X_rm, y_)
plt.scatter(X_rm, [predicate(x, graph_sort) for x in X_rm])
plt.show()
9)结果
10)完整代码
https://download.csdn.net/download/weixin_44728779/15045840
11)小结
以上是对本次课程学习的大概框架的小结,难点应该是在与拓扑排序。后续会继续更新我对这个框架的理解说明。谢谢OVO。