程式結構&&程式設計
mask
設定掩碼(0/1構成的陣列或者矩陣)的目的是為了實現對原始資料的遮蔽(0)與選擇(1)。
掩碼生成的方式之一可以是:使用二項分佈binomial distribution,
def get_corrupted_input(self, input, corruption_level):
mask = self.theano_rng.binomial(
n=1,
p=1-corruption_level,
size=input.shape,
dtype=theano.config.floatX
)
return mask*input
workhorse的執行時間
import timeit
start_time = timeit.default_timer()
for j in xrange(epochs):
for i in xrange(n_train_batches):
...
end_time = timeit.default_timer()
print('Elapsed time %.2fm'%(end_time-start_time)/60.)
封裝
if sys.platform == "win32":
# On Windows, the best timer is time.clock()
default_timer = time.clock
else:
# On most other platforms the best timer is time.time()
defalut_time = time.time
我們在更外層呼叫timeit.default_timer()
函式時,是不必關心具體的作業系統細節的。所以,封裝的目的是為了遮蔽更底層的細節。
找尋序列中的最值
一般流程為:
best_validation_loss = np.inf
for j in range(epochs):
this_validation_loss = calc()
if this_validation_loss < best_validation_loss:
best_validation_loss = this_validation_loss
# 以最小為最好
更為完整的程式碼如下:
best_validation_loss = np.inf
for j in range(epochs):
for i in range(n_train_batches):
iter = j*n_train_batches+i
if iter % validation_freq == 0:
validation_losses =
[valid_model(i) for i in range(n_valid_batches)]
this_validation_loss = np.mean(validation_losses)
if this_validation_loss < best_validation_loss:
best_validation_loss = this_validation_loss
我們對上述問題進一步細分,也即再多加一個判斷:
improvment_thresh = 0.95
if this_validation_loss < best_validation_loss:
if this_validation_loss < best_validation_loss*improvment_thresh:
# 也即當前迭代改進幅度足夠大,
patience 耐心值
也即是該值以下不予追究,姑妄聽之。該值以上,則要採取另外的動作,也即「我的忍耐是有限度的」。判斷是否到達耐心值,可以使用if判斷,也可採用取模運算。如下程式碼所示:
patience = 10000
validation_freq = min(n_train_batches, patience/2)
for j in range(epochs):
for minibatch_idx in n_train_batches:
iter = j*n_train_batches + minibatch_idx
if iter%100 == 0:
print 'training @ iter = ', iter
cost_ij = train_model(minibatch_idx)
if (iter+1)%validation_freq == 0:
...
以兩值中的較小值作為判斷的基準
validation_freq = min(n_train_batches, patience/2)
for j in range(epochs):
for i in n_train_batches:
iter = j*n_train_batches+i
if iter % validation_freq == 0:
...
迴圈
考慮如下的雙條件(and的關係)迴圈:
epoch = 0
done_looping = False
while epoch < epochs and (not done_looping):
epoch += 1
。。。
兩層迴圈
外層表示epoch,一次epoch,表示對全體樣本進行一次學習或者叫訓練。內層對全體樣本進行分塊mini_batch,內層迴圈表示的對樣本塊的遍歷。
for j in epochs:
for mini_batch_idx in n_train_index:
iter = j*n_train_index + mini_batch_idx
# iter 以mini_batch為單位
if iter%100 == 0:
print 'training @ iter = ', iter
在迭代的不同階段輸出不同的資訊
for j in xrange(epochs):
for i in xrange(n_train_batches):
iter = j*n_train_batches+i
if iter % 100 == 0:
print 'training @ iter = ', iter
if (iter+1) % validation_freq == 0:
print 'epoch {}, minibatch {}/{}'.format(j, i+1, n_train_batches)
python 中的for與while
當表達雙條件限制時,可能while會比for更方便點:
# 單條件限制
for j in range(epochs):
epoch = 0
while j < epochs:
j += 1
# 雙條件限制時
j = 0
done_looping = False
while j < epochs and not done_looping:
python程式的測試
def main():
pass
if __name__ == '__main__':
main()
epochs
在進行每次的epoch時,我們需要記錄執行完當前epoch時的一些中間結果(如使用list容器,training\_cost, training\_accuracy=[], []
),便於最後的過程視覺化,如全域性代價函式隨epoch次數的變化情況,以及分類精確率隨epochs次數的變化情況,順便地此時也需要定義相關的calc_cost
以及calc_accuracy
,在程式執行的過程中,我們也可以在控制檯列印相關的資訊,print('Epoch {}: cost: {}, accuracy: {}'.format(j, cost, accuracy))
。
training_cost, training_accuracy = [], []
for j in range(epochs):
cost = calc_cost()
accuracy = calc_accuracy()
training_cost.append(cost)
training_accuracy.append(accuracy)
print('Epoch {}: cost: {}, accuracy: {}'.format(j, cost, accuracy))
統計分類正確出現的次數
sum(int(y_pred == y_test) for y_pred, y_test in zip(predications, test_label))
實現資料集的分塊
n = X.shape[0]
batches = [X[k:k+batch_size, :] for k in range(0, n, batch_size)]
在SGD(stochastic gradient descent)的學習演算法中,常常在分塊之前需要將資料集shuffle的過程:
n = X.shape[0]
記錄某單詞,某元素出現的次數,天然的使用字典或者map作為容器
// C++, map
std::map<std::string, size_t> words;
std::ifstream ifs(filename);
std::string word;
while(ifs >> word)
{
++words[word];
}
# python, defaultdict
from collections import defaultdict
densities = defaultdict(float)
digit_counts = defaultdict(int)
for image, digit in zip(training_data[0], training_data[1]):
digit_counts[digit] += 1
densities[digit] = sum(image)
實現一種自更新
這裡
for w, b in zip(weights, biases):
a = sigma(np.dot(w, a)+b)
設計函式介面時,尤其注意引數是向量還是矩陣
這種對引數向量還是矩陣的考慮,在進行機器學習相關演算法的程式設計實踐中,是需要注意的一個問題。這本身又跟python(numpy)對陣列(一維還是二維)的處理方式不太一致有關。
相關文章
- 選擇結構程式設計程式設計
- 迴圈結構程式設計程式設計
- Java基本程式設計結構Java程式設計
- 1.3順序結構程式設計程式設計
- 3.迴圈結構程式設計程式設計
- JAVA的基本程式設計結構(下)Java程式設計
- 小程式的專案結構設計
- 選擇結構程式設計之習題程式設計
- 迴圈結構程式設計之習題程式設計
- Java 程式設計技巧之資料結構Java程式設計資料結構
- 結構化程式設計--學習筆記程式設計筆記
- 【程式設計素質】程式設計思想總結程式設計
- 好程式設計師雲端計算教程分享Shell程式設計之for迴圈結構程式設計師
- 迴圈結構程式設計 實驗題目程式設計
- 好程式設計師Web前端分享程式的三大結構(一)程式設計師Web前端
- 五分鐘自學程式設計:程式設計師到底怎麼學資料結構?!程式設計師資料結構
- 成為更好的程式設計師必須學習的 4 種程式設計結構程式設計師
- 程式設計體系結構(09):分散式系統架構程式設計分散式架構
- 面向架構程式設計架構程式設計
- Rust程式設計與專案實戰-結構體Rust程式設計結構體
- shell指令碼程式設計之選擇控制結構指令碼程式設計
- 程式設計體系結構(06):Java物件導向程式設計Java物件
- C語言程式設計讀書筆記:結構C語言程式設計筆記
- 理解結對程式設計程式設計
- Java核心技術總結一:Java的基本程式設計結構Java程式設計
- [AI開發]零程式碼分析影片結構化類應用結構設計AI
- 條件編譯、多檔案程式設計、結構體編譯程式設計結構體
- 程式模組化設計結構化開發優勢
- 程式設計師內功修煉之資料結構程式設計師資料結構
- 好程式設計師Java教程分享MySQL目錄結構程式設計師JavaMySql
- 程式設計體系結構(02):Java異常體系程式設計Java
- 程式設計體系結構(04):JavaIO流檔案管理程式設計JavaAI
- 程式設計體系結構(07):JavaEE之Web開發程式設計JavaWeb
- 程式設計體系結構(08):Spring.Mvc.Boot框架程式設計SpringMVCboot框架
- 好程式設計師Java教程分享Java 迴圈結構程式設計師Java
- .NET併發程式設計-資料結構不可變性程式設計資料結構
- 程式設計師必須掌握的資料結構 2程式設計師資料結構
- 程式設計師必須掌握的資料結構 1程式設計師資料結構
- 小程式渲染架構設計架構