摘要:最近也在學(xué)習(xí)這方面的知識(shí)給沐神瘋狂打,強(qiáng)烈推薦他的深度學(xué)習(xí)課程,鏈接大家自己去搜,就不做廣告了,雖然說自己連入門都算不上,但還是想實(shí)現(xiàn)一下自己版本的。同時(shí),計(jì)算方法改造成版本的。
起因
周六被小伙伴拖去游泳,美名其曰:鍛煉身體。其實(shí)某人就是去泡澡的,哈哈。說正題吧,游完泳在體育場(chǎng)里閑逛,里面很大,轉(zhuǎn)著轉(zhuǎn)著看到一個(gè)保齡球館,懷著對(duì)未知事物的好奇,決定和某人去嘗試一下。我和S同學(xué)一人買了一局,按照說明,每一局分為10次,每一次有兩次機(jī)會(huì)扔球。最后的比分就不說了,反正玩的很爽,最后也在邊上一個(gè)厲害的大叔指點(diǎn)下,學(xué)會(huì)了基本的扔球姿勢(shì)。
看到這你以為這是一篇敘事文?那就錯(cuò)了,起因是從這里開始的,我們的次數(shù)用完后,留在里面打臺(tái)球(這里也有臺(tái)球桌),看到不斷有穿著隊(duì)服一類東西的人進(jìn)來,應(yīng)該是來比賽的,同時(shí)又看到了賽道上面的牌子,有一個(gè)寫著:289分。那分?jǐn)?shù)是怎么計(jì)算的呢,懷著好奇心搜索起保齡球的積分規(guī)則來。在了解之后,我就在想一個(gè)問題:__如果是讓我開發(fā)一個(gè)保齡球的游戲,那么計(jì)分程序要怎么寫呢?__今天我們就從這里說起。。。
規(guī)則先簡(jiǎn)述一下保齡球的規(guī)則,這里引用百度知道的別人的回答,每一局比賽有10格,每格有兩次擊球機(jī)會(huì),我們這里關(guān)注它的得分情況,這里分為兩種情況:
1-9格擊球
每一格有3種可能:
第一次擊球全部擊倒:這種情況得分就是擊倒的瓶數(shù)(10)+后兩次擊球擊倒的總數(shù)
兩次擊球全部擊倒:這樣得分為擊倒的瓶數(shù)(10)+后一次擊球擊倒的總數(shù)
兩次擊球沒有全部擊倒:得分為兩次擊倒總瓶數(shù)
第10格擊球
這一格有兩種可能:
前兩次未能將瓶全部擊倒:得分為擊倒總瓶數(shù)+第9格的得分
前兩次將瓶全部擊倒,獲得一次追加機(jī)會(huì):得分為兩次擊倒總數(shù)(10)+追加時(shí)擊倒的總瓶數(shù)+第9格分?jǐn)?shù)
程序規(guī)則也了解了,下面就到了寫代碼的時(shí)候了,為了方便,這里選擇Python,版本為3.6
考慮到直觀性,這里沒有用交互式的程序,而是直接將擊中情況抽象成矩陣(數(shù)組),算出最后總分。
輸入的數(shù)據(jù)大概是這個(gè)樣子:
[[0, 3], [2, 6], [3, 6], [0, 3], [3, 0], [9, 1], [6, 3], [6, 2], [4, 6], [4, 2]]
10x2的數(shù)組,代表前10格每格的擊倒瓶數(shù),如果一格內(nèi)不需要第二次擊球,也算作0。這里先寫一個(gè)簡(jiǎn)單的數(shù)據(jù)生成函數(shù)。
import random def top_10(): for i in range(10): for j in range(2): if j == 0 : a[i][j] = random.randint(0,10) else : a[i][j] = random.randint(0,10-a[i][j-1]) return a
同時(shí),我們注意到了,這個(gè)生成函數(shù)還少了點(diǎn)什么,沒錯(cuò),就是第十格的追加擊球數(shù)。所以,這里再定義一個(gè)追加球生成函數(shù)
這里為了后面計(jì)算方便,也定義為[[x,y]]這種格式
def addto_num(a): return [[random.randint(0,10),0]] if sum(a[9]) == 10 else [[0,0]]
原始數(shù)據(jù)的生成我們完成了,接下來要定義計(jì)算函數(shù)了,計(jì)算總分?jǐn)?shù)
def calc_total(top): sums = 0 index = 0 for x in top: if x[0] == 10: sums += 10 if top[index+1][0] == 10: sums += 10 + top[index+2][0] else: sums += sum(top[index+1]) elif sum(x) == 10: sums += 10 + top[index+1][0] else: sums += sum(x) index+=1 if index == 9: break sums += sum(top[8]+top[9]+top[10]) return sums
代碼寫的不是很好看,大家請(qǐng)諒解啊,不過整個(gè)完整的功能是做完了,我們可以寫個(gè)方法測(cè)試下
tmp1 = top_10() add1 = addto_num(tmp1) c = calc_total(tmp1+add1) print(c)
78神經(jīng)網(wǎng)絡(luò)版
想必大家也了解,當(dāng)下最火的就是AI,而作為實(shí)現(xiàn)AI的其中一種手段,深度學(xué)習(xí)必不可少。最近也在學(xué)習(xí)這方面的知識(shí)(ps:給沐神瘋狂打call,強(qiáng)烈推薦他的深度學(xué)習(xí)課程,鏈接大家自己去搜,就不做廣告了),雖然說自己連入門都算不上,但還是想實(shí)現(xiàn)一下自己版本的。
于是就有了這個(gè):
深度學(xué)習(xí)版本的保齡球得分計(jì)算方法
這里我們用到了mxnet這個(gè)深度學(xué)習(xí)框架,最基礎(chǔ)的部分的兩個(gè)庫(kù)ndarray和autograd
首先,我們是基于線性回歸這個(gè)最簡(jiǎn)單也是最基礎(chǔ)的神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)的,模型看起來就像這樣
$$oldsymbol{hat{y}} = X oldsymbol{w} + b$$
同時(shí)定義它的損失函數(shù),也就是計(jì)算預(yù)測(cè)值和實(shí)際值的差距,這里用兩個(gè)的平方誤差來計(jì)算,模型是這樣
$$sum_{i=1}^n (hat{y}_i-y_i)^2.$$
首先,我們要__創(chuàng)建數(shù)據(jù)集__
因?yàn)槲覀冎岸x的是Python的list,所以在這里要轉(zhuǎn)換成mxnet的內(nèi)置數(shù)組ndarray
不過在此之前我們要先改進(jìn)下我們的生成函數(shù),之前是由兩個(gè)函數(shù)組成,現(xiàn)在為了方便,我們合成一個(gè)。同時(shí),計(jì)算方法改造成ndarray版本的。
from mxnet import ndarray as nd from mxnet import autograd def init_data(): for i in range(0,10): for j in range(0,2): if j == 0 : a[i][j] = random.randint(0, 10) else : a[i][j] = random.randint(0,10-a[i][j-1]) return a+[[random.randint(0,10),0]] if sum(a[9]) == 10 else a+[[0,0]] def calc_total_nd(top): sums = 0 index = 0 for x in top: if x[0].asscalar() == 10: sums += 10 if top[index+1][0].asscalar() == 10: sums += 10 + top[index+2][0].asscalar() else: sums += nd.sum(top[index+1]).asscalar() elif nd.sum(x).asscalar() == 10: sums += 10 + top[index+1][0].asscalar() else: sums += nd.sum(x).asscalar() index+=1 if index == 9: break sums += nd.sum(top[8]+top[9]+top[10]).asscalar() return sums num_inputs = 22 num_examples = 1000 X = nd.zeros(shape=(num_examples,11,2)) for i in X: i[:] = nd.array(init_data()) y = nd.array([calc_total_nd(i) for i in X])
然后是定義 數(shù)據(jù)讀取方法
目的是在后面訓(xùn)練時(shí)隨機(jī)遍歷我們的數(shù)據(jù)集,這里參考了沐神教程里的方法。
import random batch_size = 10 def data_iter(): # 產(chǎn)生一個(gè)隨機(jī)索引 idx = list(range(num_examples)) random.shuffle(idx) for i in range(0, num_examples, batch_size): j = nd.array(idx[i:min(i+batch_size,num_examples)]) yield nd.take(X, j), nd.take(y, j)
嘗試著讀取一個(gè)
for data, label in data_iter(): print(data, label) break
[[[ 2. 0.] [ 7. 0.] [ 1. 7.] [ 2. 2.] [ 6. 2.] [ 0. 5.] [ 0. 5.] [ 7. 1.] [ 6. 4.] [ 3. 0.] [ 0. 0.]] [[ 6. 3.] [ 4. 2.] [ 2. 4.] [ 8. 2.] [ 4. 6.] [ 6. 3.] [ 2. 6.] [ 6. 3.] [ 2. 3.] [ 8. 2.] [ 7. 0.]] [[ 10. 0.] [ 8. 0.] [ 2. 2.] [ 8. 2.] [ 0. 3.] [ 10. 0.] [ 10. 0.] [ 6. 3.] [ 10. 0.] [ 1. 7.] [ 0. 0.]] [[ 5. 1.] [ 6. 2.] [ 10. 0.] [ 3. 6.] [ 8. 2.] [ 10. 0.] [ 4. 4.] [ 2. 4.] [ 2. 0.] [ 7. 3.] [ 10. 0.]] [[ 6. 2.] [ 8. 0.] [ 0. 0.] [ 9. 0.] [ 6. 4.] [ 5. 3.] [ 5. 0.] [ 1. 6.] [ 0. 1.] [ 4. 4.] [ 0. 0.]] [[ 5. 5.] [ 6. 3.] [ 0. 7.] [ 2. 8.] [ 10. 0.] [ 4. 0.] [ 1. 5.] [ 1. 2.] [ 1. 2.] [ 0. 2.] [ 0. 0.]] [[ 10. 0.] [ 0. 3.] [ 3. 7.] [ 3. 1.] [ 8. 1.] [ 4. 2.] [ 8. 1.] [ 6. 4.] [ 10. 0.] [ 5. 0.] [ 0. 0.]] [[ 8. 2.] [ 10. 0.] [ 6. 0.] [ 10. 0.] [ 1. 4.] [ 2. 6.] [ 9. 0.] [ 5. 5.] [ 7. 1.] [ 5. 1.] [ 0. 0.]] [[ 9. 1.] [ 7. 1.] [ 6. 3.] [ 0. 5.] [ 7. 3.] [ 7. 1.] [ 6. 3.] [ 3. 1.] [ 3. 3.] [ 10. 0.] [ 6. 0.]] [[ 0. 10.] [ 4. 3.] [ 2. 6.] [ 2. 6.] [ 4. 1.] [ 8. 1.] [ 5. 4.] [ 3. 6.] [ 6. 4.] [ 4. 2.] [ 0. 0.]]][ 73. 104. 133. 118. 70. 87. 107. 118. 105. 99.]
數(shù)據(jù)準(zhǔn)備好了,現(xiàn)在要定義一個(gè)__初始化的模型參數(shù)__
這里隨機(jī)生成一個(gè)就好了,后面我們會(huì)通過訓(xùn)練,慢慢學(xué)習(xí)完善這個(gè)參數(shù),這也是深度學(xué)習(xí)的目的
w = nd.random_normal(shape=(num_inputs, )) b = nd.random_normal(shape=(1,)) params = [w, b] print(params)
[ [ 0.50869578 -0.16038011 0.91511744 0.84187603 -0.49177799 -1.00553632 -1.55609238 3.13221502 -0.15748753 -0.4358989 -0.52664566 -0.49295077 -0.17884982 1.43718672 0.43164727 -0.31814137 0.46760127 -0.16282491 0.17287086 0.6836102 0.76158988 1.61066961], [ 9.91063134e-05] ]
然后附上梯度,也就是讓后面autograde可以對(duì)這個(gè)函數(shù)求導(dǎo)
for param in params: param.attach_grad()
定義模型和損失函數(shù)
這里要注意的是:我們的維度不是1,所以要把數(shù)組的維度reshape一下變成一維數(shù)組
def net(X): return nd.dot(X.reshape((-1,num_inputs)), w) + b def square_loss(yhat, y): return (yhat - y.reshape(yhat.shape)) ** 2
然后是優(yōu)化方法,也就是學(xué)習(xí)方法,讓函數(shù)去學(xué)習(xí)參數(shù)
def SGD(params, lr): for param in params: param[:] = param - lr * param.grad
最后就是__訓(xùn)練__了
epochs = 5 learning_rate = .0001 for e in range(epochs): total_loss = 0 for data, label in data_iter(): with autograd.record(): output = net(data) loss = square_loss(output, label) loss.backward() SGD(params, learning_rate/batch_size) total_loss += nd.sum(loss).asscalar() print("Epoch %d, average loss: %f" % (e, total_loss/num_examples))
Epoch 0, average loss: 82.049488 Epoch 1, average loss: 82.009441 Epoch 2, average loss: 81.810044 Epoch 3, average loss: 82.243776 Epoch 4, average loss: 82.023799
最后來驗(yàn)證下我們的預(yù)測(cè)結(jié)果
for data, label in data_iter(): print("實(shí)際分?jǐn)?shù)") print(label) print("預(yù)測(cè)分?jǐn)?shù)") print(net(data)) break
實(shí)際分?jǐn)?shù) [ 108. 77. 102. 115. 85. 110. 76. 124. 78. 87.]預(yù)測(cè)分?jǐn)?shù) [ 107.43678284 86.52748871 101.92710114 116.50645447 90.5655899 115.31760406 80.10424805 118.94145203 84.49520111 95.17882538]
參考:
動(dòng)手學(xué)深度學(xué)習(xí)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40842.html
摘要:近幾年以卷積神經(jīng)網(wǎng)絡(luò)有什么問題為主題做了多場(chǎng)報(bào)道,提出了他的計(jì)劃。最初提出就成為了人工智能火熱的研究方向。展現(xiàn)了和玻爾茲曼分布間驚人的聯(lián)系其在論文中多次稱,其背后的內(nèi)涵引人遐想。 Hinton 以深度學(xué)習(xí)之父 和 神經(jīng)網(wǎng)絡(luò)先驅(qū) 聞名于世,其對(duì)深度學(xué)習(xí)及神經(jīng)網(wǎng)絡(luò)的諸多核心算法和結(jié)構(gòu)(包括深度學(xué)習(xí)這個(gè)名稱本身,反向傳播算法,受限玻爾茲曼機(jī),深度置信網(wǎng)絡(luò),對(duì)比散度算法,ReLU激活單元,Dropo...
摘要:卷積神經(jīng)網(wǎng)絡(luò)原理淺析卷積神經(jīng)網(wǎng)絡(luò),最初是為解決圖像識(shí)別等問題設(shè)計(jì)的,當(dāng)然其現(xiàn)在的應(yīng)用不僅限于圖像和視頻,也可用于時(shí)間序列信號(hào),比如音頻信號(hào)文本數(shù)據(jù)等。卷積神經(jīng)網(wǎng)絡(luò)的概念最早出自世紀(jì)年代科學(xué)家提出的感受野。 卷積神經(jīng)網(wǎng)絡(luò)原理淺析 ?卷積神經(jīng)網(wǎng)絡(luò)(Convolutional?Neural?Network,CNN)最初是為解決圖像識(shí)別等問題設(shè)計(jì)的,當(dāng)然其現(xiàn)在的應(yīng)用不僅限于圖像和視頻,也可用于時(shí)間序...
摘要:然而,可用數(shù)據(jù)集的規(guī)模卻沒有成比例地?cái)U(kuò)大。這還說明無監(jiān)督表征學(xué)習(xí),以及半監(jiān)督表征學(xué)習(xí)方法有良好的前景。例如,對(duì)于對(duì)象探測(cè)得分,單個(gè)模型目前可以實(shí)現(xiàn),高于此前的。此外,構(gòu)建包含圖片的數(shù)據(jù)集并不是最終目標(biāo)。 都說深度學(xué)習(xí)的興起和大數(shù)據(jù)息息相關(guān),那么是不是數(shù)據(jù)集越大,訓(xùn)練出的圖像識(shí)別算法準(zhǔn)確率就越高呢?Google的研究人員用3億張圖的內(nèi)部數(shù)據(jù)集做了實(shí)驗(yàn),然后寫了篇論文。他們指出,在深度模型中,視...
摘要:一時(shí)之間,深度學(xué)習(xí)備受追捧。百度等等公司紛紛開始大量的投入深度學(xué)習(xí)的應(yīng)用研究。極驗(yàn)驗(yàn)證就是將深度學(xué)習(xí)應(yīng)用于網(wǎng)絡(luò)安全防御,通過深度學(xué)習(xí)建模學(xué)習(xí)人類與機(jī)器的行為特征,來區(qū)別人與機(jī)器,防止惡意程序?qū)W(wǎng)站進(jìn)行垃圾注冊(cè),撞庫(kù)登錄等。 2006年Geoffery ?Hinton提出了深度學(xué)習(xí)(多層神經(jīng)網(wǎng)絡(luò)),并在2012年的ImageNet競(jìng)賽中有非凡的表現(xiàn),以15.3%的Top-5錯(cuò)誤率奪魁,比利用傳...
摘要:與已運(yùn)行相關(guān)的過濾規(guī)則負(fù)責(zé)檢查待調(diào)度與上已有之間的親和性關(guān)系。并且每個(gè)打分函數(shù)都可以配置對(duì)應(yīng)的權(quán)重值,下面介紹調(diào)度器策略配置時(shí),也會(huì)涉及權(quán)重值的配置。默認(rèn)權(quán)重值是,如果覺得某個(gè)打分函數(shù)特別重要,便可以加大該權(quán)重值。 一、概述 Kubernetes 是 Google 開源的容器集群管理系統(tǒng)(谷歌內(nèi)部:Borg),而今天要介紹的 kube-scheduler 是 k8s 系統(tǒng)的核心組件之一...
閱讀 1408·2023-04-26 03:04
閱讀 2356·2019-08-30 15:44
閱讀 3733·2019-08-30 14:15
閱讀 3532·2019-08-27 10:56
閱讀 2752·2019-08-26 13:53
閱讀 2621·2019-08-26 13:26
閱讀 3086·2019-08-26 12:11
閱讀 3615·2019-08-23 18:21