在学习neurolab,创建LVQ神经网络时,出现了“TypeError: slice indices must be integers or None or have ”问题,第一反应就是复制错误提示在网上找找有没有这个问题的解决方法,结果优点令人沮丧,在网上没有关于这个问题的解决方法。本以为我的创建方式有问题,可是查看官方文档,发现也是这样创建的,官方文档代码如下:
"""
Example of use LVQ network
==========================
"""
import numpy as np
import neurolab as nl
# Create train samples
input = np.array([[-3, 0], [-2, 1], [-2, -1], [0, 2], [0, 1], [0, -1], [0, -2],
[2, 1], [2, -1], [3, 0]])
target = np.array([[1, 0], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1], [0, 1],
[1, 0], [1, 0], [1, 0]])
# Create network with 2 layers:4 neurons in input layer(Competitive)
# and 2 neurons in output layer(liner)
net = nl.net.newlvq(nl.tool.minmax(input), 4, [.6, .4])
# Train network
error = net.train(input, target, epochs=1000, goal=-1)
在没有现成的解决方法之下,无可奈何!只能Debugger,一行一行的排查错误,经排查发现问题bug出现在neurolab的官方源文件net.py上,
代码如下:
for n, i in enumerate(inx): st = 0 if n == 0 else inx[n - 1] layer_out.np['w'][n][st:i].fill(1.0) net = Net(minmax, cn1, [layer_inp, layer_out], [[-1], [0], [1]], train.train_lvq, error.MSE())
我根据错误提示,把layer_out.np['w'][n][st:i].fill(1.0)改成layer_out.np['w'][n][int(st):int(i)].fill(1.0)后,bug解决了。
所以写了这个博客,希望能对踩到相同坑的小伙伴有所帮助。
PS:
这是我的代码:
import numpy as np import neurolab as nl # 定义输入数据 input_file = 'data_vq.txt' input_text = np.loadtxt(input_file) data = input_text[:, 0:2] labels = input_text[:, 2:] # 定义一个两层的学习向量量化(Learning Vector Quantization, LVQ)神经网络:输入含10个神经元,输出含4个神经元 # 最后一个参数的数组指定了每个输出的加权百分比 net = nl.net.newlvq(nl.tool.minmax(data), 10, [0.25, 0.25, 0.25, 0.25]) # 训练神经网络 error = net.train(data, labels, epochs=100, goal=-1)