之前用的是使用迭代進行直接的求解
但是深度學習最常用的方法是:根據樣本學習
之間的解法是求解arg
minf
(x)argminf(x)
argmin
f(x)
目前的解法是求解arg
minf
(x,p
)argminf(x,p)
argmin
f(x,
p)求的值是p,而不是x
p就是要優化的東西
通過樣本來查詢規律,然後**平方根
**實現如下
定義主方法類
if __name__ ==
"__main__":)
ys = np.array(
[e for e in
range(-
100,
100)])
/100
xs = np.square(ys)
) pl.plot(xs, ys)
xs = np.random.uniform(0,
2,[400])
pl.plot(xs, ys)
)
class
:def
__init__
(self)
:pass
deftrain
(self, xs, ys, lr =
0.01
, epoches =
2000):
pass
defsqrt
(self,n)
:pass
defclose
(self)
:pass
定義輸入和輸出的值
def
__init__
(self)
:# 樣本的數量不確定用-1來表示,長度為1個:[-1, 1]。但是在tensorflow中[-1]會有問題,一般使用none表示
x = tf.placeholder(tf.float32,
[none],
'x')
# x指求平方根的數,而不是需要放進去平方根的變數
self.x = x # 對x進行儲存
x = tf.reshape(x,[-
1,1]
)# 將輸入的一維轉換成向量
# 進行全連線操作(利用多項式來和矩陣進行相乘)多項式是乙個係數矩陣
w = tf.get_variable(
'w',[1
,200
], tf.float32)
# 定義乙個係數矩陣,矩陣的名字為w。用引數w來儲存平方根的規律,需要優化的也是w這個引數
b = tf.get_variable(
'b',
[200
], tf.float32)
x = tf.matmul(x,w)
+ b # 全連線的最終結果,其中b是乙個偏值(多項式變換的乙個常規的做法)
# x 得到的形狀是:[-1, 200], w 和 b是可以相乘的
# 最後使用啟用函式
x = tf.relu(x)
# relu(x) === maximum(x,0) 後面我會解釋為啥用啟用函式
# 再定義一對矩陣和偏值
w = tf.get_variable(
'w2',[
200,1]
, tf.float32)
# 因為獲得的x是[-1,200],所以w的維度應該是[200,1]
b = tf.get_variable(
'b2',[
200]
, tf.float32)
self.y_predict = tf.matmul(x, w)
+ b # [-1 , 1] # 為最終的結果進行儲存(我們所希望的平方根)
# 這個y是你的**值,而不是輸入的樣本x的值
self.y_predict = tf.reshape(self.y_predict,[-
1])# 將二維矩陣轉換成一維的向量
# 把輸入的標籤也傳入進來
self.y = tf.placeholder(tf.float32,
[none],
'y')
loss = tf.reduce_mean(tf.square(self.y - self.y_predict)
)# 求損失函式
self.lr = tf.placeholder(tf.float32,
[none],
'lr'
)# lr s
opt = tf.train.adanoptimizer(lr)
# 定義梯度下降優化器
self.train_op = opt.minmize(loss)
# 訓練操作(控制輸入輸出的優化操作)
self.session = tf.session(
) self.session.run(tf.global_variables_initalizer())
# 初始化方法中的所有變數
過程如下:
模型優化主要就是優化:w、b、w2、b2這四個引數
為了達到這目的,這個模型需要進行兩個階段使用
訓練多次,使用就一次,所以我們需要有乙個訓練操作
def
train
(self, xs, ys, lr =
0.01
, epoches =
2000):
for _ in
range
(epoches)
: self.session.run(self.train_op,
)# 對三個引數進行優化
正常來講,lr和epoches是放在sqrt方法中的,就是因為需要分開使用所以將引數放在train函式中了
張量全部可以通過self進行獲取
三個輸入張量:x、y、lr
乙個輸出張量:y_predict
乙個訓練張量:train_op
def
close
(self)
: self.session.close(
)
def
sqrt
(self,n)
: ys = self.session.run(self.y_predict,
)# 執行y_predict
return ys
執行的結果如下:
題外話:為什麼session在建構函式中定義,而不是在train中定義的?
如果定義在train中,如果train結束了,那麼session也就結束了,變數的載入也就結束了。
在乙個方法裡面,不管是成員方法還是全域性方法,原則上,**的數量應該少。所以我們可以定義乙個tensors類來包含建構函式中的方法。
使用TensorFlow低階別的API進行程式設計
tensorflow的低階api要使用張量 tensor 圖 graph 會話 session 等來進行程式設計。雖然從一定程度上來看使用低階的api非常的繁重,但是它能夠幫助我們更好的理解tensorflow的,更加靈活的控制訓練的過程。程式的構建分為兩個步驟,第乙個步驟是圖的構建,第二個步驟是會...
Tensorflow基本使用
使用 tensorflow,你必須明白 tensorflow tensorflow 是乙個程式設計系統,使用圖來表示計算任務.圖中的節點被稱之為 op operation 的縮寫 乙個 op 獲得 0 個或多個tensor,執行計算,產生 0 個或多個tensor.每個 tensor 是乙個型別化的...
WPF使用IDataErrorInfo進行資料校驗
原文 wpf使用idataerrorinfo進行資料校驗 這篇部落格將介紹如何使用idataerrorinfo進行資料校驗。下面直接看例子。乙個customer類,兩個屬性 firstname,age class customer public intage 將customer類繼承idataerr...