吴恩达深度学习课程第二章第三周编程作业(pytorch实现)

article/2025/5/19 20:43:06

文章目录

  • 声明
  • 一、问题描述
  • 二、编程实现
    • 1.加载数据集
    • 2.使用mini-batch
    • 3.利用pytorch搭建神经网络
      • 3.1 利用torch.nn简单封装模型
      • 3.2 定义优化算法和损失函数
    • 4.整体代码


声明

  本博客只是记录一下本人在深度学习过程中的学习笔记和编程经验,大部分代码是参考了【中文】【吴恩达课后编程作业】Course 2 - 改善深层神经网络 - 第三周作业这篇博客,对其代码实现了复现,但是原博客中代码使用的是tensorflow,而我在学习生活中主要用到的是pytorch,所以此次作业我使用pytorch框架来完成。因此,代码或文字表述中还存在一些问题,请见谅,之前的博客也是主要参考这个大佬。下文中的完整代码已经上传到百度网盘中,提取码:gp3h。
  所以开始作业前,请大家安装好pytorch的环境,我代码是在服务器上利用gpu加速运行的,但是cpu版本的pytorch也能运行,只是速度会比较慢。

一、问题描述

  这周作业的任务是利用softmax层完成一个多分类问题,利用神经网络识别图片中手指比划的数字,大致如下:

在这里插入图片描述

二、编程实现

1.加载数据集

  用matplotlib绘制数据集中的数据,可以查看图片:

from tf_utils import load_dataset
import matplotlib.pyplot as pltX_train_orig , Y_train_orig , X_test_orig , Y_test_orig , classes = load_dataset()index = 12
plt.imshow(X_train_orig[index])
plt.show()

图片如下:
在这里插入图片描述

  通过上述代码,我们得到的X_train_orig的维度为(1080,64,64,3),在之前的作业中我们知道,(64,64,3)表示的是一张图片的信息,而1080表示训练集中的样本数量。

def data_processing():X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()X_train_flatten = X_train_orig.reshape(X_train_orig.shape[0], -1).T / 255X_test_flatten = X_test_orig.reshape(X_test_orig.shape[0], -1).T / 255return X_train_flatten, Y_train_orig, X_test_flatten, Y_test_orig, classes

  数据处理后训练集中的维度变为(12288,1080),其中12288=64x64x3,而标签集的维度在下文中细说。

2.使用mini-batch

  在之前的编程作业中已经对mini-batch的使用有了较为全面的了解,而且mini-batch并不是本次作业的重点,在这里就贴出划分mini-batch的代码,不再做进一步解释:

def random_mini_batches(X, Y, mini_batch_size=64, seed=0):"""Creates a list of random minibatches from (X, Y)Arguments:X -- input data, of shape (input size, number of examples)Y -- true "label" vector (containing 0 if cat, 1 if non-cat), of shape (1, number of examples)mini_batch_size - size of the mini-batches, integerseed -- this is only for the purpose of grading, so that you're "random minibatches are the same as ours.Returns:mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y)"""m = X.shape[1]  # number of training examplesmini_batches = []np.random.seed(seed)# Step 1: Shuffle (X, Y)permutation = list(np.random.permutation(m))shuffled_X = X[:, permutation]shuffled_Y = Y[:, permutation].reshape((Y.shape[0], m))# Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.num_complete_minibatches = math.floor(m / mini_batch_size)  # number of mini batches of size mini_batch_size in your partitionningfor k in range(0, num_complete_minibatches):mini_batch_X = shuffled_X[:, k * mini_batch_size: k * mini_batch_size + mini_batch_size]mini_batch_Y = shuffled_Y[:, k * mini_batch_size: k * mini_batch_size + mini_batch_size]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)# Handling the end case (last mini-batch < mini_batch_size)if m % mini_batch_size != 0:mini_batch_X = shuffled_X[:, num_complete_minibatches * mini_batch_size: m]mini_batch_Y = shuffled_Y[:, num_complete_minibatches * mini_batch_size: m]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)return mini_batches

3.利用pytorch搭建神经网络

  我们需要搭建的神经网络结构为:LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SOFTMAX。可以看出,与之前相比只是把输出层的激活函数换成softmax函数,随之而变的是输出层的神经元个数,因为是六分类,对应的神经元个数为6。

3.1 利用torch.nn简单封装模型

class Model(torch.nn.Module):def __init__(self, N_in, h1, h2, D_out):super(Model, self).__init__()self.linear1 = torch.nn.Linear(N_in, h1)self.relu1 = torch.nn.ReLU()self.linear2 = torch.nn.Linear(h1, h2)self.relu2 = torch.nn.ReLU()self.linear3 = torch.nn.Linear(h2, D_out)self.model = torch.nn.Sequential(self.linear1, self.relu1, self.linear2, self.relu2, self.linear3)def forward(self, x):return self.model(x)

  根据题目要求定义需要的计算层,并作为参数依次传入 Sequential 函数内,传入顺序决定了计算顺序,千万不能弄错。

  定义一个前向传播的函数,可以看出,利用pytorch做前向传播极大的减少了代码量。

3.2 定义优化算法和损失函数

optimizer = torch.optim.Adam(m.model.parameters(), lr=learning_rate)
loss_fn = torch.nn.CrossEntropyLoss()

  优化算法这里采用的是Adam优化算法,直接使用torch.optim包里面的函数即可,记住需要把神经网络的参数还有定义的学习率传入到函数里面。
  损失函数这里使用的是交叉熵函数,关于交叉熵背后的数学原理相信大家已经在视频中有了大致了解,在这里就不再做过多解释,但是使用pytorch封装好的交叉熵函数时需要注意参数的传入。
  通过前向传播,我们得到输出层的结果为(n,6),这里的n表示的时输入的样本数量,而每一列的6个数据表示的是样本属于六个类别的概率,这应该很好理解。
  计算损失时,我们需要将预测标签值y_pred和实际标签值y传入损失函数中,y_pred的维度为(n,6),而y的维度为(n,),没错,我们要将样本的实际标签值设置成1维,交叉熵函数会在内部将y转换为one-hot形式,y的维度会变成(n,6)。而在tensorflow框架中,损失函数不会帮我们完成one-hot的转换,我们要自己完成。
  还有一点需要指出,CrossEntropyLoss 在内部完成了softmax的功能,所以不需要在前向传播的过程中定义softmax计算层。

4.整体代码

import torchnum = torch.cuda.device_count()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")from tf_utils import load_dataset, random_mini_batches, convert_to_one_hot
from model import Modeldef data_processing():X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()X_train_flatten = X_train_orig.reshape(X_train_orig.shape[0], -1).T / 255X_test_flatten = X_test_orig.reshape(X_test_orig.shape[0], -1).T / 255return X_train_flatten, Y_train_orig, X_test_flatten, Y_test_orig, classesif __name__ == "__main__":X_train_flatten, Y_train, X_test_flatten, Y_test, classes = data_processing()X_train_flatten = torch.from_numpy(X_train_flatten).to(torch.float32).to(device)Y_train = torch.from_numpy(Y_train).to(torch.float32).to(device)X_test_flatten = torch.from_numpy(X_test_flatten).to(torch.float32).to(device)Y_test = torch.from_numpy(Y_test).to(torch.float32).to(device)D_in, h1, h2, D_out = 12288, 25, 12, 6m = Model(D_in, h1, h2, D_out)m.to(device)epoch_num = 1500learning_rate = 0.0001minibatch_size = 32seed = 3costs = []optimizer = torch.optim.Adam(m.model.parameters(), lr=learning_rate)loss_fn = torch.nn.CrossEntropyLoss()for epoch in range(epoch_num):epoch_cost = 0num_minibatches = int(X_train_flatten.size()[1] / minibatch_size)minibatches = random_mini_batches(X_train_flatten, Y_train, minibatch_size, seed)for minibatch in minibatches:(minibatch_X, minibatch_Y) = minibatchy_pred = m.forward(minibatch_X.T)y = minibatch_Y.Ty = y.view(-1)loss = loss_fn(y_pred, y.long())epoch_cost = epoch_cost + loss.item()optimizer.zero_grad()loss.backward()optimizer.step()epoch_cost = epoch_cost / (num_minibatches + 1)if epoch % 5 == 0:costs.append(epoch_cost)# 是否打印:if epoch % 100 == 0:print("epoch = " + str(epoch) + "    epoch_cost = " + str(epoch_cost))

  损失函数计算结果:

epoch = 0    epoch_cost = 1.8013256788253784
epoch = 100    epoch_cost = 0.8971561684327967
epoch = 200    epoch_cost = 0.6031410886960871
epoch = 300    epoch_cost = 0.396172211450689
epoch = 400    epoch_cost = 0.2640543882461155
epoch = 500    epoch_cost = 0.17116783581235828
epoch = 600    epoch_cost = 0.10572761395836577
epoch = 700    epoch_cost = 0.060585571726893675
epoch = 800    epoch_cost = 0.03220567786518265
epoch = 900    epoch_cost = 0.01613416599438471
epoch = 1000    epoch_cost = 0.007416377563084311
epoch = 1100    epoch_cost = 0.0030659845283748034
epoch = 1200    epoch_cost = 0.0027029767036711905
epoch = 1300    epoch_cost = 0.0013640667637125315
epoch = 1400    epoch_cost = 0.0005838543190346921

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

相关文章

吴恩达深度学习L4W4人脸识别

1、One-shot learning 人脸识别往往每个人只有一张照片&#xff0c;因此不应该用卷积神经网络配合softmax训练。 应该选择学习 Similarity 函数。详细地说&#xff0c;你想要神经网络学习这样一个用&#x1d451;表示的函数&#xff0c;&#x1d451;(&#x1d456;&#x1d45…

吴恩达深度学习Deep Learning课程笔记

1.1 前言 课程安排&#xff1a; 1.神经网络和深度学习 内容&#xff1a;神经网络的基础&#xff0c;如何建立神经网络、深度神经网络、以及如何在数据时训练它们 2.提升深度神经网络 内容&#xff1a;深度学习方面的实践&#xff0c;严密地构建神经网络以及提升其表现&…

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

文章目录 前言一、题目描述。二、相关库三、编程步骤1.数据预处理2.模型的封装3.模型的调用4.结果展示 总结 前言 本人处于初学阶段&#xff0c;编程能力有限&#xff0c;代码的编写参考了网上的大神。 一、题目描述。 我们需要训练得到一个逻辑回归分类器来对图片进行二分类&…

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

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

吴恩达深度学习作业之deepleraning_L1W2_h1

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

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

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

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

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

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

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

吴恩达 深度学习 2021版 作业

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

吴恩达深度学习

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

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

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

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

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

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

深度学习概述及优化 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?&#xff08;什么是神经网络&#xff09;2、Supervised Learning with Neural Networks &#xff08;监督学习&#xff09;3、为什么深度学习会兴起&#xff1f;第一周测验测验题答案 1、what is a Neural Network?&#xff08;什么是神…

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

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

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

注&#xff1a;本文译自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创建交互式&#xff0c;动态和丰富多彩的游戏 在本课程中&#xff0c;学习如何充分利用所有HTML5功能来创建…

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

注&#xff1a;本文译自Sprite Kit Tutorial for Beginners 目录 Sprite Kit的优点和缺点Sprite Kit vs Cocos2D-iPhone vs Cocos2D-X vs UnityHello, Sprite Kit!横屏显示移动怪兽发射炮弹碰撞检测: 概述碰撞检测: 实现收尾何去何从? 横屏显示 首先&#xff0c;在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开发的知识概览&#xff0c;经常会认为ios开发会学那些知识&#xff0c;如何把断断续续的知识连接起来&#xff0c; 这就让你有了全局的了解&#xff0c;如何去计划和安排自己的学习计划&#xff0c;有了全局的知识体系。 原文来自&#xff1a;https://github.com/sh…