簡體   English   中英

神經網絡的數據集太大,因此崩潰了我的操作系統。 如何提高效率?

[英]Dataset for neural network too large so it crashes my OS. How do I make it more efficient?

我正在制作一個簡單的神經網絡,通過預測在輸入2張卡片時是升還是棄來進行撲克游戲。 我正在使用10461x6的數據集進行訓練。

這是前幾行的樣子:

┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃  Card1/12 ┇  Card2/12 ┇Suited?┇  Average  ┇Max Difference┇Min Difference┃
┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━┫
┃0.642857143┇0.285714286┇   0   ┇0.464285714┇ 0.178571429  ┇ 0.178571429  ┃
┣┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅┫
┃0.357142857┇0.214285714┇   0   ┇0.285714286┇ 0.071428571  ┇ 0.071428571  ┃
┣┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅┫
┃0.857142857┇0.285714286┇   0   ┇0.571428571┇ 0.285714286  ┇ 0.285714286  ┃
┣┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅┫
┃0.928571429┇0.571428571┇   0   ┇   0.75    ┇ 0.178571429  ┇ 0.178571429  ┃
┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┛

我將此數據集存儲在csv中,並使用np.genfromtxt()將其轉換為python中的數組。 然后,該數據通過神經網絡運行以對其進行訓練。 但是,我遇到了一個小問題,因為數據集太大,以至於完全崩潰了我的OS。

我認為這是正在發生的事情:

  • 我認為陣列無法容納10461x6陣列不成問題。
  • 我相當確定這只是培訓花費了這么長時間並使用了所有系統資源,因此看起來好像已經掛了。

我需要一種使用這種大數據集訓練神經網絡的更有效方法。

這是我的代碼:

import numpy as np
import csv
class nn:   
    #make sigma
    def sigma(self,x):
        return 1/(1+np.exp(-x))

    #sigma gradient
    def sigmaDeriv(self,x):
        return x*(1-x)

    def train(self):
        #define datasets
        x = np.genfromtxt('hands.csv', delimiter=',')
        y = np.genfromtxt('correctpred.csv', delimiter=',')[np.newaxis]
        y = y.T

        #seed
        np.random.seed(1)

        w0 = 2*np.random.random((6,10461))-1
        w1 = 2*np.random.random((10461,10461))-1
        w2 = 2*np.random.random((10461,10461))-1
        w3 = 2*np.random.random((10461,1))-1

        #train
        for t in xrange(1000):
            #forward propagation
            l0 = x
            l1 = self.sigma(np.dot(l0, w0))
            l2 = self.sigma(np.dot(l1, w1))
            l3 = self.sigma(np.dot(l2, w2))
            l4 = self.sigma(np.dot(l3, w3))

            #error + change calc
            l4_error = y - l4    
            l4_change = l4_error*self.sigmaDeriv(l4)
            l3_error = l4_change.dot(w3.T)
            l3_change = l3_error * self.sigmaDeriv(l3)
            l2_error = l3_change.dot(w2.T)
            l2_change = l2_error * self.sigmaDeriv(l2)
            l1_error= l2_change.dot(w1.T)
            l1_change = l1_error * self.sigmaDeriv(l1)

            #update weights
            w3 += np.dot(l3.T, l4_change)
            w2 += np.dot(l2.T, l3_change)
            w1 += np.dot(l1.T, l2_change)
            w0 += np.dot(l0.T, l1_change)

        print "Output after training"
        print l4

    nn().train()

使用隨機梯度下降法 ,正是出於這種目的而創建的。

基本上,不是使用所有數據來進行前向后傳播和計算誤差(損耗),而是僅使用一批b樣本來計算損耗並獲得梯度。 然后,每次使用不同批次的樣本訓練10461 / b迭代,直到看到整個數據集。 一旦訓練了整個數據集,即稱為紀元。 重復10個左右(您可以調整)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM