深度学习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
相关产品推荐
相关产品推荐

