我有一个名为weightDeltas的函数,它输出一个包含2个1D数组的列表。我稍后将在另一个函数update中使用这些值。两者都会被其他1D阵列相乘。我得到一个错误,上面写着“TypeError:列表索引必须是整数或切片,而不是元组”。如何从列表中取出1D数组,以便将一个1D数组乘以另一个1D数组
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*delta[0][None,:],输入[:,None])到
wji[uu][vv]=wji[uu][vv]+np.matmul(eta*np.array(delta[0])[None,:],np.array(inputs)[:,None])
抛出:ValueError:matmul:Input操作数1的核心维度0不匹配,带有gufunc签名(n?,k),(k,m?)->;(n?,m?)(8号与4号不同)
我也试过了 wji[uu][vv]=wji[uu][vv]+np.dot(eta*np.reformate(delta[0],(4,1)),np.reformate(inputs,(1,8)))
抛出:ValueError:使用序列设置数组元素
我弄明白了。除其他外,我将一些功能组合在一起。我现在可以为那些熟悉神经网络的人进行模式和批/历元更新。这里缺少很多制作xVect的代码。这会使这篇文章太长。谢谢你的帮助
相关问题 更多 >
编程相关推荐