Я реализую нейронную сеть Multiclass, которая распознает цифры из входных изображений.Входные изображения имеют размер пять на пять пикселей, которые отображают пять чисел.Итак, модель нейронной сети содержит 25 входных узлов.4 выходных узла (как мы должны классифицировать пять выходов) и 50 скрытых узлов.Я использую сигмовидную функцию в качестве функции активации для скрытых узлов и функцию softmax в качестве функции активации для выходных узлов.
Мой входной аргумент X содержит сложенные данные двумерного изображения, то есть 5 * 5 * 5 трехмерных матриц.Итак, я преобразовал в (25,) вектор, используя np.reshape (X [:,:, x], 25) , чтобы я мог легко получить взвешенную сумму (так как веса 25 *50 для ввода в скрытые узлы и 50 * 5 для скрытых в выходные узлы).
Проблема, с которой я сталкиваюсь, заключается в том, что когда я вычисляю дельту для ввода в скрытый и скрытый для вывода соответственно, я получаю значение ошибки "ValueError: shape (50,) и (5,5) notвыровненный: 50 (dim 0)! = 5 (dim 0) ", который я полностью понимаю, из-за размеров обоих массивов.Но я не могу найти решение так, чтобы я мог каким-то образом изменить их и взять точечные продукты.Поскольку я впервые изучаю Python и эти нейронные сети и пишу свой собственный код, у меня нет особого опыта работы с матрицами.Мне нужна помощь в 1) исправлении этой проблемы, 2) как я могу улучшить эту сеть (будущие практики).3) Как я могу сделать сеть универсальной, чтобы, если бы я мог добавить больше слоев и т. Д., Я не испортил матричное умножение с разными измерениями?Прототип кода приведен ниже.
Код
# other stuff
def function(W1, W2, X, D):
N = 5
for x in range(N):
# reshaping input in 25*1 vector
l0 = np.reshape(X[:,:,x],25)
ll = sigmoid(np.dot(l0,W1))
l2 = softmax(np.dot(ll,W2))
l2_error = D - l2
l2_delta = l2_error
l1_error = l2_delta.dot(W2.T)
l1_delta = ll*(1-ll)*l1_error
DW2 = alpha*ll.T.dot(l2_delta) #ValueError: shapes (50,) and (5,5) not aligned: 50 (dim 0) != 5 (dim 0)
W2 = W2 + DW2
DW1 = alpha*l0.T.dot(l1_delta) #ValueError: shapes (25,) and (5,50) not aligned: 25 (dim 0) != 5 (dim 0)
W1 = W1 + DW1
# other stuff
X = np.zeros((5,5,5), dtype=int)
D = np.zeros((5,5), dtype=int)
X[:,:,0] = [[0 ,1, 1, 0, 0],
[0 ,0, 1, 0, 0],
[0 ,0, 1, 0, 0],
[0 ,0, 1, 0, 0],
[0 ,1, 1, 1, 0]]
X[:,:,1] = [[1 ,1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[0 ,1, 1, 1, 0],
[1 ,0, 0, 0, 0],
[1 ,1, 1, 1, 1]]
X[:,:,2] = [[1 ,1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[0 ,1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[1 ,1, 1, 1, 0]]
X[:,:,3] = [[0 ,0, 0, 1, 0],
[0 ,0, 1, 1, 0],
[0 ,1, 0, 1, 0],
[1 ,1, 1, 1, 1],
[0 ,0, 0, 1, 0]]
X[:,:,4] = [[1 ,1, 1, 1, 1],
[1 ,0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0 ,0, 0, 0, 1],
[1 ,1, 1, 1, 0]]
D = np.array([ [1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1] ]).T
W1 = 2*np.random.random((25,50)) - 1
W2 = 2*np.random.random((50,5)) - 1
W1, W2 = Multiclass(W1, W2, X, D)