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

深度学习Week4作业:L_layer_model触发IndexError问题求助

问题:L_layer_model执行触发IndexError: list index out of range

我运行了包含待评分函数L_layer_model的代码后,执行作业提供的不可修改代码:

parameters, costs = L_layer_model(train_x, train_y, layers_dims, num_iterations = 1, print_cost = False)
print("Cost after first iteration: " + str(costs[0]))
L_layer_model_test(L_layer_model)

触发错误:IndexError: list index out of range。尝试修改L_layer_model的print_cost默认值为False,问题仍未解决。

附L_layer_model函数代码:

def L_layer_model(X, Y, layers_dims, learning_rate = 0.0075, num_iterations = 4000, print_cost=True):
    """
    实现一个L层神经网络:[LINEAR->RELU]*(L-1)->LINEAR->SIGMOID.
    
    参数:
    X -- 输入数据,维度为(n_x, 样本数量)
    Y -- 真实标签向量(猫为1,非猫为0),维度为(1, 样本数量)
    layers_dims -- 包含输入尺寸和各层尺寸的列表,长度为(层数 + 1)
    learning_rate -- 梯度下降更新规则的学习率
    num_iterations -- 优化循环的迭代次数
    print_cost -- 如果为True,每100步打印一次成本
    
    返回:
    parameters -- 模型学习到的参数,可用于预测
    """

    np.random.seed(1)
    costs = []                         # 记录成本

    # 参数初始化(≈1行代码)
    ### START CODE HERE ###
    parameters = initialize_parameters_deep(layers_dims)
    ### END CODE HERE ###

    # 梯度下降循环
    for i in range(0, num_iterations):

        # 前向传播:[LINEAR -> RELU]*(L-1) -> LINEAR -> SIGMOID.
        ### START CODE HERE ### (≈1行代码)
        AL, caches = L_model_forward(X, parameters)
        ### END CODE HERE ###
        
        # 计算成本
        ### START CODE HERE ### (≈1行代码)
        cost = compute_cost(AL, Y)
        ### END CODE HERE ###

        # 反向传播
        ### START CODE HERE ### (≈1行代码)
        grads = L_model_backward(AL, Y, caches)
        ### END CODE HERE ###

        # 更新参数
        ### START CODE HERE ### (≈1行代码)
        parameters = update_parameters(parameters, grads, learning_rate)
        ### END CODE HERE ###
                
        # 每100个训练样本打印成本
        if print_cost and i % 100 == 0:
            print ("Cost after iteration %i: %f" %(i, cost))
        if print_cost and i % 100 == 0:
            costs.append(cost)
            
    # 绘制成本曲线
    plt.plot(np.squeeze(costs))
    plt.ylabel('cost')
    plt.xlabel('iterations (per tens)')
    plt.title("Learning rate =" + str(learning_rate))
    plt.show()

    return parameters, costs

问题原因

错误根源是costs列表为空:当调用时设置print_cost=False,函数内部的costs.append(cost)语句被print_cost的条件限制,不会执行。加上num_iterations=1,循环仅执行1次(i=0),costs始终为空,访问costs[0]自然触发索引越界。


解决方案

方案1:解绑成本记录与打印逻辑(推荐)

修改函数内的成本记录代码,去掉print_cost的限制,确保无论是否打印,成本都会被按周期记录:

# 原代码
if print_cost and i % 100 == 0:
    print ("Cost after iteration %i: %f" %(i, cost))
if print_cost and i % 100 == 0:
    costs.append(cost)

# 修改后代码
if print_cost and i % 100 == 0:
    print ("Cost after iteration %i: %f" %(i, cost))
# 去掉print_cost判断,确保成本被记录
if i % 100 == 0:
    costs.append(cost)

如果需要记录每次迭代的成本,直接将costs.append(cost)放在循环内,无需任何条件判断。

方案2:临时调整调用参数(临时 workaround)

若不允许修改L_layer_model,可临时设置print_cost=True调用,确保costs有内容:

parameters, costs = L_layer_model(train_x, train_y, layers_dims, num_iterations = 1, print_cost = True)
print("Cost after first iteration: " + str(costs[0]))
L_layer_model_test(L_layer_model)

额外优化建议

原函数的绘图部分在costs为空时也会报错,建议添加判断:

if len(costs) > 0:
    plt.plot(np.squeeze(costs))
    plt.ylabel('cost')
    plt.xlabel('iterations (per tens)')
    plt.title("Learning rate =" + str(learning_rate))
    plt.show()

内容的提问来源于stack exchange,提问作者Sunitah Kanyunyuzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:22:44