簡體   English   中英

使用多個隱藏層時,神經網絡的准確性非常差

[英]Neural networks very bad accuracy when using more than one hidden layer

我創建了以下神經網絡:

def init_weights(m, n=1):
    """
    initialize a matrix/vector of weights with xavier initialization
    :param m: out dim
    :param n: in dim
    :return: matrix/vector of random weights
    """
    limit = (6 / (n * m)) ** 0.5
    weights = np.random.uniform(-limit, limit, size=(m, n))
    if n == 1:
        weights = weights.reshape((-1,))
    return weights


def softmax(v):
    exp = np.exp(v)
    return exp / np.tile(exp.sum(1), (v.shape[1], 1)).T


def relu(x):
    return np.maximum(x, 0)


def sign(x):
    return (x > 0).astype(int)


class Model:
    """
    A class for neural network model
    """

    def __init__(self, sizes, lr):
        self.lr = lr

        self.weights = []
        self.biases = []
        self.memory = []
        for i in range(len(sizes) - 1):
            self.weights.append(init_weights(sizes[i + 1], sizes[i]))
            self.biases.append(init_weights(sizes[i + 1]))

    def forward(self, X):
        self.memory = [X]
        X = np.dot(self.weights[0], X.T).T + self.biases[0]
        for W, b in zip(self.weights[1:], self.biases[1:]):
            X = relu(X)
            self.memory.append(X)
            X = np.dot(W, X.T).T + b
        return softmax(X)

    def backward(self, y, y_pred):
        #  calculate the errors for each layer
        y = np.eye(y_pred.shape[1])[y]
        errors = [y_pred - y]
        for i in range(len(self.weights) - 1, 0, -1):
            new_err = sign(self.memory[i]) * \
                      np.dot(errors[0], self.weights[i])
            errors.insert(0, new_err)
            
        # update weights
        for i in range(len(self.weights)):
            self.weights[i] -= self.lr *\
                np.dot(self.memory[i].T, errors[i]).T
            self.biases[i] -= self.lr * errors[i].sum(0)

數據有 10 個類別。 當使用單個隱藏層時,准確率幾乎是 40%。 當使用 2 或 3 個隱藏層時,從第一個 epoch 開始,准確率約為 9-10%,並且一直保持這種狀態。 訓練集上的准確度也在這個范圍內。 我的實現是否存在可能導致這種情況的問題?

我會盡量用簡單的話來解釋。 您正在使用無界線性錯誤 function。 當您增加隱藏層時,它沒有任何好處,因為線性函數的任何組合仍然是線性的,現在您有更多的權重可以使用相同數量的數據進行優化。 為了使您遇到的問題變得更糟,這很容易出現梯度消失現象。 嘗試將線性誤差 function 替換為非線性誤差,例如交叉熵或負對數損失,並將 relu 替換為泄漏的 relu。 由於您尚未共享您正在使用的數據,我不會評論您是否應該使用多個隱藏層。 一件事,更多的隱藏層不能保證精度提高。

你問一個機器學習 model 的准確率提升,這是 ML 時代一個非常廣泛和模糊的問題,因為它在各種 model 類型和數據類型之間變化

在您的情況下,model 是神經網絡,它有幾個取決於准確性的因素。 您正在嘗試根據激活函數、權重或隱藏層數來優化准確性,這不是正確的方法。 為了提高准確性,您還必須考慮其他因素,例如您的基本清單可以遵循

  • 增加隱藏層
  • 更改激活函數
  • 嘗試初始權重初始化
  • 標准化訓練數據
  • 擴展訓練數據
  • 檢查 Class 偏差

現在你試圖在很少的因素的基礎上達到藝術精度的 state,我不知道你的數據集,因為你沒有顯示預處理代碼,但我建議你仔細檢查數據集可能是正確規范化數據集可以提高准確性,還檢查您的數據集是否可以縮放,最重要的是,如果您的數據集中的 class 樣本之一與其他樣本相比過載或數量過多,那么它也會導致精度差的矩陣。

有關更多詳細信息,請查看包含數學證明和解釋這些事情如何影響您的 ML model 精度

暫無
暫無

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

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