D5

01图像是什么

音频一般不用CNN
matplotlib
图像的基本概念:
[0,255],接近0接近黑色,接近255接近白色。
nparray:[H,W,C],高宽通道,通道一般一样,3通道

02卷积神经网络构成

卷积+池化+全连接
conv=>relu=>pool=>FC,softmax
conv=>relu=>conv=>relu=>pool=>conv=>relu=>conv=>relu=>pool=>FC,softmax

卷积:特征提取,
池化:降维,
全连接:输出结果,Linear
含有卷积层

03卷积层

04卷积层实现

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

img = plt.imread("/kaggle/input/img-to-read/img.jpg")
print(img.shape)
img = torch.tensor(img).permute(2, 0, 1)
print(img.shape)

in_feature = img.shape[0]

img = img.to(torch.float32).unsqueeze(0)
print(img.shape)



layer = nn.Conv2d(in_channels=3, out_channels=5, kernel_size=3, stride=2, padding=0)
layer2 = nn.Conv2d(in_channels=3, out_channels=10, kernel_size=(3, 5), stride=(2, 3), padding=1)
fm = layer(img)
print(fm.shape)
fm2 = layer2(img)
print(fm2.shape)

05池化层

回顾:
1.卷积层计算:卷积运算本质上就是在做卷积核和输入数据的局部区域间作点积
2.特征图的大小
3.api
in_channel由输入数据的通道数决定的,
out_,输出自己设置,特征图的个数

降维,下采样
最大池化,平均池化。

池化窗口的大小,步长,padding
多通道池化,宽高变化,通道不会变化

# 最大池化
nn.MaxPool2d(kernel_size=2,stride=2,padding=1)
# 平均池化
nn.AvgPool2d(kernel_size=2,stride=1,padding=0)

降维
最大池化用的多,

06图像分类案例

CIFAR10数据集

5w训练,1w测试,10个类别,每个类别有6k个图像,32x32x3大小

Compose是一个非常有用的工具,它可以将多个预处理操作组合成一个操作序列。
ToTensor()的作用是:
将图像从PIL图像或NumPy数组(形状为(H, W, C),像素值范围为[0, 255])转换为PyTorch张量(形状为(C, H, W),像素值范围为[0.0, 1.0])。
这种转换是深度学习中常见的,因为PyTorch模型通常需要输入数据为张量格式。

07网络结构构建

( H , W ) = ( M , N ) (H,W)=(M,N) (H,W)=(M,N)
N = ⌊ W − F + 2 P S ⌋ + 1 N=\lfloor \frac{W-F+2P}{S} \rfloor+1 N=SWF+2P+1

手写数字输入 ( 3 ∗ 32 ∗ 32 ) (3*32*32) (33232)
卷积层:通道必须是3, ( 3 ∗ 3 ∗ 3 ) (3*3*3) (333),总共是6个卷积核
infeature=3,outfeature=6,kernel=3,步长=1(2降了很多),padding=0
输入大小32,输出大小30,所以根据公式计算得到的结果就是padding=0

接下来输出的是 ( 6 ∗ 30 ∗ 30 ) (6*30*30) (63030),池化,kernel=2,步长(一般为2),padding=0,

输出就是 ( 6 ∗ 15 ∗ 15 ) (6*15*15) (61515),接卷积
infeature=6,outfeature=16,kernel=3,步长=1,padding=0

( 16 ∗ 6 ∗ 6 ) (16*6*6) (1666)

全连接层,输入必须是向量,reshape1维/view
( 576 , 120 ) ; ( 120 , 84 ) ; ( 84 , 10 ) (576,120); (120,84); (84,10) (576,120);(120,84);(84,10)

输出层:(FC+Softmax)10个类别

添加非线性激活relu,在卷积层后边。

10自然语言处理概述

文本转化成数值

结构化数据,NLP

输入层,(词嵌入层embedding!),隐藏层,输出层

预处理,分词,向量化

RNN
情感,!分类,!实体识别(谁在上课),翻译,!主题模型
生成文本

11词嵌入层

以前,one-hot,count,TFID,机器学习阶段

代替one-hot,转化为低维向量
假设有100个词,每个词转化成128维度向量,那么矩阵为100*128,每个词对应该矩阵的一个向量
稀疏=>稠密

分词,统计词的个数(行),列是一个超参数
num_bedding,词的数量
embedding_dim多少维度

统计个数,设置维度
集合去重

D6

01RNN介绍

原理:序列性质,“我爱你”,如果颠倒了顺序“你爱我”表达了不一样的意思。
为表示这些数据的处理序列的样本数据。
时间相关的考虑:天气,金融,

考虑,前序文本的数据,隐藏状态 h h h
y 1 = h 1 y_1=h_1 y1=h1,输出和隐藏层相同。

02RNN流程

不同的时间步

初始 h 0 = 0 h_0=0 h0=0,输入 x 1 x_1 x1(我)加权和+tanh(rnn特有),输出 h 1 = y 1 h_1=y_1 h1=y1?另外理解“我”送入隐藏层 h 1 h_1 h1
接下来 h 1 + x 2 h_1+x_2 h1+x2(我+爱)输入,通过一样的神经元预测下一个字(你),神经元只有在反向传播时候才会更新。

x t x_t xt作为一个输入,进入(神经元)加权和,得到一个输出。
h t − 1 h_{t-1} ht1作为另外一个输入,进入(神经元)加权和,得到一个输出。
这两个的输出经过相加在一起,经过tanh激活函数,得到 h t h_t ht
这里也可以作为一个输出 y t + 1 y_{t+1} yt+1

这段关于RNN(循环神经网络)的表述有些地方不够清晰,我来帮你理清一下关系:

RNN的基本流程

  1. 初始化

    • 初始隐藏状态 h 0 h_0 h0 通常被初始化为零向量。
    • 输入序列 x 1 , x 2 , … , x t x_1, x_2, \dots, x_t x1,x2,,xt 逐个送入网络。
  2. 每个时间步的计算

    • 在时间步 t t t
      • 输入 x t x_t xt 和前一时刻的隐藏状态 h t − 1 h_{t-1} ht1 一起送入神经元。
      • 神经元内部进行加权和操作,通常表示为:
        z t = W x x t + W h h t − 1 + b z_t = W_x x_t + W_h h_{t-1} + b zt=Wxxt+Whht1+b
        其中, W x W_x Wx W h W_h Wh 分别是输入权重矩阵和隐藏状态权重矩阵, b b b 是偏置项。
      • 然后通过激活函数(如 tanh ⁡ \tanh tanh)得到新的隐藏状态:
        h t = tanh ⁡ ( z t ) h_t = \tanh(z_t) ht=tanh(zt)
      • 隐藏状态 h t h_t ht 可以作为输出 y t y_t yt,也可以进一步送入输出层(如果有)进行进一步的计算。
  3. 输出

    • 如果需要预测下一个字符(如语言模型中的下一个字),通常会有一个输出层,将隐藏状态 h t h_t ht 转换为输出 y t y_t yt
      y t = W y h t + b y y_t = W_y h_t + b_y yt=Wyht+by
      其中, W y W_y Wy 是输出权重矩阵, b y b_y by 是偏置项。
  4. 反向传播

    • 只有在训练阶段,通过反向传播算法更新神经元的权重 W x W_x Wx W h W_h Wh 和偏置 b b b
    • 在预测阶段,权重保持不变。

具体例子
假设输入序列是“我爱”,我们逐步计算:

  1. 初始状态

    • h 0 = 0 h_0 = 0 h0=0(零向量)
  2. 时间步1

    • 输入 x 1 x_1 x1(“我”)和 h 0 h_0 h0 一起送入神经元:
      z 1 = W x x 1 + W h h 0 + b = W x x 1 + b z_1 = W_x x_1 + W_h h_0 + b = W_x x_1 + b z1=Wxx1+Whh0+b=Wxx1+b
      h 1 = tanh ⁡ ( z 1 ) h_1 = \tanh(z_1) h1=tanh(z1)
    • h 1 h_1 h1 可以作为输出 y 1 y_1 y1,也可以进一步送入输出层。
  3. 时间步2

    • 输入 x 2 x_2 x2(“爱”)和 h 1 h_1 h1 一起送入神经元:
      z 2 = W x x 2 + W h h 1 + b z_2 = W_x x_2 + W_h h_1 + b z2=Wxx2+Whh1+b
      h 2 = tanh ⁡ ( z 2 ) h_2 = \tanh(z_2) h2=tanh(z2)
    • h 2 h_2 h2 可以作为输出 y 2 y_2 y2,也可以进一步送入输出层。

关键点

  • 每个时间步的隐藏状态 h t h_t ht 是由当前输入 x t x_t xt 和前一时刻的隐藏状态 h t − 1 h_{t-1} ht1 共同决定的。
  • 隐藏状态 h t h_t ht 可以作为输出 y t y_t yt,也可以进一步送入输出层。
  • 权重和偏置只有在训练阶段通过反向传播更新,在预测阶段保持不变。

03API

import torch
import torch.nn as nn

RNN = nn.RNN(input_size=1, hidden_size=2, num_layers=2)
"""
input_size:输入数据的维度,一般为词向量的维度
hidden_size:隐藏层h的维数,也是当前层神经元的输出维度,
num_layers:隐藏层h的层数,默认为1
"""

"""
原始维度x=[batch,seq_len,input_size/embedding]

输入数据:词嵌入x,初始隐藏层h0
x[seq_len,batch,input_size],[句子长度,batch大小,词向量维度]
h0[num_layers,batch,hidden_size],[隐藏层层数,batch大小,隐藏层h维度]

输出数据:结果output,最后一层的hn
output,与输入x类似,[seq_len,batch,input_size]即[句子长度,batch大小,词向量维度]
hn,与h0类似,[num_layers,batch,hidden_size],[隐藏层层数,batch大小,隐藏层h维度]
"""

rnn = nn.RNN(input_size=128, hidden_size=64, num_layers=1)
x = torch.randn(12, 24, 128)
h = torch.zeros(1, 24, 64)
y, hn = rnn(x, h)
print(y.shape)
print(h.shape)

04歌词生成案例

构建词表
分词,一个词对应一个唯一的编号

获取文本数据

06模型构建

FC全连接层:生成的词语,是来自于词典当中的,神经元个数=所有词个数

07模型训练

文本生成,其实是文本分类,生成的文本来自于词典中所有文本字数

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐