日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全连接层 时间复杂度_神经网络全连接层(3)

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全连接层 时间复杂度_神经网络全连接层(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CNN網絡基礎結構

神經網絡-全連接層(3)

上一回我們聊完了算法,這回我們正式開始寫代碼。上回在做公式推導的時候,我們實際上只是針對一個數據樣本進行推導,而實際中,計算和訓練都是一批一批完成的。大多數機器學習訓練都有batch的概念,而訓練中batch的計算不是一個一個地算,而是一批數據集中算,那么就需要用上矩陣了。

首先給出Loss的代碼,這里y和t都是按列存儲的,每一列都是一個樣本:

class SquareLoss:
? ?def forward(self, y, t):
? ? ? ?self.loss = y - t
? ? ? ?return np.sum(self.loss * self.loss) / ?self.loss.shape[1] / 2
? ?def backward(self):
? ? ? ?return self.loss

為了代碼的簡潔,我們在前向運算的時候就把一些后向計算的信息都保存起來,這樣在后向計算的時候就能簡單點。這樣這個類就不能具備多線程的特性了,不過想支持多線程的功能還有別的辦法。后面的全連接層也會采用同樣的思路——前向為后向準備運算數據。

上一節我們講了1個例子,輸入有2個元素,第一層有4個輸出,第2層有1個輸出。我們假設訓練數據有N個,我們對所有相關的訓練數據和參數做以下的約定:

  • 所有的訓練數據按列存儲,也就是說如果把N個數據組成一個矩陣,那個矩陣的行等于數據特征的數目,矩陣的列等于N

  • 線性部分的權值w由一個矩陣構成,它的行數為該層的輸入個數,列數為該層的輸出個數。如果該層的輸入為2,輸出為4,那么這個權值w的矩陣就是一個2*4的矩陣。

  • 線性部分的權值b是一個行數等于輸出個數,列數為1的矩陣。

基于上面的規則,我們把上一節的例子以批量數據的形式畫成了下面一張圖:

這張圖從左往右有三個部分:

  • 最左邊是神經網絡的結構圖,可以看出里面的數據x,z和參數w,b都符合我們剛才對數據組織的定義。

  • 中間是神經網絡前向的過程。一共分為5步,其中最后一步用來計算Loss。

  • 最右邊是神經網絡反向的過程。這里需要仔細看一下。為了表達上的簡潔,我們用殘差符號表達Loss對指定變量的偏導數。同時為了更加簡潔地表達梯度計算的過程,在這個過程中我們對其中一個矩陣做了矩陣轉置,這樣可以確保最終輸出維度的正確。

  • 對于上圖右邊的部分,需要認真地看幾遍,最好能仔細地推導一遍,才能更好地掌握這個推導的過程,尤其是為了維度對矩陣做轉置這部分。

    看懂了上面的圖,接下來要做的就是對上面的內容進行總結,寫出最終的矩陣版后向傳播算法:

    class FC:
    ? ?def __init__(self, in_num, out_num, lr = 0.1):
    ? ? ? ?self._in_num = in_num
    ? ? ? ?self._out_num = out_num
    ? ? ? ?self.w = np.random.randn(in_num, out_num)
    ? ? ? ?self.b = np.zeros((out_num, 1))
    ? ? ? ?self.lr = lr
    ? ?def _sigmoid(self, in_data):
    ? ? ? ?return 1 / (1 + np.exp(-in_data))
    ? ?def forward(self, in_data):
    ? ? ? ?self.topVal = self._sigmoid(np.dot(self.w.T, in_data) + self.b)
    ? ? ? ?self.bottomVal = in_data
    ? ? ? ?return self.topVal
    ? ?def backward(self, loss):
    ? ? ? ?residual_z = loss * self.topVal * (1 - self.topVal)
    ? ? ? ?grad_w = np.dot(self.bottomVal, residual_z.T)
    ? ? ? ?grad_b = np.sum(residual_z)
    ? ? ? ?self.w -= self.lr * grad_w
    ? ? ? ?self.b -= self.lr * grad_b
    ? ? ? ?residual_x = np.dot(self.w, residual_z)
    ? ? ? ?return residual_x

    好了,現在我們有了Loss類和全連接類,我們還需要一個類把上面兩個類串聯起來,這里為了后面的內容我們定義了許多默認變量:

    class Net:
    ? ?def __init__(self, input_num=2, hidden_num=4, out_num=1, lr=0.1):
    ? ? ? ?self.fc1 = FC(input_num, hidden_num, lr)
    ? ? ? ?self.fc2 = FC(hidden_num, out_num, lr)
    ? ? ? ?self.loss = SquareLoss()
    ? ?def train(self, X, y): # X are arranged by col
    ? ? ? ?for i in range(10000):
    ? ? ? ? ? ?# forward step
    ? ? ? ? ? ?layer1out = self.fc1.forward(X)
    ? ? ? ? ? ?layer2out = self.fc2.forward(layer1out)
    ? ? ? ? ? ?loss = self.loss.forward(layer2out, y)
    ? ? ? ? ? ?# backward step
    ? ? ? ? ? ?layer2loss = self.loss.backward()
    ? ? ? ? ? ?layer1loss = self.fc2.backward(layer2loss)
    ? ? ? ? ? ?saliency = self.fc1.backward(layer1loss)
    ? ? ? ?layer1out = self.fc1.forward(X)
    ? ? ? ?layer2out = self.fc2.forward(layer1out)
    ? ? ? ?print 'X={0}'.format(X)
    ? ? ? ?print 't={0}'.format(y)
    ? ? ? ?print 'y={0}'.format(layer2out)

    代碼是寫完了,可是我們還需要驗證一下自己的代碼是不是正確的。一般來說我們會采用一些近似方法計算驗證梯度是否正確,而現在,有一個博客為我們做了這件事情:

    A Step by Step Backpropagation Example

    http://link.zhihu.com/?target=https%3A//mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

    把我們的代碼用博客上數據和結果做一下驗證,就可以幫助我們修正代碼做好debug。其實上面的代碼本來也不多,可能犯錯的地方也不多。

    一些具體的例子

    一個經典的例子就是用神經網絡做邏輯運算。我們可以用一個兩層神經網絡來模擬模擬與運算。下面就是具體的代碼:

    # and operation

    X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T

    y = np.array([[0],[0],[0],[1]]).T

    net = Net(2,4,1,0.1)

    net.train(X,y)

    以下是調用代碼給出的結果,可以看出最終的結果效果還不錯,經過10000輪的迭代,最終模型給出的結果和我們的期望結果十分相近,實際上如果我們繼續進行迭代,這個算法的精度還可以進一步地提高,Loss可以進一步地減少:

    iter = 0, loss =0.105256639066

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.40930536 ?0.4617139 ? 0.36923076 ?0.4299025 ]]

    iter = 1000, loss =0.0229368486589

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.04445123 ?0.22684496 ?0.17747671 ?0.68605373]]

    iter = 2000, loss =0.00657594469044

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.01057127 ?0.11332809 ?0.11016211 ?0.83411794]]

    iter = 3000, loss =0.00322081318498

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.00517544 ?0.07831654 ?0.07871461 ?0.88419737]]

    iter = 4000, loss =0.00201059297485

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.00336374 ?0.06171018 ?0.0624756 ? 0.90855558]]

    iter = 5000, loss =0.00142205310651

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.00249895 ?0.05189239 ?0.05257126 ?0.92309992]]

    iter = 6000, loss =0.00108341055769

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.00200067 ?0.04532728 ?0.04585262 ?0.93287134]]

    iter = 7000, loss =0.000866734887908

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.00167856 ?0.04058314 ?0.04096262 ?0.9399489 ]]

    iter = 8000, loss =0.000717647908313

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.00145369 ?0.03696819 ?0.0372232 ? 0.94534786]]

    iter = 9000, loss =0.000609513241467

    === Label vs Prediction ===

    t=[[0 0 0 1]]

    y=[[ 0.00128784 ?0.03410575 ?0.03425751 ?0.94962473]]

    === Final ===

    X=[[0 0 1 1]

    [0 1 0 1]]

    t=[[0 0 0 1]]

    y=[[ 0.00116042 ?0.03177232 ?0.03183889 ?0.95311123]]

    記得初始化

    初始化是神經網絡一個十分重要的事情,我就不說三遍了,來個實驗,如果我們把所有的參數初始化成0,會發生一個可怕的事情:

    X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T

    y = np.array([[0],[0],[0],[1]]).T

    net = Net(2,4,1,0.1)

    net.fc1.w.fill(0)

    net.fc2.w.fill(0)

    net.train(X,y)

    print "=== w1 ==="

    print net.fc1.w

    print "=== w2 ==="

    print net.fc2.w

    直接看結果:

    === Final ===X=[[0 0 1 1][0 1 0 1]]t=[[0 0 0 1]]y=[[ 3.22480024e-04 2.22335711e-02 2.22335711e-02 9.57711099e-01]]=== w1 ===[[-2.49072772 -2.49072772 -2.49072772 -2.49072772][-2.49072772 -2.49072772 -2.49072772 -2.49072772]]=== w2 ===[[-3.373125][-3.373125][-3.373125][-3.373125]]

    不但沒有訓練出合理的結果,而且每一層的參數還都是一樣的。

    但是如果把每層參數設為不同的固定值呢?

    X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T

    y = np.array([[0],[0],[0],[1]]).T

    net = Net(2,4,1,0.1)

    net.fc1.w.fill(1)

    net.fc2.w.fill(0)

    net.train(X,y)

    print "=== w1 ==="

    print net.fc1.w

    print "=== w2 ==="

    print net.fc2.w

    結果竟然也不錯:

    === Final ===

    X=[[0 0 1 1]

    [0 1 0 1]]

    t=[[0 0 0 1]]

    y=[[ 0.00399349 ?0.02830098 ?0.02830098 ?0.96924181]]

    === w1 ===

    [[ 2.48265841 ?2.48265841 ?2.48265841 ?2.48265841]

    [ 2.48265841 ?2.48265841 ?2.48265841 ?2.48265841]]

    === w2 ===

    [[ 3.231811]

    [ 3.231811]

    [ 3.231811]

    [ 3.231811]]

    雖然每層的參數依然相同,但是訓練得到了收斂。這又說明了什么呢?關于這個問題有機會再說。

    全連接層就這樣聊了三期,下回可以換個口味了。

    雷課:

    ? ? ? ?讓教育更有質量,

    ? ? ? ?讓教育更有想象!

    總結

    以上是生活随笔為你收集整理的全连接层 时间复杂度_神经网络全连接层(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日本男男激情gay办公室 | 免费看黄禁片 | 日本在线视频www色 国产在线视频网址 | 久久精品免费一区二区 | 人妻丰满熟妇av无码区hd | av动漫天堂 | 草碰在线视频 | 四虎少妇做爰免费视频网站四 | 午夜精品久久99蜜桃的功能介绍 | 毛片网站有哪些 | 乱色欧美 | xvideos成人免费视频 | www成人| 欧美性猛交xxxx免费看久久久 | 嫩草影院懂你的影院 | 亚洲色图在线观看视频 | 一起操17c| 国产区二区| 奇米影视四色7777 | 婷婷九月 | 色综合日韩 | 处破痛哭a√18成年片免费 | 国产精品成人一区二区网站软件 | 国产婷婷精品 | 亚洲一区影院 | 国产高清第一页 | 欧美午夜精品理论片 | 久久国内精品视频 | 日本成人片在线 | 天天射网 | 亚洲第9页| 麻豆中文字幕 | 小明天天看 | 误杀1电影免费观看高清完整版 | 免费看黄色一级片 | 春草| 99自拍视频 | 欧美久久综合网 | 国产欧美一区二区在线观看 | 免费成人黄色片 | 中文字幕人妻伦伦 | 国产又粗又猛又爽免费视频 | 亚州中文 | 福利一区二区视频 | 少妇一级淫免费放 | 欧美黄片一区 | 久久久久久久久久久久久女过产乱 | 狼性av| 午夜精品免费观看 | 西西久久| 中文在线观看免费视频 | 日韩有码一区二区三区 | 激烈的性高湖波多野结衣 | 亚洲欧美色图在线 | 天天操妹子 | 久久久嫩草 | 台湾佬中文在线 | 超碰97在线资源站 | 小罗莉极品一线天在线 | 99精品免费在线观看 | 欧美人喂奶吃大乳 | 国产调教在线观看 | 国产在线观看免费播放 | 午夜在线精品偷拍 | 亚洲免费视频播放 | 美人被强行糟蹋np各种play | 操比网站 | 欧美成人午夜视频 | 日韩高清中文字幕 | 亚洲人毛茸茸 | 嫩草免费视频 | 日日操夜夜摸 | 久久国产主播 | 欧美va在线观看 | 精品一二区 | 国产婷婷色综合av蜜臀av | 青青草精品视频 | 色婷婷一区二区三区 | 欧美三级韩国三级日本三斤 | 日本成人动漫在线观看 | 成年人网站免费在线观看 | 久久视频中文字幕 | 欧美日韩久久婷婷 | 毛片毛片毛片毛片毛片 | 姝姝窝人体www聚色窝 | eeuss一区二区 | 欧美xx在线| 国产呦系列 | 26uuu精品一区二区在线观看 | 亚洲视频免费观看 | 在线观看亚洲免费视频 | 大地资源二中文在线影视免费观看 | 夜夜嗨av一区二区三区 | 怡红院一区 | 免费黄色网页 | 国产无套内射普通话对白 | 欧洲精品久久久 | 免费h片网站 | 欧美黑人一级 |