赞
踩
语义分割将图片中的每个像素分类到对应的类别。
像素级分类:语义分割的输出是一个与输入图像大小相同的矩阵,矩阵中的每个元素(即每个像素)都对应一个类别标签。
类别识别:语义分割需要识别图像中的不同物体或区域,并为它们分配相应的类别标签。这些类别可以是天空、道路、建筑、行人等。
精细分割:与图像分割 相比,语义分割更注重类别的识别,而不仅仅是将图像划分为不同的区域。因此,语义分割通常需要更精细的分割结果。
主要方法:语义分割的方法主要包括基于传统图像处理和基于深度学习的方法。传统方法通常利用颜色、纹理、形状等特征进行分割,而深度学习方法则通过训练神经网络模型来提取图像中的特征并实现像素级分类。目前,基于深度学习的语义分割方法已经取得了显著的效果,如全卷积网络(FCN)、U-Net、DeepLab等。
背景虚化:传统的背景替换往往采用绿幕。在没有绿幕的情况下传统相机可以通过光圈来实现背景虚化,对于手机等设备而言背景虚化通常使用的都是语义分割或结合图像景深信息。
路面分割:如无人驾驶时用于实时识别周围物体,实现找路的功能。
总结: 语义分割在自动驾驶、医学图像处理、卫星图像分析等领域有着广泛的应用。 在自动驾驶中,语义分割可以帮助车辆识别道路、行人、车辆等障碍物;在医学图像处理中,语义分割可以帮助医生识别病变区域。
语义分割与实例分割的区别
上采样是图像处理中用于增加图像分辨率或恢复特征图尺寸的技术。在深度学习中,特别是在图像分割和生成模型中,上采样是一个关键步骤。
总结
转置卷积 有上采样和特征图尺寸恢复的能力。其独特的可学习参数使其在处理复杂的上采样任务时更加灵活和有效。在生成对抗网络、图像分割和语义分割等领域有着广泛的应用。
转置卷积和卷积的区别:
转置卷积的具体实现:
如图所示,input里的每个元素和kernel相乘,最后把对应位置相加,相当于卷积的逆变换
转置卷积X’=V^T Y’
重新排列输入和核
当填充为p步幅为s时:
在行和列之间插入s-1行或列
将输如填充k-p-1(k是核窗口)
将核矩阵上下、左右翻转
然后做正常卷积(填充0、步幅1)
形状换算
输入高(宽)为n,核k,填充p,步幅s:
转置卷积:n‘=sn+k-2p-s
卷积:n’=[(n-k-2p+s)/s]向下取整
如果让高宽成倍增加,那么k=2p+s
同反卷积的关系
总结
序列数据在许多实际应用中都很重要,例如:
实际中很多数据是有时序的
电影的评价随时间变化而变化
音乐、文本、语言和视频都是连续的
预测明天的股价要比填补昨天遗失的股价更困难
描述性统计工具:
假设检验工具:
相关性分析工具:
特征选择工具:
模型评估工具:
机器学习库和框架:
潜变量模型 是一种用于解释和预测观察变量(即可以直接测量的变量)之间关系的统计方法。它基于的假设是,存在一些不能直接观察但可以通过其他观察变量推断出来的变量(即潜变量)。
潜变量的定义:
潜变量模型的结构:
潜变量模型的应用:
潜变量的类型:
潜变量模型的推断方法:
潜变量模型的分类:
潜变量模型是一种强大的统计工具,它允许我们通过不可直接观测的变量来理解和预测可观测变量之间的关系。这种模型在多个领域都有广泛的应用,并且有多种不同的推断和建模方法。
总结
潜变量模型和隐马尔科夫模型有什么区别?
没有太多联系,两个不同的观点,但是潜变量模型可以使用隐马尔科夫假设。潜变量-怎么建模,隐马尔科夫-这个数据和之前多少个数据有关。
语言模型的目标:
假设长度为T的文本序列中的词元依次为x1,x2,…,xT。 于是,xt(1≤t≤T) 可以被认为是文本序列在时间步t处的观测或标签。 在给定这样的文本序列时目标是估计序列的联合概率P(x1,x2,…,xT)
基本想法:
P(x1,x2,…,xT) = P(xt∣x1,…,xt−1). (1 <= t <= T) 共T个结果相乘
例如,包含了四个单词的一个文本序列的概率是:
*P*(deep,learning,is,fun)=*P*(deep)*P*(learning∣deep)*P*(is∣deep,learning)*P*(fun∣deep,learning,is)
为了训练语言模型,我们需要计算单词的概率, 以及给定前面几个单词后出现某个单词的条件概率。 这些概率本质上就是语言模型的参数。训练数据集中词的概率可以根据给定词的相对词频来计算。 例如,可以将估计值P^(deep) 计算为任何以单词“deep”开头的句子的概率。 一种(稍稍不太精确的)方法是统计单词“deep”在数据集中的出现次数, 然后将其除以整个语料库中的单词总数。 这种方法效果不错,特别是对于频繁出现的单词。
基本想法的问题:
由于连续单词对“deep learning”的出现频率要低得多, 所以估计这类单词正确的概率要困难得多。 特别是对于一些不常见的单词组合,要想找到足够的出现次数来获得准确的估计可能都不容易。 而对于三个或者更多的单词组合,情况会变得更糟。 许多合理的三个单词组合可能是存在的,但是在数据集中却找不到。 除非我们提供某种解决方案,来将这些单词组合指定为非零计数, 否则将无法在语言模型中使用它们。 如果数据集很小,或者单词非常罕见,那么这类单词出现一次的机会可能都找不到。
阶数越高,对应的依赖关系就越长
。 这种性质推导出了许多可以应用于序列建模的近似公式:
根据时光机器数据集构建词表,并打印前10个最常用的单词
import random
import torch
from d2l import torch as d2l
tokens = d2l.tokenize(d2l.read_time_machine())
# 因为每个文本行不一定是一个句子或一个段落,因此我们把所有文本行拼接到一起
corpus = [token for line in tokens for token in line]
vocab = d2l.Vocab(corpus)
vocab.token_freqs[:10]
[('the', 2261),
('i', 1267),
('and', 1245),
('of', 1155),
('a', 816),
('to', 695),
('was', 552),
('in', 541),
('that', 443),
('my', 440)]
freqs = [freq for token, freq in vocab.token_freqs]
d2l.plot(freqs, xlabel='token: x', ylabel='frequency: n(x)',
xscale='log', yscale='log')
我们可以发现:词频以一种明确的方式迅速衰减。 将前几个单词作为例外消除后,剩余的所有单词大致遵循双对数坐标图上的一条直线。
bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_vocab = d2l.Vocab(bigram_tokens)
bigram_vocab.token_freqs[:10]
[(('of', 'the'), 309),
(('in', 'the'), 169),
(('i', 'had'), 130),
(('i', 'was'), 112),
(('and', 'the'), 109),
(('the', 'time'), 102),
(('it', 'was'), 99),
(('to', 'the'), 85),
(('as', 'i'), 78),
(('of', 'a'), 73)]
这里值得注意:在十个最频繁的词对中,有九个是由两个停用词组成的, 只有一个与“the time”有关。 我们再进一步看看三元语法的频率是否表现出相同的行为方式。
trigram_tokens = [triple for triple in zip(
corpus[:-2], corpus[1:-1], corpus[2:])]
trigram_vocab = d2l.Vocab(trigram_tokens)
trigram_vocab.token_freqs[:10]
[(('the', 'time', 'traveller'), 59),
(('the', 'time', 'machine'), 30),
(('the', 'medical', 'man'), 24),
(('it', 'seemed', 'to'), 16),
(('it', 'was', 'a'), 15),
(('here', 'and', 'there'), 15),
(('seemed', 'to', 'me'), 14),
(('i', 'did', 'not'), 14),
(('i', 'saw', 'the'), 13),
(('i', 'began', 'to'), 13)]
bigram_freqs = [freq for token, freq in bigram_vocab.token_freqs]
trigram_freqs = [freq for token, freq in trigram_vocab.token_freqs]
d2l.plot([freqs, bigram_freqs, trigram_freqs], xlabel='token: x',
ylabel='frequency: n(x)', xscale='log', yscale='log',
legend=['unigram', 'bigram', 'trigram'])
由于序列数据本质上是连续的,因此我们在处理数据时需要解决这个问题。在前几节中我们以一种相当特别的方式做到了这一点: 当序列变得太长而不能被模型一次性全部处理时, 我们可能希望拆分这样的序列方便模型读取。
batch_size
指定了每个小批量中子序列样本的数目, 参数num_steps
是每个子序列中预定义的时间步数。def seq_data_iter_random(corpus, batch_size, num_steps): #@save """使用随机抽样生成一个小批量子序列""" # 从随机偏移量开始对序列进行分区,随机范围包括num_steps-1 corpus = corpus[random.randint(0, num_steps - 1):] # 减去1,是因为我们需要考虑标签 num_subseqs = (len(corpus) - 1) // num_steps # 长度为num_steps的子序列的起始索引 initial_indices = list(range(0, num_subseqs * num_steps, num_steps)) # 在随机抽样的迭代过程中, # 来自两个相邻的、随机的、小批量中的子序列不一定在原始序列上相邻 random.shuffle(initial_indices) def data(pos): # 返回从pos位置开始的长度为num_steps的序列 return corpus[pos: pos + num_steps] num_batches = num_subseqs // batch_size for i in range(0, batch_size * num_batches, batch_size): # 在这里,initial_indices包含子序列的随机起始索引 initial_indices_per_batch = initial_indices[i: i + batch_size] X = [data(j) for j in initial_indices_per_batch] Y = [data(j + 1) for j in initial_indices_per_batch] yield torch.tensor(X), torch.tensor(Y)
my_seq = list(range(35))
for X, Y in seq_data_iter_random(my_seq, batch_size=2, num_steps=5):
print('X: ', X, '\nY:', Y)
顺序分区
def seq_data_iter_sequential(corpus, batch_size, num_steps): #@save
"""使用顺序分区生成一个小批量子序列"""
# 从随机偏移量开始划分序列
offset = random.randint(0, num_steps)
num_tokens = ((len(corpus) - offset - 1) // batch_size) * batch_size
Xs = torch.tensor(corpus[offset: offset + num_tokens])
Ys = torch.tensor(corpus[offset + 1: offset + 1 + num_tokens])
Xs, Ys = Xs.reshape(batch_size, -1), Ys.reshape(batch_size, -1)
num_batches = Xs.shape[1] // num_steps
for i in range(0, num_steps * num_batches, num_steps):
X = Xs[:, i: i + num_steps]
Y = Ys[:, i: i + num_steps]
yield X, Y
X
和标签Y
。 通过将它们打印出来可以发现: 迭代期间来自两个相邻的小批量中的子序列在原始序列中确实是相邻的。for X, Y in seq_data_iter_sequential(my_seq, batch_size=2, num_steps=5):
print('X: ', X, '\nY:', Y)
class SeqDataLoader: #@save
"""加载序列数据的迭代器"""
def __init__(self, batch_size, num_steps, use_random_iter, max_tokens):
if use_random_iter:
self.data_iter_fn = d2l.seq_data_iter_random
else:
self.data_iter_fn = d2l.seq_data_iter_sequential
self.corpus, self.vocab = d2l.load_corpus_time_machine(max_tokens)
self.batch_size, self.num_steps = batch_size, num_steps
def __iter__(self):
return self.data_iter_fn(self.corpus, self.batch_size, self.num_steps)
load_data_time_machine
, 它同时返回数据迭代器和词表, 因此可以与其他带有load_data
前缀的函数类似地使用。def load_data_time_machine(batch_size, num_steps, #@save
use_random_iter=False, max_tokens=10000):
"""返回时光机器数据集的迭代器和词表"""
data_iter = SeqDataLoader(
batch_size, num_steps, use_random_iter, max_tokens)
return data_iter, data_iter.vocab
https://www.kaggle.com/competitions/cowboyoutfits
!git clone https://github.com/ultralytics/yolov5 # clone repo
%cd yolov5
# Install dependencies
%pip install -qr requirements.txt # install dependencies
%cd ../
%pip install --upgrade torch
%pip install --upgrade torchvision
import torch
print(f"Setup complete. Using torch {torch.__version__} ({torch.cuda.get_device_properties(0).name if torch.cuda.is_available() else 'CPU'})")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。