нейронная сеть для mnist с нуля перекрестная функция стоимости энтропии, дающая nan и бесконечность - PullRequest
0 голосов
/ 14 сентября 2018

Я все еще немного новичок в машинном обучении и пытаюсь внедрить нейронную сеть с нуля, просто используя pandas и numpy для набора данных mnist. Я использую сигмовидную активацию для скрытого слоя и SoftMax для выходного слоя с функцией кросс-энтропийной стоимости, но мне всегда кажется, что моя стоимость равна бесконечности или nan. Я не уверен, в чем проблема. Я попытался инициализировать веса по-разному, используя вместо этого функцию tanh. Может быть, просто мой код неверен, но любая помощь будет принята с благодарностью.

x_train форма (59999,784) y_train (закодировано) равно (59999,10)

#create one hot encoded labels for y_training set and y_test set
n_values = np.max(y_train) + 1
y_train = np.eye(n_values)[y_train]
n_values = np.max(y_test) + 1
y_test = np.eye(n_values)[y_test]

regularization = 0.01
def sigmoid(x):
   return 1 / (1 + np.exp(-x))

def sigmoid_p(x):
   return sigmoid(x) - (1 - sigmoid(x))

def softmax(x):
   return np.exp(x) / np.sum(np.exp(x), axis=1, keepdims=True)

def calc_cost(x, y, w1, w2, b1, b2):
   m = len(x)
   z1 = np.dot(x, w1) + b1
   a1 = sigmoid(z1)
   z2 = np.dot(a1, w2) + b2
   a2 = softmax(z2)
   loss = np.sum(np.nan_to_num(-y*np.log(a2)-(1-y)*np.log(1-a2)))
   loss = loss + (regularization/784) * np.sum(np.square(w1)) + np.sum   (np.square(w2))
   loss = loss * (1/m)
   return loss

m = len(y_train)

#initialize paramaters
np.random.seed(0)
w1 = np.random.rand(784,25)
b1 = np.zeros((1,25))
w2 = np.random.rand(25,10)
b2 = np.zeros((1,10))



def run_model(X, y, run_times, w1, w2, b1, b2):
alpha = 0.01

for i in range(run_times):
    z1 = np.dot(X,w1) + b1
    a1 = sigmoid(z1)
    z2 = np.dot(a1, w2) + b2
    a2 = softmax(z2)

    delta3 = a2 - y
    dw2 = (a1.T).dot(delta3)
    dw2 = dw2 + (regularization * w2)
    db2 = np.sum(delta3, axis=0, keepdims=True)
    delta2 = delta3.dot(w2.T) * sigmoid_p(z1)
    dw1 = np.dot(X.T, delta2)
    dw1 = dw1 + (regularization * w1)
    db1 = np.sum(delta2, axis=0)

    w1 = w1 - alpha * dw1
    w2 = w2 - alpha * dw2
    b1 = b1 - alpha * db1
    b2 = b2 - alpha * db2

    if i % 100 == 0:
        print(calc_cost(X, y , w1, w2, b1, b2))

return w1, w2, b1, b2

Когда я запускаю свой код, я получаю inf при первом запуске, а затем nan для остальных запусков.

...