亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

從 保齡球得分計算方法 淺析 深度學習

wangxinarhat / 3390人閱讀

摘要:最近也在學習這方面的知識給沐神瘋狂打,強烈推薦他的深度學習課程,鏈接大家自己去搜,就不做廣告了,雖然說自己連入門都算不上,但還是想實現(xiàn)一下自己版本的。同時,計算方法改造成版本的。

起因

周六被小伙伴拖去游泳,美名其曰:鍛煉身體。其實某人就是去泡澡的,哈哈。說正題吧,游完泳在體育場里閑逛,里面很大,轉(zhuǎn)著轉(zhuǎn)著看到一個保齡球館,懷著對未知事物的好奇,決定和某人去嘗試一下。我和S同學一人買了一局,按照說明,每一局分為10次,每一次有兩次機會扔球。最后的比分就不說了,反正玩的很爽,最后也在邊上一個厲害的大叔指點下,學會了基本的扔球姿勢。

看到這你以為這是一篇敘事文?那就錯了,起因是從這里開始的,我們的次數(shù)用完后,留在里面打臺球(這里也有臺球桌),看到不斷有穿著隊服一類東西的人進來,應該是來比賽的,同時又看到了賽道上面的牌子,有一個寫著:289分。那分數(shù)是怎么計算的呢,懷著好奇心搜索起保齡球的積分規(guī)則來。在了解之后,我就在想一個問題:__如果是讓我開發(fā)一個保齡球的游戲,那么計分程序要怎么寫呢?__今天我們就從這里說起。。。

規(guī)則

先簡述一下保齡球的規(guī)則,這里引用百度知道的別人的回答,每一局比賽有10格,每格有兩次擊球機會,我們這里關(guān)注它的得分情況,這里分為兩種情況:

1-9格擊球
每一格有3種可能:

第一次擊球全部擊倒:這種情況得分就是擊倒的瓶數(shù)(10)+后兩次擊球擊倒的總數(shù)

兩次擊球全部擊倒:這樣得分為擊倒的瓶數(shù)(10)+后一次擊球擊倒的總數(shù)

兩次擊球沒有全部擊倒:得分為兩次擊倒總瓶數(shù)

第10格擊球
這一格有兩種可能:

前兩次未能將瓶全部擊倒:得分為擊倒總瓶數(shù)+第9格的得分

前兩次將瓶全部擊倒,獲得一次追加機會:得分為兩次擊倒總數(shù)(10)+追加時擊倒的總瓶數(shù)+第9格分數(shù)

程序

規(guī)則也了解了,下面就到了寫代碼的時候了,為了方便,這里選擇Python,版本為3.6
考慮到直觀性,這里沒有用交互式的程序,而是直接將擊中情況抽象成矩陣(數(shù)組),算出最后總分。
輸入的數(shù)據(jù)大概是這個樣子:

[[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。這里先寫一個簡單的數(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ù)還少了點什么,沒錯,就是第十格的追加擊球數(shù)。所以,這里再定義一個追加球生成函數(shù)
這里為了后面計算方便,也定義為[[x,y]]這種格式

def addto_num(a):
    return [[random.randint(0,10),0]] if sum(a[9]) == 10 else [[0,0]]

原始數(shù)據(jù)的生成我們完成了,接下來要定義計算函數(shù)了,計算總分數(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   

代碼寫的不是很好看,大家請諒解啊,不過整個完整的功能是做完了,我們可以寫個方法測試下

tmp1 = top_10()
add1 = addto_num(tmp1)
c = calc_total(tmp1+add1)
print(c)
78
神經(jīng)網(wǎng)絡(luò)版

想必大家也了解,當下最火的就是AI,而作為實現(xiàn)AI的其中一種手段,深度學習必不可少。最近也在學習這方面的知識(ps:給沐神瘋狂打call,強烈推薦他的深度學習課程,鏈接大家自己去搜,就不做廣告了),雖然說自己連入門都算不上,但還是想實現(xiàn)一下自己版本的。

于是就有了這個:

深度學習版本的保齡球得分計算方法

這里我們用到了mxnet這個深度學習框架,最基礎(chǔ)的部分的兩個庫ndarray和autograd

首先,我們是基于線性回歸這個最簡單也是最基礎(chǔ)的神經(jīng)網(wǎng)絡(luò)實現(xiàn)的,模型看起來就像這樣
$$oldsymbol{hat{y}} = X oldsymbol{w} + b$$
同時定義它的損失函數(shù),也就是計算預測值和實際值的差距,這里用兩個的平方誤差來計算,模型是這樣
$$sum_{i=1}^n (hat{y}_i-y_i)^2.$$

首先,我們要__創(chuàng)建數(shù)據(jù)集__
因為我們之前定義的是Python的list,所以在這里要轉(zhuǎn)換成mxnet的內(nèi)置數(shù)組ndarray

不過在此之前我們要先改進下我們的生成函數(shù),之前是由兩個函數(shù)組成,現(xiàn)在為了方便,我們合成一個。同時,計算方法改造成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ù)讀取方法
目的是在后面訓練時隨機遍歷我們的數(shù)據(jù)集,這里參考了沐神教程里的方法。

import random
batch_size = 10
def data_iter():
    # 產(chǎn)生一個隨機索引
    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)

嘗試著讀取一個

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ù)準備好了,現(xiàn)在要定義一個__初始化的模型參數(shù)__
這里隨機生成一個就好了,后面我們會通過訓練,慢慢學習完善這個參數(shù),這也是深度學習的目的

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可以對這個函數(shù)求導

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)化方法,也就是學習方法,讓函數(shù)去學習參數(shù)

def SGD(params, lr):
    for param in params:
        param[:] = param - lr * param.grad

最后就是__訓練__了

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

最后來驗證下我們的預測結(jié)果

for data, label in data_iter():
        print("實際分數(shù)")
        print(label)
        print("預測分數(shù)")
        print(net(data))
        break
實際分數(shù)

[ 108.   77.  102.  115.   85.  110.   76.  124.   78.   87.]

預測分數(shù)

[ 107.43678284   86.52748871  101.92710114  116.50645447   90.5655899
  115.31760406   80.10424805  118.94145203   84.49520111   95.17882538]

參考:
動手學深度學習

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/40842.html

相關(guān)文章

  • 淺析 Hinton 最近提出的 Capsule 計劃

    摘要:近幾年以卷積神經(jīng)網(wǎng)絡(luò)有什么問題為主題做了多場報道,提出了他的計劃。最初提出就成為了人工智能火熱的研究方向。展現(xiàn)了和玻爾茲曼分布間驚人的聯(lián)系其在論文中多次稱,其背后的內(nèi)涵引人遐想。 Hinton 以深度學習之父 和 神經(jīng)網(wǎng)絡(luò)先驅(qū) 聞名于世,其對深度學習及神經(jīng)網(wǎng)絡(luò)的諸多核心算法和結(jié)構(gòu)(包括深度學習這個名稱本身,反向傳播算法,受限玻爾茲曼機,深度置信網(wǎng)絡(luò),對比散度算法,ReLU激活單元,Dropo...

    Donald 評論0 收藏0
  • CNN淺析和歷年ImageNet冠軍模型解析

    摘要:卷積神經(jīng)網(wǎng)絡(luò)原理淺析卷積神經(jīng)網(wǎng)絡(luò),最初是為解決圖像識別等問題設(shè)計的,當然其現(xiàn)在的應用不僅限于圖像和視頻,也可用于時間序列信號,比如音頻信號文本數(shù)據(jù)等。卷積神經(jīng)網(wǎng)絡(luò)的概念最早出自世紀年代科學家提出的感受野。 卷積神經(jīng)網(wǎng)絡(luò)原理淺析 ?卷積神經(jīng)網(wǎng)絡(luò)(Convolutional?Neural?Network,CNN)最初是為解決圖像識別等問題設(shè)計的,當然其現(xiàn)在的應用不僅限于圖像和視頻,也可用于時間序...

    edagarli 評論0 收藏0
  • 谷歌用3億張圖做了個深度學習實驗,結(jié)論:數(shù)據(jù)還是越大越好

    摘要:然而,可用數(shù)據(jù)集的規(guī)模卻沒有成比例地擴大。這還說明無監(jiān)督表征學習,以及半監(jiān)督表征學習方法有良好的前景。例如,對于對象探測得分,單個模型目前可以實現(xiàn),高于此前的。此外,構(gòu)建包含圖片的數(shù)據(jù)集并不是最終目標。 都說深度學習的興起和大數(shù)據(jù)息息相關(guān),那么是不是數(shù)據(jù)集越大,訓練出的圖像識別算法準確率就越高呢?Google的研究人員用3億張圖的內(nèi)部數(shù)據(jù)集做了實驗,然后寫了篇論文。他們指出,在深度模型中,視...

    twohappy 評論0 收藏0
  • 極驗驗證:淺析深度學習模型與應用

    摘要:一時之間,深度學習備受追捧。百度等等公司紛紛開始大量的投入深度學習的應用研究。極驗驗證就是將深度學習應用于網(wǎng)絡(luò)安全防御,通過深度學習建模學習人類與機器的行為特征,來區(qū)別人與機器,防止惡意程序?qū)W(wǎng)站進行垃圾注冊,撞庫登錄等。 2006年Geoffery ?Hinton提出了深度學習(多層神經(jīng)網(wǎng)絡(luò)),并在2012年的ImageNet競賽中有非凡的表現(xiàn),以15.3%的Top-5錯誤率奪魁,比利用傳...

    王巖威 評論0 收藏0
  • Kubernetes 調(diào)度器淺析

    摘要:與已運行相關(guān)的過濾規(guī)則負責檢查待調(diào)度與上已有之間的親和性關(guān)系。并且每個打分函數(shù)都可以配置對應的權(quán)重值,下面介紹調(diào)度器策略配置時,也會涉及權(quán)重值的配置。默認權(quán)重值是,如果覺得某個打分函數(shù)特別重要,便可以加大該權(quán)重值。 一、概述 Kubernetes 是 Google 開源的容器集群管理系統(tǒng)(谷歌內(nèi)部:Borg),而今天要介紹的 kube-scheduler 是 k8s 系統(tǒng)的核心組件之一...

    ranwu 評論0 收藏0

發(fā)表評論

0條評論

wangxinarhat

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<