【学习笔记】吴恩达老师第一周编程大作业总结

本文介绍了使用神经网络思路实现Logistic回归的过程,包括数据集的预处理、神经网络结构的学习、参数初始化、前向和反向传播、优化算法以及模型整合。通过实例展示了数据的加载、可视化、reshape以及使用sigmoid函数、梯度下降法进行模型训练,最终实现了对猫和非猫图像的分类,并讨论了学习率对模型的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Logistic Regression with a Neural Network mindset

用神经网络的思想来实现Logistic回归

学习目标

  • 构建深度学习算法的基本结构,包括:
  •       初始化参数
  •       计算损失函数和它的梯度
  •       使用优化算法(梯度下降法)
  • 将上述三种函数按照正确的顺序集中在一个主函数中

1. 依赖包

*numpy——python中用于科学计算的库,多用于计算矩阵

*h5py——在Python提供读取HDF5二进制数据格式文件的接口,本次的训练及测试图片集是以HDF5储存的

*matplotlib——Python中著名的绘图库

*PIL——Python Image Library,为Python提供图像处理功能

*scipy——基于NumPy来做高等数学、信号处理、优化、统计和许多其它科学任务的拓展库

为了使用上述依赖包(库),使用如下代码导入:

import numpy as np
import matplotlib.pyplot as plt
import h5py
import scipy
from PIL import Image
from scipy import ndimage
from lr_utils import load_dataset

注意:在Ipython编译器中可以使用%matplotlib inline,而其它编译器中使用该魔发指令会编译报错,需要自己添加plt.show()函数才能显示图片,这在接下来的数据集可视化中用得到。

2. 总览问题集

问题陈述:给定一个数据集(“data.h5”),其中包含:

  • 包含m个已标注数据的训练集,其中若是猫(y=1),不是猫(y=0)
  • 包含m个已标注数据集的测试集,同样分为猫或者非猫
  • 每一幅图的shape为(num_px,num_px,3),其中3代表3通道(RGB)。因此,每一幅图都是正方形的,及长宽相等

使用如下代码读取(载入)数据:

# Loading the data (cat/non-cat)
train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()

这里再训练集和测试集的样本后面加_orig,是因为随后还要对这些数据reshape进行处理,此时它们还是拥有二维结构的矩阵。

可以通过下列代码将数据集中的数据实现可视化:

# Example of a picture
index = 24
plt.imshow(train_set_x_orig[index])
print ("y = " + str(train_set_y[:, index]) + ", it's a '" + classes[np.squeeze(train_set_y[:, index])].decode("utf-8") +  "' picture.")

通过改变index = 后面的数字值,可以查看数据集中不同的图片。

执行结果:


注意:保证数据集中每一个数据的尺寸的统一,将对减少程序中的bug帮助很大。

小练习:

  • 认识到m_train中的样本个数
  • 认识到m_test中的样本个数
  • 认识到num_px的数值,即了解图像的大小(是多少像素*多少像素)

这里老师提示说,我们先前提到的未处理的数据集,即带有orig的数据集,它的尺寸为(m_train,num_px,num_px,3)。我的个人理解就是(训练集的个数,图像高的像素值,图像宽的像素值,3通道)。

使用如下代码,来实现小练习中的任务要求:

### START CODE HERE ### (≈ 3 lines of code)
m_train = train_set_x_orig.shape[0]
m_test = test_set_x_orig.shape[0]
num_px = train_set_x_orig.shape[1]
### END CODE HERE ###

print ("Number of training examples: m_train = " + str(m_train))
print ("Number of testing examples: m_test = " + str(m_test))
print ("Height/Width of each image: num_px = " + str(num_px))
print ("Each image is of size: (" + str(num_px) + ", " + str(num_px) + ", 3)")
print ("train_set_x shape: " + str(train_set_x_orig.shape))
print ("train_set_y shape: " + str(train_set_y.shape))
print ("test_set_x shape: " + str(test_set_x_orig.shape))
print ("test_set_y shape: " + str(test_set_y.shape))

而shape[0]中的0,我的个人理解就是0访问的是shape的参数中第一个的数,1为第二位……以此类推

因此执行结果:

Number of training examples: m_train = 209
Number of testing examples: m_test = 50
Height/Width of each image: num_px = 64
Each image is of size: (64, 64, 3)
train_set_x shape: (209, 64, 64, 3)
train_set_y shape: (1, 209)
test_set_x shape: (50, 64, 64, 3)
test_set_y shape: (1, 50)

也就是说,数据集中,训练集有209副图,测试集有50幅图,每一幅图是64*64的大小(上面可视化的执行结果就可以看出来)。

还记得老师上课说过,我们要将3个叠加在一起的矩阵展开,变成一个一维数组,那么对于其中的一幅图,它将由(64,64,3)的结构展开成(64*64*3,1)的结构。而我们拥有m(209)个训练样本,那么所有的输入将会变为一个12288行,m(209)列的矩阵。而为了实现上述操作,我们使用reshape操作。

小练习:将形状为(num_px,num_px,3)的训练集和数据集展为一维的(num_px*num_px*3,1)的向量。

小窍门:当欲将一个形如(a,b,c,d)的矩阵X展平为一个形如(b*c*d,a)的矩阵,可以使用

X_flatten = X.reshape(X.shape[0], -
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值