簡體   English   中英

ValueError:Theano中的尺寸不匹配錯誤

[英]ValueError: Dimension mismatch error in Theano

我正在嘗試使用python中的Theano庫通過神經網絡實現AND操作。 這是我的代碼:

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: ValueError: Dimension mismatch; shapes are (*, *), (*, 4), (4, 1), (*, *), (*, 4), (4, 1) Apply node that caused the error: 即使更改權重向量w1w2的尺寸,誤差仍然相同。 我是Theano的新手,對調試它並不了解。 有人可以幫我嗎? 謝謝。

如錯誤消息中所示,您的輸入尺寸不匹配:

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()

這樣,我們得到形狀為(4,3)的a1(與第一層輸入相同),而預期的輸出為a2(4,1)。

x * w1 =(4,3)*(3,3)=(4,3)= a1。形狀

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM