【发布时间】:2020-07-20 09:40:30
【问题描述】:
我有一个名为 weightDeltas 的函数,它输出一个包含 2 个一维数组的列表。我稍后在另一个函数中使用这些值,更新。两者都乘以其他一维数组。我收到一条错误消息,提示“TypeError:列表索引必须是整数或切片,而不是元组”。如何从该列表中取出一维数组,以便将一个一维数组乘以另一个一维数组?
import math
import random
import numpy as np
def createWeights(numInputs, numNodes):
layerWeights = np.empty([numNodes, numInputs])
Bounds = 1/math.sqrt(numInputs)
for q in range(numNodes):
for r in range(numInputs):
layerWeights[q][r] = random.uniform(- Bounds, Bounds)
return layerWeights
def summedInput(weights, inputs, numberNodes):
sumIn = np.empty(numberNodes)
weightedInputs = np.multiply(weights, inputs)
for s in range(numberNodes):
sumIn[s] = np.sum(weightedInputs[s][:])
return sumIn
def fNet(addedInputs):
lam = 1
fnet = np.empty(len(addedInputs))
for t in range(len(addedInputs)):
fnet[t] = 1/(1 + math.exp(-lam*addedInputs[t]))
return fnet
def weightDeltas(tk, zk, wkj, netj, netk):
lam = 1
fNetj = np.empty(len(netj))
fnetPrimej = np.empty(len(netj))
fNetk = np.empty(len(netk))
fnetPrimek = np.empty(len(netk))
for u in range(len(netj)):
fNetj[u] = 1/(1 + math.exp(-lam*netj[u]))
fnetPrimej[u] = fNetj[u]*(1-fNetj[u])
for v in range(len(netk)):
fNetk[v] = 1/(1 + math.exp(-lam*netk[v]))
fnetPrimek[v] = fNetk[v]*(1-fNetk[v])
dk = np.transpose((tk-zk))*fnetPrimek
dj = fnetPrimej*np.sum(np.dot(dk,wkj))
deltas = [dj,dk]
return deltas
def update(inputs, y, wji, wkj, deltas):
eta = .1
wjiDim = wji.shape
wkjDim = wkj.shape
for uu in range(wjiDim[0]):
for vv in range(wjiDim[1]):
#wji[uu][vv] = wji[uu][vv] + eta*deltas[0]*inputs
wji[uu][vv] = wji[uu][vv] + np.dot(eta*deltas[0][None,:],inputs[:,None])
for w in range(wkjDim[0]):
for x in range(wkjDim[1]):
wkj[w][x] = wkj[w][x] + eta*deltas[1]*y
testInputs = [1,2,3,4,5,6,7,8]
testTK = [1,0,0,0,0,0,0,0,0,0]
testWeights1 = createWeights(8,4)
testSumin1 = summedInput(testWeights1, testInputs, 4)
testFnet1 = fNet(testSumin1)
testWeights2 = createWeights(4,10)
testSumin2 = summedInput(testWeights2, [testFnet1], 10)
testFnet2 = fNet(testSumin2)
testWD = weightDeltas(testTK, testFnet2, testWeights2, testSumin1, testSumin2)
up = update(testInputs, testFnet1, testWeights1, testWeights2, testWD)
编辑: 我试过改变 wji[uu][vv] = wji[uu][vv] + np.dot(eta*deltas[0][None,:],inputs[:,None]) 到
wji[uu][vv] = wji[uu][vv] + np.matmul(eta*np.array(deltas[0])[None,:],np.array(inputs)[:,None ])。
抛出:ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 8与 4) 不同。
我也试过 wji[uu][vv] = wji[uu][vv] + np.dot(eta*np.reshape(deltas[0],(4,1)),np.reshape(输入, (1,8)) )。
抛出:ValueError: setting an array element with a sequence.
【问题讨论】:
-
由于 weightDeltas 的输出是 2 个一维数组,我认为您不能使用 deltas[0][None, :] 在更新函数中访问一维数组,可以你呢?
-
您可以尝试:np.array(inputs)[None,:] 但一维数组的长度不同,因此您无法获取它们的点积。
-
@DerekO ,我不知道为什么这不起作用。用 1x8 点缀的 4x1 应该是 4x8。
-
对于两个一维数组 np.dot 仅在两个数组长度相同时才有效。你应该使用 np.matmul
-
你好@DerekO,现在我收到一条错误消息,“ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k ,m?)->(n?,m?)(8 号与 4 号不同)。”