Anonymous
Нейронная сеть Numpy не обучается (застряла на точности 10%) – Python
Сообщение
Anonymous » 13 ноя 2024, 02:07
Итак, я пытаюсь создать базовую ИНС, используя numpy. Дело в том, что я продолжаю получать прогноз точности около 10% и не понимаю, почему это так. Вот весь код.
Код: Выделить всё
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
data = pd.read_csv('train.csv')
data = np.array(data)
m, n = data.shape
np.random.shuffle(data)
data_train = data.T
X_train = data_train[1:n]
Y_train = data_train[0]
def init_params():
W1 = np.random.randn(10, 784)
b1 = np.random.rand(10, 1)
W2 = np.random.randn(10, 10)
b2 = np.random.randn(10, 1)
return W1, b1, W2, b2
def ReLU(Z):
return np.maximum(0, Z)
def softmax(Z):
e = np.exp(Z - Z.max(axis=0, keepdims=True))
return e/e.sum(axis=0, keepdims=True)
def forward_prop(W1, b1, W2, b2, X):
Z1 = W1.dot(X) + b1
A1 = ReLU(Z1)
Z2 = W2.dot(A1) + b2
A2 = softmax(Z2)
return Z1, A1, Z2, A2
def one_hot(Y):
one_hot_Y = np.zeros((Y.size, Y.max() + 1))
one_hot_Y[np.arange(Y.size), Y] = 1
one_hot_Y = one_hot_Y.T
return one_hot_Y
def deriv_ReLU(Z):
return (Z > 0).astype(int)
def back_prop(Z1, A1, Z2, A2, W2, X, Y):
m = Y.size
one_hot_Y = one_hot(Y)
dZ2 = A2 - one_hot_Y
dW2 = 1 / m * dZ2.dot(A1.T)
db2 = 1 / m * np.sum(dZ2, 1).reshape(-1, 1)
dZ1 = W2.T.dot(dZ2) * deriv_ReLU(Z1)
dW1 = 1 / m * dZ1.dot(X.T)
db1 = 1 / m * np.sum(dZ1, 1).reshape(-1, 1)
return dW1, db1, dW2, db2
def update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha):
W1 = W1 - alpha * dW1
db1 = b1 - alpha * db1
W2 = W2 - alpha * dW2
db2 = b2 - alpha * db2
return W1, b1, W2, b2
def get_predictions(A2):
return np.argmax(A2, 0)
def get_accuracy(predictions, Y):
print(predictions, Y)
return np.sum(predictions == Y) / Y.size
def gradient_descent(X, Y, iterations, alpha):
W1, b1, W2, b2 = init_params()
for i in range(iterations):
Z1, A1, Z2, A2 = forward_prop(W1, b1, W2, b2, X)
dW1, db1, dW2, db2 = back_prop(Z1, A1, Z2, A2, W2, X, Y)
W1, b1, W2, b2 = update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha)
if (i % 50):
print(f'Iteration: {i}')
print(f'Accuracy: {get_accuracy(get_predictions(A2), Y)}')
return W1, b1, W2, b2
W1, b1, W2, b2 = gradient_descent(X_train, Y_train, 100, 0.1)
Я думал, что это может быть проблема с данными, которые я использовал, но после проверки новых данных это оказалось не так. ТАК очевидно, что где-то в обратном распространении (я предполагаю) я что-то напутал и поменял некоторые переменные. Я новичок в этом, так что будьте полегче
Подробнее здесь:
https://stackoverflow.com/questions/791 ... acy-python
1731452842
Anonymous
Итак, я пытаюсь создать базовую ИНС, используя numpy. Дело в том, что я продолжаю получать прогноз точности около 10% и не понимаю, почему это так. Вот весь код. [code]import numpy as np import pandas as pd from matplotlib import pyplot as plt data = pd.read_csv('train.csv') data = np.array(data) m, n = data.shape np.random.shuffle(data) data_train = data.T X_train = data_train[1:n] Y_train = data_train[0] def init_params(): W1 = np.random.randn(10, 784) b1 = np.random.rand(10, 1) W2 = np.random.randn(10, 10) b2 = np.random.randn(10, 1) return W1, b1, W2, b2 def ReLU(Z): return np.maximum(0, Z) def softmax(Z): e = np.exp(Z - Z.max(axis=0, keepdims=True)) return e/e.sum(axis=0, keepdims=True) def forward_prop(W1, b1, W2, b2, X): Z1 = W1.dot(X) + b1 A1 = ReLU(Z1) Z2 = W2.dot(A1) + b2 A2 = softmax(Z2) return Z1, A1, Z2, A2 def one_hot(Y): one_hot_Y = np.zeros((Y.size, Y.max() + 1)) one_hot_Y[np.arange(Y.size), Y] = 1 one_hot_Y = one_hot_Y.T return one_hot_Y def deriv_ReLU(Z): return (Z > 0).astype(int) def back_prop(Z1, A1, Z2, A2, W2, X, Y): m = Y.size one_hot_Y = one_hot(Y) dZ2 = A2 - one_hot_Y dW2 = 1 / m * dZ2.dot(A1.T) db2 = 1 / m * np.sum(dZ2, 1).reshape(-1, 1) dZ1 = W2.T.dot(dZ2) * deriv_ReLU(Z1) dW1 = 1 / m * dZ1.dot(X.T) db1 = 1 / m * np.sum(dZ1, 1).reshape(-1, 1) return dW1, db1, dW2, db2 def update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha): W1 = W1 - alpha * dW1 db1 = b1 - alpha * db1 W2 = W2 - alpha * dW2 db2 = b2 - alpha * db2 return W1, b1, W2, b2 def get_predictions(A2): return np.argmax(A2, 0) def get_accuracy(predictions, Y): print(predictions, Y) return np.sum(predictions == Y) / Y.size def gradient_descent(X, Y, iterations, alpha): W1, b1, W2, b2 = init_params() for i in range(iterations): Z1, A1, Z2, A2 = forward_prop(W1, b1, W2, b2, X) dW1, db1, dW2, db2 = back_prop(Z1, A1, Z2, A2, W2, X, Y) W1, b1, W2, b2 = update_params(W1, b1, W2, b2, dW1, db1, dW2, db2, alpha) if (i % 50): print(f'Iteration: {i}') print(f'Accuracy: {get_accuracy(get_predictions(A2), Y)}') return W1, b1, W2, b2 W1, b1, W2, b2 = gradient_descent(X_train, Y_train, 100, 0.1) [/code] Я думал, что это может быть проблема с данными, которые я использовал, но после проверки новых данных это оказалось не так. ТАК очевидно, что где-то в обратном распространении (я предполагаю) я что-то напутал и поменял некоторые переменные. Я новичок в этом, так что будьте полегче :) Подробнее здесь: [url]https://stackoverflow.com/questions/79182980/numpy-neural-network-not-learning-stuck-on-10-accuracy-python[/url]