深度学习基础D5-D6
文章目录
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=⌊SW−F+2P⌋+1
手写数字输入 ( 3 ∗ 32 ∗ 32 ) (3*32*32) (3∗32∗32)
卷积层:通道必须是3, ( 3 ∗ 3 ∗ 3 ) (3*3*3) (3∗3∗3),总共是6个卷积核
infeature=3,outfeature=6,kernel=3,步长=1(2降了很多),padding=0
输入大小32,输出大小30,所以根据公式计算得到的结果就是padding=0
接下来输出的是 ( 6 ∗ 30 ∗ 30 ) (6*30*30) (6∗30∗30),池化,kernel=2,步长(一般为2),padding=0,
输出就是 ( 6 ∗ 15 ∗ 15 ) (6*15*15) (6∗15∗15),接卷积
infeature=6,outfeature=16,kernel=3,步长=1,padding=0
( 16 ∗ 6 ∗ 6 ) (16*6*6) (16∗6∗6)
全连接层,输入必须是向量,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} ht−1作为另外一个输入,进入(神经元)加权和,得到一个输出。
这两个的输出经过相加在一起,经过tanh激活函数,得到 h t h_t ht
这里也可以作为一个输出 y t + 1 y_{t+1} yt+1
这段关于RNN(循环神经网络)的表述有些地方不够清晰,我来帮你理清一下关系:
RNN的基本流程
-
初始化:
- 初始隐藏状态 h 0 h_0 h0 通常被初始化为零向量。
- 输入序列 x 1 , x 2 , … , x t x_1, x_2, \dots, x_t x1,x2,…,xt 逐个送入网络。
-
每个时间步的计算:
- 在时间步 t t t:
- 输入 x t x_t xt 和前一时刻的隐藏状态 h t − 1 h_{t-1} ht−1 一起送入神经元。
- 神经元内部进行加权和操作,通常表示为:
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+Whht−1+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,也可以进一步送入输出层(如果有)进行进一步的计算。
- 在时间步 t t t:
-
输出:
- 如果需要预测下一个字符(如语言模型中的下一个字),通常会有一个输出层,将隐藏状态 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 是偏置项。
- 如果需要预测下一个字符(如语言模型中的下一个字),通常会有一个输出层,将隐藏状态 h t h_t ht 转换为输出 y t y_t yt:
-
反向传播:
- 只有在训练阶段,通过反向传播算法更新神经元的权重 W x W_x Wx、 W h W_h Wh 和偏置 b b b。
- 在预测阶段,权重保持不变。
具体例子
假设输入序列是“我爱”,我们逐步计算:
-
初始状态:
- h 0 = 0 h_0 = 0 h0=0(零向量)
-
时间步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,也可以进一步送入输出层。
- 输入 x 1 x_1 x1(“我”)和 h 0 h_0 h0 一起送入神经元:
-
时间步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,也可以进一步送入输出层。
- 输入 x 2 x_2 x2(“爱”)和 h 1 h_1 h1 一起送入神经元:
关键点
- 每个时间步的隐藏状态 h t h_t ht 是由当前输入 x t x_t xt 和前一时刻的隐藏状态 h t − 1 h_{t-1} ht−1 共同决定的。
- 隐藏状态 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模型训练
文本生成,其实是文本分类,生成的文本来自于词典中所有文本字数
更多推荐


所有评论(0)