Я все еще немного новичок в машинном обучении и пытаюсь внедрить нейронную сеть с нуля, просто используя 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 для остальных запусков.