Как исправить ошибки в точках NumPy из-за 0-мерных матриц? - PullRequest
0 голосов
/ 03 июля 2018

При построении нейронной сети и попытке вычислить производную моей стоимости по моим весам, я сталкиваюсь с этой ошибкой, когда пытаюсь расставить точки по моим матрицам.

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

1 Ответ

0 голосов
/ 03 июля 2018

activation0 - это массив ранга 1 . Его форма (3,) и форма его транспонирования также (3,). Вы можете добавить второе измерение в ваш массив. Вот некоторые полезные методы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...