You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:06:04