吴恩达 第二周编程作业及总结

这篇博客详述了吴恩达第二周编程作业的代码实现,包括数据处理、神经网络构建思路及主程序。还分享了自制的思维导图总结,为初学者提供了易于理解的注释和参考资料链接。

前言

这篇博客包括吴恩达第二周编程作业代码以及自制思维导图总结,作为学习记录。如果要看大佬代码以及详细解读的朋友,我可以指个路,这是英文版这是中文版。作为初学者,本文的代码是参考上述大佬后部分自己写的,而剩下部分原搬的代码也加了很多注释,便于理解。

代码

查看并处理数据

import numpy as np
import matplotlib.pyplot as plt
from lr_utils import load_dataset
# lr_utils 是能加载下载好的数据集 datasets 的python文件

def get_data():
    # 将数据加载
    train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()
    # train_set_x_orig 训练集有209张64*64的图像
    # train_set_y 训练集图像对应的标签值[0/1]
    # test_set_x_orig 训练集有50张4*4的图像
    # test_set_y 测试集图像对应的标签值[0/1]
    # classes 保存的是以bytes类型保存的两个字符串数据,数据为[b' non-cat    b' cat']

    # 查看数据
    index = 30
    plt.imshow(train_set_x_orig[index])
    plt.show()
    print("x="+str(index)+",y="+str(train_set_y[:, index])+",it's a "+classes[np.squeeze(train_set_y[:, index])].decode("UTF-8")+"‘ picture")
    # 使用np.squeeze的目的是压缩维度,【未压缩】train_set_y[:,index]的值为[1] , 【压缩后】np.squeeze(train_set_y[:,index])的值为1
    # 只有压缩后的值才可以进行解码操作

    m_train = train_set_y.shape[1]  # 训练集里图片的数量。
    m_test = test_set_y.shape[1]  # 测试集里图片的数量。
    num_px = train_set_x_orig.shape[1]  # 训练、测试集里面的图片的宽度和高度(均为64x64)。

    print("训练集的数量: m_train = " + str(m_train))
    print("测试集的数量 : m_test = " + str(m_test))
    print("每张图片的宽/高 : num_px = " + str(num_px))
    print("每张图片的大小 : (" + str(num_px) + ", " + str(num_px) + ", 3)")
    print("训练集_图片的维数 : " + str(train_set_x_orig.shape))
    print("训练集_标签的维数 : " + str(train_set_y
### 关于吴恩达机器学习第五周编程作业 吴恩达的机器学习课程第五周编程作业主要涉及神经网络的学习算法(Neural Networks Learning),重点在于反向传播算法的应用以及参数更新的过程。这一部分内容对于理解神经网络的工作原理至关重要。 根据已有的资料,可以参考以下资源获取相关内容: #### 资源链接 - GitHub 上有多个开源项目提供了吴恩达机器学习课程的编程作业解决方案,其中包括第五周的内容[^1]。 - 可以访问仓库 `chicx1229/fluffy-computing-machine` 获取完整的代码和说明文档。 - 此外,在另一份公开资源中也提到了关于第四周至第五周的扩展内容,其中包含了神经网络预测函数的相关实现[^4]。 以下是基于 Python 的简单代码框架用于完成第五周的部分核心功能——即通过反向传播调整权重矩阵 \( \Theta^{(l)} \): ```python import numpy as np def nnCostFunction(nn_params, input_layer_size, hidden_layer_size, num_labels, X, y, lambda_): """ 计算神经网络的成本函数及其梯度。 参数: nn_params (ndarray): 展平后的 Theta 权重矩阵。 input_layer_size (int): 输入层节点数。 hidden_layer_size (int): 隐藏层节点数。 num_labels (int): 输出类别数量。 X (ndarray): 数据集特征矩阵。 y (ndarray): 数据标签。 lambda_ (float): 正则化系数。 返回: J (float): 成本值。 grad (ndarray): 梯度值。 """ # 将展平的 nn_params 还原为 Theta1 和 Theta2 Theta1 = np.reshape(nn_params[:hidden_layer_size * (input_layer_size + 1)], (hidden_layer_size, input_layer_size + 1)) Theta2 = np.reshape(nn_params[hidden_layer_size * (input_layer_size + 1):], (num_labels, hidden_layer_size + 1)) m = X.shape[0] # 前向传播计算成本... a1 = np.hstack((np.ones((m, 1)), X)) # 添加偏置项 z2 = a1 @ Theta1.T a2 = sigmoid(z2) a2 = np.hstack((np.ones((m, 1)), a2)) # 继续添加偏置项 z3 = a2 @ Theta2.T h = sigmoid(z3) # One-hot 编码目标变量 Y = (y[:, None] == np.arange(num_labels)[None, :]).astype(int) # 计算未正则化的代价 J_unregularized = (-Y * np.log(h) - (1 - Y) * np.log(1 - h)).mean() # 加入正则化项 reg_term = (lambda_ / (2 * m)) * ( np.sum(np.square(Theta1[:, 1:])) + np.sum(np.square(Theta2[:, 1:])) ) J = J_unregularized + reg_term # 反向传播求解梯度... delta3 = h - Y delta2 = delta3 @ Theta2[:, 1:] * sigmoidGradient(z2) Delta1 = delta2.T @ a1 Delta2 = delta3.T @ a2 # 应用正则化到梯度上 Theta1_grad = (Delta1 / m).T Theta1_grad[:, 1:] += (lambda_ / m) * Theta1[:, 1:] Theta2_grad = (Delta2 / m).T Theta2_grad[:, 1:] += (lambda_ / m) * Theta2[:, 1:] # 打包梯度返回 grad = np.concatenate([Theta1_grad.ravel(), Theta2_grad.ravel()]) return J, grad def sigmoid(z): """Sigmoid 函数""" return 1 / (1 + np.exp(-z)) def sigmoidGradient(z): """Sigmoid 函数导数""" g = sigmoid(z) * (1 - sigmoid(z)) return g ``` 上述代码实现了神经网络的核心部分,包括前向传播、损失函数计算以及反向传播过程中的梯度求解。 --- ### 注意事项 在下载并运行这些代码时需要注意以下几点: 1. **环境配置**: 确保安装了必要的依赖库,例如 NumPy 和 SciPy。 2. **数据准备**: 使用官方提供的训练数据集进行测试。 3. **调试工具**: 如果遇到问题,可以通过打印中间变量的方式逐步排查错误。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值