ValueError: Ошибка несоответствия размеров в Theano
Я пытаюсь реализовать AND
работа через нейронную сеть с использованием библиотеки Theano в python. Вот мой код:
import theano
import theano.tensor as T
import numpy as np
import matplotlib.pyplot as plt
#Define variables:
x = T.matrix('x')
w1 = theano.shared(np.random.uniform(0,1,(3,3)))
w2 = theano.shared(np.random.uniform(0,1,(1,3)))
learning_rate = 0.01
#Define mathematical expression:c for forward pass
z1 = T.dot(x,w1)
a1 = 1/(1+T.exp(-z1))
z2 = T.dot(a1,w2.T)
a2 = 1/(1 + T.exp(-z2))
#Let’s determine the cost as follows:
a_hat = T.vector('a_hat') #Actual output
cost = -(a_hat*T.log(a2) + (1-a_hat)*T.log(1-a2)).sum()
dw2,dw1 = T.grad(cost,[w2,w1])
train = theano.function(
inputs = [x,a_hat],
outputs = [a2,cost],
updates = [
[w1, w1-learning_rate*dw1],
[w2, w2-learning_rate*dw2]
]
)
#Define inputs and weights
inputs = np.array([
[0, 0],
[0, 1],
[1, 0],
[1, 1]
])
inputs = np.append( np.ones((inputs.shape[0],1)), inputs, axis=1)
outputs = np.array([0,0,0,1]).T
#Iterate through all inputs and find outputs:
cost = []
for iteration in range(30000):
pred, cost_iter = train(inputs, outputs)
cost.append(cost_iter)
Я не могу отследить ошибку ValueError: Dimension mismatch; shapes are (*, *), (*, 4), (4, 1), (*, *), (*, 4), (4, 1) Apply node that caused the error:
, Даже если я изменю размерность весовых векторов w1
а также w2
ошибка остается прежней. Я новичок в Theano и не очень разбираюсь в его отладке. Кто-нибудь может мне помочь? Благодарю.
1 ответ
У вас есть несоответствие входного размера, как вы можете видеть в сообщении об ошибке:
ValueError: Input dimension mis-match. (input[1].shape[1] = 4, input[2].shape[1] = 1)
Точнее здесь:
Inputs values: [array([[-1.]]), array([[ 0., 0., 0., 1.]]), array([[-1.13961476],
[-1.28500784],
[-1.3082276 ],
[-1.4312266 ]]), array([[-1.]]), array([[ 1., 1., 1., 0.]]), array([[ 1.13961476],
[ 1.28500784],
[ 1.3082276 ],
[ 1.4312266 ]])]
Вы можете получить вдохновение в нейронной сети XOR, этот пример был рассмотрен здесь, и изучение этого урока поможет вам лучше понять theano.
У меня также были трудные времена, когда я впервые попробовал использовать theano. Очень мало примеров и учебных пособий. Может быть, вы также можете проверить Lasagne, это библиотека, основанная на Theano, но я чувствовал, что ее легче взять в руки.
Я надеюсь, что это поможет вам.
[РЕДАКТИРОВАТЬ]
Используйте следующие флаги, чтобы помочь вам найти источник ошибки
theano.config.exception_verbosity='high'
theano.config.optimizer='None'
В вашем случае мы можем найти следующие интересные строки в выводе:
Backtrace when the node is created(use Theano flag traceback.limit=N to make it longer):
File "SO.py", line 30, in <module>
cost = -(a_hat*T.log(a2) + (1-a_hat)*T.log(1-a2)).T.sum()
Итак, вот веса, которые мы хотели:
w1 = theano.shared(np.random.uniform(0,1,(3,3)))
w2 = theano.shared(np.random.uniform(0,1,(3,1)))
С помощью этой функции стоимости:
cost = -(a_hat*T.log(a2.T) + (1-a_hat)*T.log(1-a2.T)).sum()
Таким образом, мы получаем a1 формы (4,3) (такой же, как на входе 1-го уровня) и a2 (4,1) в качестве ожидаемого результата.
x * w1 = (4,3) * (3,3) = (4,3) = a1.shape
a1 * w2 = (4,3) * (3,1) = (4,1) = a2.shape
Вам также нужно будет добавить эту строку:
from random import random
Это даст вам 30000 итераций:
The outputs of the NN are:
The output for x1=0 | x2=0 is 0.0001
The output for x1=0 | x2=1 is 0.0029
The output for x1=1 | x2=0 is 0.0031
The output for x1=1 | x2=1 is 0.9932