吴恩达深度学习第一章第二周编程作业

article/2025/5/19 22:51:31

文章目录

  • 前言
  • 一、题目描述。
  • 二、相关库
  • 三、编程步骤
    • 1.数据预处理
    • 2.模型的封装
    • 3.模型的调用
    • 4.结果展示
  • 总结


前言

  本人处于初学阶段,编程能力有限,代码的编写参考了网上的大神。

一、题目描述。

在这里插入图片描述
  我们需要训练得到一个逻辑回归分类器来对图片进行二分类(是猫和不是猫),通过正向传播和反向传播来对参数进行优化。官方网站给出的题目形式是填空编程,这里我将给出完整的代码,可能和官网上的有些出入,但是大致相同。

二、相关库

	1.numpy:强大的科学计算库,主要用于矩阵的计算2.matplotlib:绘图库,可以绘制损失曲线3.h5py:是与H5文件中存储的数据集进行交互的常用软件包

三、编程步骤

1.数据预处理

lr_utils.py 用于图片数据的读取:

import numpy as np
import h5py
def load_dataset():train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r")train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set featurestrain_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labelstest_dataset = h5py.File('datasets/test_catvnoncat.h5', "r")test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set featurestest_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labelsclasses = np.array(test_dataset["list_classes"][:]) # the list of classestrain_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes

  每张图片的大小为64*64像素,而每个像素点由RGB三原色组成,所以每张图片的数据维度为(64,64,3),所以一张图片需要12288个数据确定。load_dataset  返回值的含义:

train_set_x_orig:训练集图像数据,一共209张,数据维度为(209,64,64,3)
train_set_y_orig:训练集的标签集,维度为(1,209)
test_set_x_orig:测试集图像数据,一共50张,维度为(50,64,64,3)
test_set_y_orig:测试集的标签集,维度为(1,50)
classes : 保存的是以bytes类型保存的两个字符串数据,数据为:[b’non-cat’ b’cat’]

调用load_dataset函数。

train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()

我们可以利用matplotlib绘制其中的图片。

plt.imshow(train_set_x_orig[27])
plt.show()

得到的结果如下:
在这里插入图片描述

  我们知道逻辑回归的输入x一般是一维向量,我们需要对 train_set_x_origtest_set_x_orig 进行处理,从(209,64,64,3) 转换为(12288,209)维度,可以利用numpy库中的reshape()方法完成。numpy的shape通常返回一个元组,比如这里的 train_set_x_orig.shape 返回的元组为(209,64,64,3),所以train_set_x_orig.shape[0] 的值为 209

# 每一张图片是64*64*3(这里的64*64表示像素点个数,3表示每个像素点由RGB三原色构成),将其转换成列向量
train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T  # 得到训练集输入数据,维度为(64*64*3,209)
test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T  # 得到测试集输入数据,维度为(64*64*3,50)

  RGB的取值为0至255,我们需要将数据进行居中和标准化,将数据的每一行除以255。

# RGB的取值为(0,255),需要将数据进行居中和标准化,将数据集的每一行除以255(一般是将每一行数据除以该行数据的平均值)
train_set_x = train_set_x_flatten / 255
test_set_x = test_set_x_flatten / 255

  至此,数据预处理基本完成,将上述操作封装成函数 data_preprocess

def data_preprocess():"""数据预处理:return: train_set_x -训练集(12288,209)train_set_y -训练集标签(1,209)test_set_x -测试集(12288,50)test_set_y -测试集标签(1,50)"""# 获得训练集209条数据和测试集50条数据train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()plt.imshow(train_set_x_orig[27])plt.show()# 每一张图片是64*64*3(这里的64*64表示像素点个数,3表示每个像素点由RGB三原色构成),将其转换成列向量train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T  # 得到训练集输入数据,维度为(64*64*3,209)test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T  # 得到测试集输入数据,维度为(64*64*3,50)# RGB的取值为(0,255),需要将数据进行居中和标准化,将数据集的每一行除以255(一般是将每一行数据除以该行数据的平均值)train_set_x = train_set_x_flatten / 255test_set_x = test_set_x_flatten / 255return train_set_x, train_set_y, test_set_x, test_set_y

2.模型的封装

在这里插入图片描述

  我将逻辑回归封装成类 SimpleLogistic ,主要包括一下几个部分:初始化,sigmoid函数,前向传播和反向传播计算梯度,参数优化,结果预测和主控模型。
初始化:输入向量维度,迭代次数,学习率,权重矩阵和偏移量。

    def __init__(self, dim, learning_rate, num_iterations):"""初始化逻辑回归模型:param dim: 输入向量的维度:param learning_rate: 梯度下降的学习率:param num_iterations: 梯度下降迭代次数"""self.dim = dimself.learning_rate = learning_rateself.num_iterations = num_iterationsself.w = np.zeros(shape=(self.dim, 1))self.b = 0

sigmoid 函数:

 def sigmoid(self, z):""":param z: 任何大小的标量或数组:return: sigmoid(z)"""return 1 / (1 + np.exp(-z))

计算前向传播和反向传播并计算梯度(propagate):

    def propagate(self, X, Y):"""实现前向和后向传播的成本函数及其梯度:param X:矩阵类型为(num_px * num_px * 3,训练数量):param Y:真正的“标签”矢量(如果非猫则为0,如果是猫则为1),矩阵维度为(1,训练数据数量):return:grads -梯度计算结果cost -损失函数的结果"""m = X.shape[1]# 正向传播A = self.sigmoid(np.dot(self.w.T, X) + self.b)cost = (-1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A)))# 反向传播dw = (1 / m) * np.dot(X, (A - Y).T)db = (1 / m) * np.sum(A - Y)assert (dw.shape == self.w.shape)assert (isinstance(db, float) or isinstance(db, int))cost = np.squeeze(cost)assert (cost.shape == ())grads = {"dw": dw,"db": db}return grads, cost

优化参数(optimize):主要根据迭代次数和学习率,进行梯度下降,来对w和b的值进行更新

    def optimize(self, X, Y, print_cost=False):"""通过梯度下降算法来优化w和b:param X:维度为(num_px * num_px * 3,训练数据的数量)的数组。:param Y:真正的“标签”矢量(如果非猫则为0,如果是猫则为1),矩阵维度为(1,训练数据的数量):param print_cost:每一百步打印损失值:return:"""costs = []for i in range(self.num_iterations):grads, cost = self.propagate(X, Y)dw = grads["dw"]db = grads["db"]self.w = self.w - self.learning_rate * dwself.b = self.b - self.learning_rate * dbif i % 100 == 0:costs.append(cost)if print_cost and (i % 100 == 0):print("迭代的次数: %i , 误差值: %f" % (i, cost))grads = {"dw": dw,"db": db}return grads, costs

结果预测(predict):当optimize完成后,我们可以根据优化后的参数来对图片进行分类。

    def predict(self, X):"""使用学习逻辑回归参数logistic (w,b)预测标签是0还是1:param X:维度为(num_px * num_px * 3,训练数据的数量)的数据:return: Y_prediction  - 包含X中所有图片的所有预测【0 | 1】的一个numpy数组(向量)"""m = X.shape[1]Y_prediction = np.zeros((1, m))w = self.w.reshape(X.shape[0], 1)# 预测猫在图片中的概率A = self.sigmoid(np.dot(w.T, X) + self.b)for i in range(A.shape[1]):Y_prediction[0, i] = 1 if A[0, i] > 0.5 else 0assert(A.shape == (1, m))return Y_prediction

主控模型(model):需要一个主控函数来对上述操作进行控制。

    def model(self, X_train, Y_train, X_test, Y_test, print_cost=True):"""构建逻辑回归模型:param X_train:numpy的数组,维度为(num_px * num_px * 3,m_train)的训练集:param Y_train:numpy的数组,维度为(1,m_train)(矢量)的训练标签集:param X_test::param Y_test::param print_cost::return:"""assert (self.w.shape == (self.dim, 1))assert (isinstance(self.b, float) or isinstance(self.b, int))grads, costs = self.optimize(X_train, Y_train, print_cost)  # 模型训练Y_prediction_test = self.predict(X_test)Y_prediction_train = self.predict(X_train)print("训练集准确性:", format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100), "%")print("测试集准确性:", format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100), "%")d = {"costs": costs,"Y_prediction_test": Y_prediction_test,"Y_prediciton_train": Y_prediction_train,"w": self.w,"b": self.b,"learning_rate": self.learning_rate,"num_iterations": self.num_iterations}return d

3.模型的调用

  我们通过 data_preprocess 对数据进行预处理,得到训练集和测试集,将训练集送到 SimpleLogistic 类中进行训练,训练完成后在测试集上进行测试。

if __name__ == '__main__':train_set_x, train_set_y, test_set_x, test_set_y = data_preprocess()dim = train_set_x.shape[0]learning_rate = 0.005num_iterations = 2000logistic = SimpleLogistic(dim=dim, learning_rate=learning_rate, num_iterations=num_iterations)# 初始化模型result = logistic.model(train_set_x, train_set_y, test_set_x, test_set_y)costs = np.squeeze(result['costs'])plt.plot(costs)plt.ylabel('cost')plt.xlabel('iterations (per hundreds)')plt.title("Learning rate =" + str(result["learning_rate"]))plt.show()

4.结果展示

在这里插入图片描述

损失函数曲线

总结

  此次作业大致分为两个步骤:1.数据预处理:读取数据,将其转换成模型能处理的格式,然后将其划分成训练集和测试集。2.模型的搭建:设计sigmoid函数(根据numpy库比较好实现);根据前传播和反向传播计算梯度(propagate);根据迭代次数和学习率,利用propagate模块计算得到的梯度来对参数进行更新(optimize);根据optimize的结果,来对新样本进行预测(predict);主控函数来管理这些操作的进行,让外部仅输入维度(维度其实也可以省略),训练集,测试集,迭代次数和学习率即可得到一个训练好的逻辑回归分类器(model)。
  吴恩达老师在上课时讲过,深度学习涉及到许多复杂的矩阵运算,多使用 assert 来对矩阵的维度进行监督。
  此次代码已经放到百度网盘中,提取码:k4ly。代码不是很完善,请见谅。


http://chatgpt.dhexx.cn/article/SgUNkTsT.shtml

相关文章

吴恩达深度学习之风格迁移

个人的学习笔记,一直更新中,如有错误,评论区见,冲冲冲! 笔记来源:吴恩达深度学习 4.6 什么是神经风格转换?_哔哩哔哩_bilibili 1 输入输出 风格迁移输入:内容(Conten…

吴恩达深度学习作业之deepleraning_L1W2_h1

#吴恩达《深度学习》L1W2作业1 知识点:numpy入门,函数向量化实现做完这个作业,你能学会:用ipython notebook 用numpy,包括函数调用及向量矩阵运算 理解“广播”的概念 向量化代码#我们很少在深度学习中使用“math”库。…

吴恩达深度学习编程作业报错解决方法汇总

概述及资源分享 大二结束后的暑假,学习吴恩达深度学习([双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili)的课程,在做编程作业的时候总是遇到一些报错,尤其是导入所需要的库的时候会报一些No model。。。的…

旧版吴恩达深度学习环境搭建(anaconda+tensorflow+jupyter notebook)(呕心沥血诚意之作)

本人在参考多位博主的文章后,多次尝试才成功配置了tensorflow1.2.1的环境(课程建议Python3.6tensorflow1.2.1Keras2.0.7)。在此之前,曾经尝试用tensorflow2.x降级的方法(import tensorflow.compat.v1 as tf&#xff09…

《吴恩达深度学习》编程作业-第二周

目录 1.题目:基于神经网络思维模式的逻辑回归 2.声明 3.知识回顾 4.Python编程分析 4.1.导入需要用的库 4.2.数据处理 4.2.1.读取数据(包括训练集和测试集) 4.2.2.取出数据(包括训练集和测试集,还有标签的值&a…

吴恩达 深度学习 2021版 作业

练习 神经网络与深度学习神经网络基础Numpy基础1-使用numpy构建基本函数 神经网络与深度学习 神经网络基础 Numpy基础 学习目标: 使用numpy,包括函数调用及向量矩阵运算广播向量化代码 1-使用numpy构建基本函数 1.1- sigmoid function和np.exp&…

吴恩达深度学习

最近在学习吴恩达老师的深度学习,边学边随手记一些东西,留个简单的笔记,以便日后复习。 第一周 结构化数据:每个特征都有清晰的定义 非结构化数据:音频、图像、文本等 大规模的神经网络大规模的带标签数据 第一周习题…

吴恩达《深度学习专项》笔记(十二):目标检测与语义分割简介 (YOLO, U-Net)

这节课中,我们要学习计算机视觉中最重要的任务之一——目标检测任务。我们会先认识目标定位和关键点检测这两个比较简单的任务,慢慢过度到目标检测任务。之后,我们会详细学习目标检测的经典算法YOLO。最后,我们会稍微认识一下语义…

吴恩达:28张图全解深度学习知识

吴恩达在推特上展示了一份由 TessFerrandez 完成的深度学习专项课程信息图,这套信息图优美地记录了深度学习课程的知识与亮点。因此它不仅仅适合初学者了解深度学习,还适合机器学习从业者和研究者复习基本概念。喜欢记得关注、收藏、点赞。 这不仅仅是一…

吴恩达深度学习深度学习概述以及优化

深度学习概述及优化 1、深度学习概述2、神经网络基础之逻辑回归3、深层神经网络4、深度学习实用层面4.1 训练集、验证集、测试集4.2 偏差、方差4.3 L1、L2正则化4.4 归一化处理4.5 Dropout4.6 其他正则化方法4.7 梯度消失和爆炸 1、深度学习概述 在之前的吴恩达机器学习课程中…

深度学习-吴恩达:一、神经网络和深度学习

文章目录 1、what is a Neural Network?(什么是神经网络)2、Supervised Learning with Neural Networks (监督学习)3、为什么深度学习会兴起?第一周测验测验题答案 1、what is a Neural Network?(什么是神…

IOS开发视频教程《保卫萝卜》-任亮-专题视频课程

IOS开发视频教程《保卫萝卜》—3411人已学习 课程介绍 《保卫萝卜CarrotFantasy》是一款由开发商“凯罗天下”开发的超萌塔防小。14种防御塔保卫萝卜战怪兽。保卫萝卜是一款制作精美的超萌塔防游戏,游戏含有丰富的关卡和主题包,拥有各自风格特色…

ios游戏开发 Sprite Kit教程:初学者 1

注:本文译自Sprite Kit Tutorial for Beginners 目录 Sprite Kit的优点和缺点Sprite Kit vs Cocos2D-iPhone vs Cocos2D-X vs UnityHello, Sprite Kit!横屏显示移动怪兽发射炮弹碰撞检测: 概述碰撞检测: 实现收尾何去何从? 在iOS 7中内置了一个新的Sprite Kit框架…

HTML5游戏开发高级教程 | Lynda教程 中文字幕

HTML5游戏开发高级教程 | Lynda教程 中文字幕 Advanced HTML5 Game Development 课程ID: 597988 时长: 2.3小时 所属类别:Html 全部游戏开发课程 了解如何使用HTML5创建交互式,动态和丰富多彩的游戏 在本课程中,学习如何充分利用所有HTML5功能来创建…

ios游戏开发 Sprite Kit教程:初学者 2

注:本文译自Sprite Kit Tutorial for Beginners 目录 Sprite Kit的优点和缺点Sprite Kit vs Cocos2D-iPhone vs Cocos2D-X vs UnityHello, Sprite Kit!横屏显示移动怪兽发射炮弹碰撞检测: 概述碰撞检测: 实现收尾何去何从? 横屏显示 首先,在Project Na…

【游戏开发教程】Unity iOS平台接入微信SDK,实现微信登录等功能(教程 | 流程讲解)

文章目录 一、前言二、流程1、申请开发者账号2、创建应用3、下载SDK4、导入到Unity中5、编写Objective-C代码5.1、CustomAppController.mm5.2、WXApiManager.h5.3、WXApiManager.mm5.4、注册回调对象5.5、封装初始化接口5.6、封装登录接口5.7、其他接口封装 6、XCodeAPI7、关于…

iOS开发知识概览

1、学习ios开发的知识概览,经常会认为ios开发会学那些知识,如何把断断续续的知识连接起来, 这就让你有了全局的了解,如何去计划和安排自己的学习计划,有了全局的知识体系。 原文来自:https://github.com/sh…

IOS 开发之逆向分析

在逆向过程中很多时候需要分析 APP 和 Web 端数据交互的内容那么最简单的方式即是抓包网络分析,而使用 Charles、Tcpdump 也是逆袭分析最基本的手段。本文以 Charles 为例来介绍网络相关的内容。 Charles 是在 Mac 下常用的网络封包截取工具,在做 移动开…

ios游戏开发

知识系统 英文教程网站 http://www.csdn.net/article/2012-12-20/2813035-game-dev-guide 开发类库 http://www.csdn.net/article/2012-11-07/2811587-pop-ios-dev-library

芒果iOS开发之Swift教程01-Swift基础

【主要内容】 1.关于Swift 2.Hello World 3.常量和变量 4.类型标注 5.常量和变量的命名 6. 输出常量和变量 7.注释 8.分号 一、关于Swift 苹果在2014年WWDC(苹果开发者大会)发布了Swift,用于编写iOS,Mac OS X和watchOS…