Python实现反向传播算法时报错:非整数类型无法完成乘法运算TypeError
问题原因排查
报错TypeError: can't multiply sequence by non-int of type 'list'是代码存在多处逻辑、类型不匹配问题导致的,具体问题如下:
- 乘法操作的操作数类型错误:Python中只有序列乘整数才会被识别为序列复制操作,乘非整数就会触发该报错。你代码中
val = X[i]*w[j]行的两个操作数,一个是样本序列(元组/列表类型),另一个是非整数的数值/列表元素,类型不匹配无法计算。 - 循环逻辑错误:内层循环的变量
j仅在函数开头初始化一次,第一次外层i循环跑完后j就等于权重列表长度,后续i递增时内层循环永远不会执行,不会生成新的计算值。 - 未定义变量错误:函数内计算
sumVal = F(val1,val2,val3)时,val1/val2/val3三个变量完全没有定义,你之前的计算结果都存在valArray中没有被取出使用。 - 调用逻辑错误:
neuralLearn函数中z[1] = logistic(function)行错误传入了函数对象本身,不是上一步的计算结果,导致后续所有变量类型全部异常;同时z[2] = function(data, 2)直接给权重参数传了整数2,也会触发类型错误。
解决方案
1. 修正线性计算函数逻辑
首先明确该函数的作用是计算特征和权重的线性组合,修正后代码如下:
# 单样本线性计算 def linear_calc(X, w): if len(X) != len(w): raise ValueError("特征维度和权重维度不匹配") return sum(x_i * w_i for x_i, w_i in zip(X, w)) # 批量样本线性计算 def batch_linear_calc(data, w): res = [] for X in data: res.append(sum(x_i * w_i for x_i, w_i in zip(X, w))) return res
2. 修正训练调用逻辑
z = [1, 0, 0] i = 0 # 初始化循环变量 while(i <= 10000): # 第一层计算 z[1] = batch_linear_calc(data, w1) z[1] = [logistic(x) for x in z[1]] z[1] = [hardThresh(x) for x in z[1]] # 第二层计算,传入对应权重w2,不要传整数2 z[2] = batch_linear_calc(data, w2) z[2] = [logistic(x) for x in z[2]] z[2] = [hardThresh(x) for x in z[2]] # 后续补充反向传播更新w1、w2、v的逻辑即可 i += 1
3. 可选优化
如果需要提升数值计算效率、避免维度不匹配问题,建议用numpy数组替换原生Python列表做张量计算。
内容的提问来源于stack exchange,提问作者tquigg96
相关产品推荐
相关产品推荐

