При построении нейронной сети и попытке вычислить производную моей стоимости по моим весам, я сталкиваюсь с этой ошибкой, когда пытаюсь расставить точки по моим матрицам.
ValueError: формы (3,) и (1,) не выровнены: 3 (dim 0)! = 1 (dim 0)
Мой код:
(Вероятно, наиболее важной является функция Backpropagation)
import numpy as np
class Feedforward:
def __init__(self, size_vector):
self.nLayers = len(size_vector)
weight_matrix = lambda x: np.random.random((x[0],x[1]))
self.weights = {}
self.b = {}
self.z = {}
self.a = {}
for i in range(0,self.nLayers,1):
z = size_vector[i:i+2]
try:
self.b[i] = np.random.random(size_vector[i+1])
except IndexError:
pass
if len(z) == 2:
self.weights[i] = weight_matrix(z)
def activation(self, matrix):
return (np.exp(2*matrix)-1)/(np.exp(2*matrix)+1)
def activation_prime(self, matrix):
return 1/(1-np.square(matrix))
def f_pass(self, data):
for layer in range(self.nLayers-1):
if layer == 0:
self.z[layer] = data.dot(self.weights[0])+self.b[layer]
self.a[layer] = self.activation(self.z[layer])
else:
self.z[layer] = self.a[layer-1].dot(self.weights[layer])+self.b[layer]
self.a[layer] = self.activation(self.z[layer])
def backporpagate(self, expected):
cost = np.square(expected-self.a[self.nLayers-2])
partial_layer_error = {}
partial_weight_error = {}
partial_bias_error = {}
for i in range(self.nLayers-1):
layer = self.nLayers-2-i
if i == 0:
partial_layer_error[layer] = 2*np.power(cost, .5)*self.activation_prime(self.z[layer])
partial_weight_error[layer] = self.a[layer-1].transpose().dot(partial_layer_error[layer])
partial_bias_error[layer] = partial_layer_error[layer]
elif layer == 0:
partial_layer_error[layer] = partial_layer_error[layer+1].dot(self.weights[layer+1].transpose())
partial_weight_error[layer] = self.a[layer].dot(partial_layer_error[layer])
partial_bias_error[layer] = partial_layer_error[layer]
else:
partial_layer_error[layer] = partial_layer_error[layer+1].dot(self.weights[layer+1].transpose())
partial_weight_error[layer] = self.a[layer].dot(partial_layer_error[layer])
partial_bias_error[layer] = partial_layer_error[layer]
print('NN Layer Costs are: \n')
print(partial_layer_error)
print('NN Bias Costs are: \n')
print(partial_bias_error)
print('NN Weight Costs are: \n')
print(partial_weight_error)
with open('mnist_test.csv') as f:
data = f.readlines()
mnist = []
for i in data:
key = i[0]
value = i[1:]
value = value.replace('\n','')
value = value.split(',')
value.pop(0)
value = [int(x) for x in value]
mnist.append((key,value))
N = Feedforward([2,3,1])
print('NN Weights are: \n')
print(N.weights)
print('NN Biases are: \n')
print(N.b)
N.f_pass(np.array([1,2]))
print('NN Summations are: \n')
print(N.z)
print('NN Activations are: \n')
print(N.a)
N.backporpagate(np.array([1]))
Я вставлю вывод моего терминала сюда, чтобы вы могли видеть результаты и формы матриц
NN Вес:
{0: массив ([[0,92603489, 0,43665109, 0,99003931],
[0,8336553, 0,78370378, 0,45612777]]), 1: массив ([[0,75876672],
[0.08175101],
[0.1875789]])} Смещения NN:
{0: массив ([0.47764224, 0.43533307, 0.44388977]), 1: массив ([
0.03250969])} NN Суммирования:
{0: массив ([3.07098773, 2.43939172, 2.34618461]), 1: массив ([
1.05270827])} NN Активации:
{0: массив ([0.99570789, 0.98490231, 0.98183657]), 1: массив ([
0.78285705])} Traceback (последний вызов был последним): файл «Нейронная сеть (Backprop) .py», строка 91, в
N.backporpagate (np.array ([1])) Файл «Нейронная сеть (Backprop) .py», строка 50, в backporpagate
part_weight_error [layer] = self.a [layer-1] .transpose (). dot (part_layer_error [layer])
ValueError: формы (3,) и (1,) не выровнены: 3 (dim 0)! = 1 (dim 0)
Но, как вы можете видеть, activatio0 - это матрица 1x3, аpartal_layer_error 1 - это матрица 1x1. Так что Activation0 транспонировать точку частичная ошибка должна работать. Но вместо этого я получаю ShapeError