分享3个深度学习练手的小案例

news2024/12/23 9:20:38

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

前言

问题一

问题二

问题三 


前言

        最近有粉丝找到我问了三个关于深度学习的问题,也算是小作业吧,做完之后我便写下这篇文章分享给大家,适合初学或有一定基础到小伙伴练手,我的答案仅供参考学习,如有疑问或建议欢迎提出!

问题一

请设计一个多层感知机(mlp)网络。

1. 该网络执行如下操作:

    - 将输入32×32的图像拉伸为1×1024;

    - 将拉伸后的数据传入第一个隐藏层,该隐藏层为全连接层,包含2048个隐藏单元,并使用Sigmoid激活函数;

    - 将第一个隐藏层的输出传入第二个隐藏层,第二个隐藏层为全连接层,包含512个隐藏单元,使用ReLU激活函数;

    - 将第二个隐藏层的输出传入最后一层,最后一层也为全连接层,输出20维特征,不使用激活函数。

2. 该网络的全连接层权重初始化方案为:全连接层权重服从[0,1]区间上的均匀分布(uniform); 全连接层偏差为常值0.

最终输出要求:

# 代码块的输出需与下面结果保持一致:
"""
Flatten output shape: 	 torch.Size([1, 1024])
Linear output shape: 	 torch.Size([1, 2048])
	 Linear weight's mean: 	 tensor(0.8631)
	 Linear bias's mean: 	 tensor(0.)
Sigmoid output shape: 	 torch.Size([1, 2048])
Linear output shape: 	 torch.Size([1, 512])
	 Linear weight's mean: 	 tensor(0.0675)
	 Linear bias's mean: 	 tensor(0.)
ReLU output shape: 	 torch.Size([1, 512])
Linear output shape: 	 torch.Size([1, 20])
	 Linear weight's mean: 	 tensor(0.2539)
	 Linear bias's mean: 	 tensor(0.)
"""

 参考答案:

# 导入需要的torch及相关库
import torch
from torch import nn
import torch.nn.functional as F

# 打印每一层大小信息函数 print_layer_info()
def print_layer_info(net,X):
    for layer in net:
        X = layer(X)
        print(layer.__class__.__name__,'output shape: \t',X.shape)
        if type(layer) == nn.Linear:
            print('\t',layer.__class__.__name__,'weight\'s mean: \t',torch.mean(layer.weight[0][0].data))
            print('\t',layer.__class__.__name__,'bias\'s mean: \t',torch.mean(layer.bias[0].data))

# 你设计的网络,网络名为net
net = nn.Sequential(
        # 将输入32×32的图像拉伸为1×1024将拉伸后的数据传入第一个隐藏层,该隐藏层为全连接层,包含2048个隐藏单元,并使用Sigmoid激活函数;
        nn.Flatten(),
        nn.Linear(in_features=1024, out_features=2048),
        nn.Sigmoid(),
        # 将第一个隐藏层的输出传入第二个隐藏层,第二个隐藏层为全连接层,包含512个隐藏单元,使用ReLU激活函数
        nn.Linear(in_features=2048, out_features=512),
        nn.ReLU(),
        # 将第二个隐藏层的输出传入最后一层,最后一层也为全连接层,输出20维特征,不使用激活函数
        nn.Linear(in_features=512, out_features=20)
)
# 在这里按要求将网络权重初始化
for layer in net:
    if isinstance(layer, nn.Linear):
        nn.init.uniform_(layer.weight, 0, 1)
        nn.init.constant_(layer.bias, 0)

# 测试网络net是否按要求定义
X = torch.rand(size=(1, 1, 32, 32), dtype=torch.float32)
print_layer_info(net,X)

输出结果:

Flatten output shape: 	 torch.Size([1, 1024])
Linear output shape: 	 torch.Size([1, 2048])
	 Linear weight's mean: 	 tensor(0.8667)
	 Linear bias's mean: 	 tensor(0.)
Sigmoid output shape: 	 torch.Size([1, 2048])
Linear output shape: 	 torch.Size([1, 512])
	 Linear weight's mean: 	 tensor(0.9883)
	 Linear bias's mean: 	 tensor(0.)
ReLU output shape: 	 torch.Size([1, 512])
Linear output shape: 	 torch.Size([1, 20])
	 Linear weight's mean: 	 tensor(0.7355)
	 Linear bias's mean: 	 tensor(0.)

注:由于X是随机生成的,所以有些数值不可能完全跟要求一模一样。

问题二

请设计一个卷积神经网络(CNN)。

1. 该网络执行如下操作:

    - 第一层: 使用96个大小为11×11、步长为4、填充为2的卷积核,将输入3×224×224的图像输出为96×55×55的图像, 使用ReLU为激活函数;

    - 第二层: 大小为3×3、 步长为2、无填充的极大值池化层,将96×55×55的图像输出为96×27×27;

    - 第三层: 使用256个大小为5×5、步长为1、填充为2的卷积核,将输入96×27×27的图像输出为256×27×27的图像, 使用ReLU为激活函数;

    - 第四层: 大小为3×3、步长为2、无填充的极大值池化层,将256×27×27的图像输出为256×13×13;

    - 第五层: 使用384个大小为3×3、步长为1、填充为1的卷积核,将输入256×13×13的图像输出为384×13×13的图像, 使用ReLU为激活函数;

    - 第六层: 使用256个大小为3×3、步长为1、填充为1的卷积核,将输入384×13×13的图像输出为256×13×13的图像, 使用ReLU为激活函数;

    - 第七层: 大小为3×3、步长为1、填充为1的极大值池化层,将256×13×13的图像输出为256×13×13;

    - 第八层: 将上一层的输入拉伸为行向量;

    - 第九层: 全连接层:将上一层拉伸后的向量变成4096维向量;使用ReLU为激活函数;

    - 第十层: 全连接层:将上一层输出得向量变成1000维向量;

最后输出要求:

# 代码块的输出需与下面结果保持一致:
"""
Conv2d output shape: 	 torch.Size([1, 96, 55, 55])
ReLU output shape: 	 torch.Size([1, 96, 55, 55])
MaxPool2d output shape: 	 torch.Size([1, 96, 27, 27])
Conv2d output shape: 	 torch.Size([1, 256, 27, 27])
ReLU output shape: 	 torch.Size([1, 256, 27, 27])
MaxPool2d output shape: 	 torch.Size([1, 256, 13, 13])
Conv2d output shape: 	 torch.Size([1, 384, 13, 13])
ReLU output shape: 	 torch.Size([1, 384, 13, 13])
Conv2d output shape: 	 torch.Size([1, 256, 13, 13])
ReLU output shape: 	 torch.Size([1, 256, 13, 13])
MaxPool2d output shape: 	 torch.Size([1, 256, 13, 13])
Flatten output shape: 	 torch.Size([1, 43264])
Linear output shape: 	 torch.Size([1, 4096])
ReLU output shape: 	 torch.Size([1, 4096])
Linear output shape: 	 torch.Size([1, 1000])
"""

 参考答案:

import torch
import torch.nn as nn

# 你设计的网络,网络名为net
net = nn.Sequential(
    # layer 1
    nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4, padding=2),
    nn.ReLU(),
    # layer 2
    nn.MaxPool2d(kernel_size=3, stride=2),
    # layer 3
    nn.Conv2d(in_channels=96, out_channels=256, kernel_size=5, stride=1, padding=2),
    nn.ReLU(),
    # layer 4
    nn.MaxPool2d(kernel_size=3, stride=2),
    # layer 5
    nn.Conv2d(in_channels=256, out_channels=384, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    # layer 6
    nn.Conv2d(in_channels=384, out_channels=256, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    # layer 7
    nn.MaxPool2d(kernel_size=3, stride=2),
    # layer 8
    nn.Flatten(),
    # layer 9
    nn.Linear(in_features=9216, out_features=4096),
    nn.ReLU(),
    # layer 10
    nn.Linear(in_features=4096, out_features=1000)
)

# 检查设计的网络net是否符合要求:
X = torch.randn(1, 3, 224, 224)
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape: \t',X.shape)

问题三 

nn.MaxPool2d()函数通过对图像进行最大值下采样,可以将图像尺寸便小。与之相对应得nn.MaxUnpool2d()函数可以实现对图像进行上采样,将图像尺寸变大。

请查询nn.MaxUnpool2d()函数的使用手册,并设计一个先降维后升维的卷积神经网络(u-net)。

1. 该网络执行如下 **降维** 操作:

    - 第一层: 使用8个大小为3×3、步长为1、填充为1的卷积核,将输入1×224×224的图像输出为8×224×224的图像, 使用ReLU为激活函数;

    - 第二层: 大小为2×2、 步长为2、无填充的极大值池化层,将8×224×224的图像输出为8×112×112;

    - 第三层: 使用16个大小为3×3、步长为1、填充为1的卷积核,将输入8×112×112的图像输出为16×112×112的图像, 使用ReLU为激活函数;

    - 第四层: 大小为2×2、步长为2、无填充的极大值池化层,将16×112×112的图像输出为16×56×56;

    - 第五层: 使用32个大小为3×3、步长为1、填充为1的卷积核,将输入16×56×56的图像输出为32×56×56的图像, 使用ReLU为激活函数;

    - 第六层: 大小为2×2、步长为2、填充为1的极大值池化层,将32×56×56的图像输出为32×28×28;

   

2. 该网络接着执行如下 **升维** 操作:

    - 第七层: 大小为2×2、步长为2、填充为1的**反极大值池化层**,将32×28×28的图像输出为32×56×56;

    - 第八层: 使用16个大小为3×3、步长为1、填充为1的卷积核,将输入32×56×56的图像输出为16×56×56的图像, 使用ReLU为激活函数;

    - 第九层: 大小为2×2、步长为2、填充为1的**反极大值池化层**,将16×56×56的图像输出为16×112×112;

    - 第十层: 使用8个大小为3×3、步长为1、填充为1的卷积核,将输入16×112×112的图像输出为8×112×112的图像, 使用ReLU为激活函数;

    - 第十一层: 大小为2×2、步长为2、填充为1的**反极大值池化层**,将8×112×112的图像输出为8×224×224;

    - 第十二层: 使用1个大小为3×3、步长为1、填充为1的卷积核,将输入8×224×224的图像输出为1×224×224的图像, 使用ReLU为激活函数;

最终输出要求:

# 代码块的输出需与下面结果保持一致:
"""
降维过程:
Conv2d output shape: 	 torch.Size([1, 8, 224, 224])
ReLU output shape: 	 torch.Size([1, 8, 224, 224])
MaxPool2d_Indices output shape: 	 torch.Size([1, 8, 112, 112])
Conv2d output shape: 	 torch.Size([1, 16, 112, 112])
ReLU output shape: 	 torch.Size([1, 16, 112, 112])
MaxPool2d_Indices output shape: 	 torch.Size([1, 16, 56, 56])
Conv2d output shape: 	 torch.Size([1, 32, 56, 56])
ReLU output shape: 	 torch.Size([1, 32, 56, 56])
MaxPool2d_Indices output shape: 	 torch.Size([1, 32, 28, 28])

升维过程:
MaxUnpool2d_Indices output shape: 	 torch.Size([1, 32, 56, 56])
Conv2d output shape: 	 torch.Size([1, 16, 56, 56])
ReLU output shape: 	 torch.Size([1, 16, 56, 56])
MaxUnpool2d_Indices output shape: 	 torch.Size([1, 16, 112, 112])
Conv2d output shape: 	 torch.Size([1, 8, 112, 112])
ReLU output shape: 	 torch.Size([1, 8, 112, 112])
MaxUnpool2d_Indices output shape: 	 torch.Size([1, 8, 224, 224])
Conv2d output shape: 	 torch.Size([1, 1, 224, 224])
ReLU output shape: 	 torch.Size([1, 1, 224, 224])
"""

 参考答案:

import torch
import torch.nn as nn

# 定义down_net按要求实现图像卷积和下采样
down_net = nn.Sequential(
    nn.Conv2d(1, 8, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(8, 16, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2)
)

# 定义up_net按要求实现图像上采样和卷积
up_net = nn.Sequential(
    nn.ConvTranspose2d(32, 32, kernel_size=2, stride=2),
    nn.Conv2d(32, 16, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.ConvTranspose2d(16, 16, kernel_size=2, stride=2),
    nn.Conv2d(16, 8, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.ConvTranspose2d(8, 8, kernel_size=2, stride=2),
    nn.Conv2d(8, 1, kernel_size=3, stride=1, padding=1),
    nn.ReLU()
)

# 测试网络down_net是否符合按要求将图像进行下采样:
X = torch.randn(1, 1, 224, 224) #测试输入数据
print('降维过程:')
for layer in down_net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape: \t',X.shape)

# 测试网络up_net是否按要求将图像进行上采样:
print('升维过程:')
for layer in up_net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape: \t',X.shape)

输出结果:

降维过程:
Conv2d output shape: 	 torch.Size([1, 8, 224, 224])
ReLU output shape: 	 torch.Size([1, 8, 224, 224])
MaxPool2d output shape: 	 torch.Size([1, 8, 112, 112])
Conv2d output shape: 	 torch.Size([1, 16, 112, 112])
ReLU output shape: 	 torch.Size([1, 16, 112, 112])
MaxPool2d output shape: 	 torch.Size([1, 16, 56, 56])
Conv2d output shape: 	 torch.Size([1, 32, 56, 56])
ReLU output shape: 	 torch.Size([1, 32, 56, 56])
MaxPool2d output shape: 	 torch.Size([1, 32, 28, 28])
升维过程:
ConvTranspose2d output shape: 	 torch.Size([1, 32, 56, 56])
Conv2d output shape: 	 torch.Size([1, 16, 56, 56])
ReLU output shape: 	 torch.Size([1, 16, 56, 56])
ConvTranspose2d output shape: 	 torch.Size([1, 16, 112, 112])
Conv2d output shape: 	 torch.Size([1, 8, 112, 112])
ReLU output shape: 	 torch.Size([1, 8, 112, 112])
ConvTranspose2d output shape: 	 torch.Size([1, 8, 224, 224])
Conv2d output shape: 	 torch.Size([1, 1, 224, 224])
ReLU output shape: 	 torch.Size([1, 1, 224, 224])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/542849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0ctf_2017_babyheap-fastbin_dup_into_stack

参考: [1]https://uaf.io/exploitation/2017/03/19/0ctf-Quals-2017-BabyHeap2017.html [2]https://blog.csdn.net/qq_43935969/article/details/115877748 [3]https://bbs.kanxue.com/thread-223461.htm 题目下载参考[1] 说明下如何调试堆,在payload中…

chatgpt赋能Python-python3_7如何下载

Python3.7如何下载?详细步骤分享! Python是一门当今最热门、最常用、最易学的编程语言之一,且拥有庞大的社区和强大的库支持。在这篇文章中,我们将会详细介绍如何下载Python3.7版本,让大家能够轻松上手Python编程。 …

代码随想录训练营Day44| 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

目录 学习目标 学习内容 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 学习目标 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 学习内容 完全背包 problems/背包问题理论基础完全背包.md programmercarl/leetcode-master(代码随想录出品) - Git…

chatgpt赋能Python-python3_5怎么打开

Python 3.5怎么打开?教你几种方法 Python是目前非常流行的一种编程语言,几乎在所有行业都得到了广泛的应用。Python非常容易上手,且有强大的数据处理和科学计算能力。现在我们来说一下,如何在您的计算机上打开Python 3.5。 方法…

万劫不复之地-云原生可观测性的几大误区

传统监控厂商正把可观测性引入万劫不复之地 可观测性是当前讨论非常多的话题,这个理念由来已久,却在最近开始流行。 在20世纪60年代,该理念首次由Rudolf E. Kalman在其论文中提出,论文题目是《on a general theory of control s…

自然语言处理基础

以下所有内容来自《自然语言处理 基于预训练模型的方法》 1. 文本的表示 利用计算机对自然语言进行处理,首先要解决语言在计算机内部的存储和计算问题。使用字符串表示计算文本的语义信息的时候,往往使用基于规则的方法。如:判断一个句子编…

一文深度解读机器学习模型的评估方法

我们训练学习好的模型,通过客观地评估模型性能,才能更好实际运用决策。模型评估主要有:预测误差情况、拟合程度、模型稳定性等方面。还有一些场景对于模型预测速度(吞吐量)、计算资源耗用量、可解释性等也会有要求&…

chatgpt赋能Python-python3_8怎么降版本

Python 3.8如何降级版本 在本文中,我们将介绍如何将Python 3.8降级到旧的Python版本。这在一些情况下是有必要的,例如某些软件或库并不支持Python 3.8。Python版本降级不仅有用,还可以帮助您控制您的系统上的软件版本,以确保您的…

网络通信—路由交换协议之TCP协议

目录 一、tcp协议 二、通信消息类型 三、准备阶段(三次握手) 准备阶段要干什么? 有什么特点? 准备阶段的核心? (1)准备阶段的数据传输单位 (2)三次握手的过程 1…

Linux之基础开发工具

文章目录 前言一、yum(软件包管理器)1.什么是软件包?2.下载软件包1. 安装软件之前需要将软件的安装包下载下来2. 软件包并不在我们的本地电脑,那么软件包在哪里呢?3. 那么问题来了,我们的电脑如何得知要去哪…

npm 配置双因素身份验证

目录 1、关于双因素身份验证 2、NPM上的双因素身份验证 2.1 授权和写入 2.2 仅限授权 3、先决条件 4、从网站配置2FA 4.1 启用2FA 4.2 为写入禁用2FA 4.3 禁用2FA 5、从命令行配置2FA 5.1 从命令行启用2FA 5.2 从命令行发送一次性密码 5.3 从命令行删除2FA 6、配…

chatgpt赋能Python-python3_8怎么安装库

Python 3.8怎么安装库 - 一个简单易懂的指南 如果你正在学习Python编程,或者想要在你的项目中使用Python 3.8,那么你可能需要安装一些Python库。Python库是一些预定义的Python模块,它们可以帮助你更快速地完成你的项目。在这篇文章中&#x…

chatgpt赋能Python-python3_9_6怎么用

Python 3.9.6简介 Python 3.9.6是2021年6月28日发布的Python编程语言的最新版本,它提供了一些有用的新功能和改进,包括优化的解释器性能和可变构造体。它是一种功能强大的编程语言,既易于学习又易于使用,非常适用于开发Web应用程…

059:cesium设置条纹条带Stripe材质

第059个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置条纹条带材质,请参考源代码,了解StripeMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共91行)相关API参考:专栏目标…

机器学习——感知机

本章节主要介绍感知机的基础知识,虽然在目前的机器学习范围内,感知机已经不怎么使用,但是通过对感知机的学习可以更好的了解以后的线性模型等相关知识。 同时读者可以点击链接:机器学习-目录_欲游山河十万里的博客-CSDN博客 学习完…

Flutter 笔记 | Flutter 核心原理(一)架构和生命周期

Flutter 架构 简单来讲,Flutter 从上到下可以分为三层:框架层、引擎层和嵌入层,下面我们分别介绍: 1. 框架层 Flutter Framework,即框架层。这是一个纯 Dart实现的 SDK,它实现了一套基础库,自…

蓝牙 a2dp 知识点

1 不同的场景支持 当手机与耳机连接时,会协商音频编解码器、音频质量、音频延迟。(可以决定是游戏模式还是音乐模式) 2 音量调整 手机下发音乐数据的同时,还会下发音量值。耳机根据这个音量值,调整音乐数据到耳机实…

微软 | 把local小模型当作大语言模型的插件?

一、概述 title:Small Models are Valuable Plug-ins for Large Language Models 论文地址:https://arxiv.org/abs/2305.08848 代码:https://github.com/JetRunner/SuperICL 1.1 Motivation 大语言模型想GPT-3和GPT-4权重没有开放出来&a…

实验 2:树形数据结构的实现与应用

东莞理工学院的同学可以借鉴,请勿抄袭 1.实验目的 通过实验达到: 理解和掌握树及二叉树的基本概念; 理解和掌握二叉树的顺序存储结构、链式存储结构; 理解和掌握采用二叉链式存储结构下二叉树的各种遍历操作的思想及 其应用&a…

详解Jetpack Compose的标准布局

前言 Compose是一个声明式UI系统,其中,我们用一组函数来声明UI,并且一个Compose函数可以嵌套另一个Compose函数,并以树的结构来构造所需要的UI。 在Compose中,我们称该树为UI 图,当UI需要改变的时候会刷新…