2017-01-29 3 views
0

Я снова пытаюсь использовать Python, NumPy и массивы, чтобы вычислить некоторые вычисления между матрицами.Проблемы с размерами массивов Python

Код часть, которая, скорее всего, не работает должным образом выглядит следующим образом:

train, test, cv = np.array_split(data, 3, axis = 0) 
train_inputs = train[:,: -1] 
test_inputs = test[:,: -1] 
cv_inputs = cv[:,: -1] 

train_outputs = train[:, -1] 
test_outputs = test[:, -1] 
cv_outputs = cv[:, -1] 

При печати этих матриц информации (np.ndim, np.shape и dtype соответственно), это то, что вы получите:

2 
1 
2 
1 
2 
1 
(94936, 30) 
(94936,) 
(94936, 30) 
(94936,) 
(94935, 30) 
(94935,) 
float64 
float64 
float64 
float64 
float64 
float64 

Я считаю, что отсутствует 1 размер во всех *_output массивов.

Другая матрица мне нужна создается с помощью этой команды:

newMatrix = neuronLayer(30, 94936) 

В каком neuronLayer класс определяется как:

class neuronLayer(): 
    def __init__(self, neurons, neuron_inputs): 
     self.weights = 2 * np.random.random((neuron_inputs, neurons)) - 1 

Вот конечный результат:

outputLayer1 = self.__sigmoid(np.dot(inputs, self.layer1.weights)) 
ValueError: shapes (94936,30) and (94936,30) not aligned: 30 (dim 1) != 94936 (dim 0) 

Python явно говорит мне, что матрицы не складываются, но я не понимаю, e - проблема.

Любые советы?

PS: полный код вставлен ħere.

+3

При использовании 'dot (x, y)' (на 2d массивах) numpy требует, чтобы формы 'x' и' y' соответствовали '(A, B)' и '(B, C)', тогда как ваши - '(A, B)' и '(A, B)' – Eric

+0

Как упоминалось ниже, попытка, которая приведет к ошибке «Ошибка памяти». Не уверен, что это связано с моим старым компьютером или так, но изначально считалось, что это не было правильным решением. –

+0

Что такое «точка», которую нужно производить? 30x30 или 94936x94936 (слишком большой?) Массив? – hpaulj

ответ

1
layer1 = neuronLayer(30, 94936) # 29 neurons with 227908 inputs 
layer2 = neuronLayer(1, 30)   # 1 Neuron with the previous 29 inputs 

где `nueronLayer создает

self.weights = 2 * np.random.random((neuron_inputs, neurons)) - 1 

на 2 Веса (94936,30) и (30,1) в размере.

Эта линия не имеет никакого смысла. Я удивлен, что не выдаст ошибку

layer1error = layer2delta.dot(self.layer2.weights.np.transpose) 

Я подозреваю, что вы хотите np.transpose(self.layer2.weights) или self.layer2.weights.T.

Но, возможно, это не доходит. train первые звонки think с (94936,30) inputs

outputLayer1 = self.__sigmoid(np.dot(inputs, self.layer1.weights)) 
    outputLayer2 = self.__sigmoid(np.dot(outputLayer1, self.layer2.weights)) 

Так он пытается сделать np.dot с 2 (94936,30), (94936,30) массивы. Они несовместимы для точки. Вы можете перенести один или другой, создавая либо массив (94936,94936), либо (30,30). Один выглядит слишком большим. (30,30) совместим с весами для второго слоя.

np.dot(inputs.T, self.layer1.weights) 

имеет право работать правильно.

np.dot(outputLayer1, self.layer2.weights) 
(30,30) with (30,1) => (30,1) 

Но тогда вы

train_outputs - outputLayer2 

Это будет иметь проблемы, независимо от того, является train_outputs (94936,) или (94936,1)

Вы должны убедиться, что массивы формы потока правильно через расчет. Не просто проверяйте их в начале. Затем проверьте внутренне. И убедитесь, что вы понимаете, какие формы они должны иметь на каждом шагу.

Было бы намного проще разработать и протестировать этот код с гораздо меньшими входами и слоями, что-то вроде 10 образцов и 3 функций. Таким образом, вы можете посмотреть на значения, а также на фигуры.

+0

Спасибо за очень подробный ответ. Я многому научился этому. Я знал, что размеры и размеры матриц для начала были неправильными, просто не могли понять, где. Хотя, вы упомянули хорошую альтернативу, чтобы начать работать с этим, и это должно начаться с чего-то меньшего, а затем масштабировать его выше. Это могло бы хорошо понять код и то, что он делает. Что касается линии, это не имеет смысла, это не для меня :) Мне нужно умножить транспонированную матрицу. Просто не мог понять правильный порядок. Еще раз спасибо! –

0

np.dot использует матричное умножение, когда его аргументы являются матрицами. Похоже, ваш код пытается размножить две неквадратные матрицы вместе с теми же измерениями, которые не работают. Возможно, вы хотели перенести одну из матриц? Numpy матрицы имеют свойство T, который возвращает транспонирование, вы можете попробовать:

self.__sigmoid(np.dot(inputs.T, self.layer1.weights)) 
+0

Это выводит «Ошибка запоминания». Этот компьютер старый, хотя это может быть проблемой. Я пробовал это, но, так как я получил эту ошибку, я, хотя это не было исправление. –

+0

@GustavoSilva: Какую форму вы хотите 'np.dot (...)' быть здесь? Я думаю, что это делает это '(94936, 94936)', что, очевидно, довольно большое – Eric

Смежные вопросы