0%

到目前为止,我们学习的神经网络,都是输入一个x,经过一个复杂的函数,输出y。x可以是sequence,可以是图片,可以是数据;y可以是类别,可以是sequence。

接下来,我们要把神经网络作为一个generator来使用。network会同时看x和z得到输出。z是simple distribution。回忆CS229机器学习课程,想到可以使用正态分布、均匀分布等,我们自己决定。

z是不固定的。每次使用,随机生成一个z。因此,我们的神经网络的输出,就变成了一个复杂的分布,如图:

阅读全文 »

首先,对ViT的结构做一个回顾

对于图片的读入,与CNN的卷积操作不同(不过,我们在下面的代码实现中,还是在用卷积对patch进行划分),ViT对图片进行embedding处理。

在原始论文里,Vision Transformer将图片打成很多个16 × 16的patch。将一个一个patch展平(flatten)后(从 16×16×3 → 768),再通过一个它们共享的FC层进行映射,得到固定维度的 embedding 向量,传给transformer。

可以把patch当成是NLP里面的单词tokens。

原论文中的结构如下:

我们从图的左下角开始。先给定一张图,把它分成“九宫格”一样的小patch。我们使用卷积核对它划分,具体是把输入变成 (B, C, H’, W’) 的形状,其中,

B: batch size
C: 通道数
H': patch 的高度个数
W': patch 的宽度个数

然后组合concatenate变成右边一个序列。之后,每个patch会被展平。

我们来具体看一下展平。在等会的代码实现中,我们使用的是

1
nn.Flatten(start_dim=2, end_dim=3)
阅读全文 »

现在我来做学习ViT (Vision Transformer)的学习笔记~

原论文:2010.11929 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

我看的解析教学:https://www.bilibili.com/video/BV15P4y137jb

我看的代码实现:https://www.bilibili.com/video/BV1K94y177Ka

1. 概况

提到CV,人们往往想起CNN。AlexNet的提出,引导人们大量在CV领域使用CNN。然而,ViT的结论是:transformer可以在CV任务上做的很好。ViT打破了CV与NLP的专业壁垒,深刻影响了多模态领域。什么是多模态?“模态”是指信息的不同形式或感官通道,例如图像(视觉模态)、图像(视觉模态)、音频(听觉模态)等等,“多模态”就是将多种模态的信息融合在一起进行理解、生成或推理。ViT 把图像表示做成了类似语言的 token 序列,这为“多模态模型”的融合提供了处理方式。

2. 论文摘要

从论文的题目 An Image is Worth 16x16 Words 就能看出来,将图片看成很多很多patch(方格),每一个patch的固定大小是 16 × 16。

前人只将自注意力有限地应用在CNN上,而论文的作者证明transformer也可以做的很好,同时需要更少的训练资源。(当然,是相对的:2500天 TPUv3

阅读全文 »

现在我来做transformer的学习笔记!

回顾:

先来回顾:transformer是一个seq2seq的模型。input是一个sequence;output也是一个sequence,长度由机器决定。应用例子有:语音识别、机器翻译、语音翻译、LLM、文法剖析。

其中,类比算法竞赛的知识点,文法剖析要将结果作为先序遍历的树 来表示,才能应用seq2seq模型表示。不过我忘了算法竞赛的知识点啦,所以,我要来回忆一下先序遍历:

先序遍历(Pre-order Traversal)
根 → 左子树 → 右子树

此外,seq2seq还可以作multi-label分类(将多个label视为一个sequence),目标检测。

seq2seq的模型主要由input、encoder、decoder、output四个部分组成。现在,我来学习transformer。


1. Encoder

先看encoder。Encoder 的作用是将输入序列(input sequence)转化成一个包含其语义信息的隐藏表示(hidden representation) ,以便 Decoder 使用这个表示生成输出。不同的seq2seq模型里,它可以 是一个 RNN 或者 CNN,也可以是这里我们正在学习的 Transformer Encoder。

Transformer encoder用的就是self attention。现在来解释Transformer Encoder的架构:

阅读全文 »

Self-Attention学习笔记

嗯!我已经看过了关于Self-Attention的讲解视频与论文,现在,我想基于李宏毅老师的视频,再仔仔细细地把知识整理一遍!


1. 先来看看自注意力机制概况。

我之前跟刘二大人学习时,已经了解了one-hot独热编码 ,但是独热编码无法看出来向量之间的关系 。现在,word embedding词嵌入 解决了这样的问题。

我们之前学习的回归、分类任务,都是输入的大小与输出相同的 。这里引入seq2seq任务 ,这种任务的模型会自己决定输出label的长度大小。

注意哦,接下来的“自注意力”课程是关注sequence labeling 任务的,输入和输出长度相等。

先回忆,全连接层(FC层)有什么缺点? 全连接层想要观察不同输入vector之间的关系时,必须要扩大同时接入FC层的Windows ,显然在windows很大时是不合适的,会出现过拟合的问题。因此,引入自注意力机制来解决。

self-attention会吃一整个sequence,针对每个向量,input几个vector就输出几个vector,输出的vector可以理解为对于每个原来的vector,考虑了一整个sequence之后,成为了with context的vector

阅读全文 »

让我顺着思路来做一下这道题~

1. 修改目录名字

首先,我面向AI编程,得到了修改目录的脚本(我命名为my translate program.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os

translate = {"cane": "dog", "cavallo": "horse", "elefante": "elephant", "farfalla": "butterfly", "gallina": "chicken", "gatto": "cat", "mucca": "cow", "pecora": "sheep", "scoiattolo": "squirrel", "dog": "cane", "cavallo": "horse", "elephant" : "elefante", "butterfly": "farfalla", "chicken": "gallina", "cat": "gatto", "cow": "mucca", "spider": "ragno", "squirrel": "scoiattolo"}

data_dir = 'raw-img'

for folder_name in os.listdir(data_dir):
old_path = os.path.join(data_dir, folder_name)
if folder_name in translate:
new_folder_name = translate[folder_name]
new_path = os.path.join(data_dir, new_folder_name)
os.rename(old_path, new_path)
print(f"✅ Renamed {folder_name}{new_folder_name}")

运行之后,我的raw-img里面的文件夹的名字都变成了英文名。

2. 开始写程序

我先:设置 transform(VGG 要求 224x224)、加载数据集、按8:2分成训练与测试数据集,利用random_split、构建Dataloader、定义类别标签。

阅读全文 »

最终结果

我最终的尝试,在kaggle上达到此成绩,成绩判断标注是RMSE:


读数据

我首先采用B站教程的numpy 读数据。后来GPT建议我使用pandas 读数据,于是我学习pandas ,并修改成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class BostonHousingDataset(Dataset):
def __init__(self, filepath, is_test=False):
self.is_test = is_test
if is_test:
df = pd.read_csv(filepath)
self.IDs = df.iloc[:, 0]
self.x_data = torch.tensor(df.iloc[:, 1:].values, dtype=torch.float32)
self.len = self.x_data.shape[0]
else:
xy = pd.read_csv(filepath)
self.len = xy.shape[0]
self.x_data = torch.tensor(xy.iloc[:, 1:-1].values, dtype=torch.float32)
self.y_data = torch.tensor(xy.iloc[:, [-1]].values, dtype=torch.float32)

def __getitem__(self, index):
if not self.is_test:
return self.x_data[index], self.y_data[index]
else:
return self.IDs[index], self.x_data[index]

def __len__(self):
return self.len
阅读全文 »

这篇文章会随着我寒假CS的学习而更新(大概)。 去年晚些时候,我报名了sitp,项目是“基于视频图像的路面病害识别与展示”。这个寒假,我会努力学习CS的知识,争取能大概完成项目的一部分。(仓库图片如下)我的一些CS网课的笔记也会放在这里。


更新:2025年2月18日

项目基本完成了,感谢开源社区,让我能在学习尚浅的情况下接触这样一个较大的项目,并学习做好部署、配环境的方法技巧。经过这个项目,我学会了anaconda的使用,熟悉了Pycharm编辑器,同时在反复的配环境中摸索了一些规律。

我收获了这些经验:

阅读全文 »

大一上学期总结

年年失望年年望,事事难成事事成,春在心中。

——郭沫若

这个学期结束了。

大学生活就像《孤独摇滚》一样。在遇到真正志同道合的人之前,波奇酱只能与吉他相伴,独自默默进步。幸运的是,波奇酱有足够的内在驱动力。她秉持坚定的信念,在漫长而痛苦的生活里慢慢变强,持之以恒,笃行不怠。

不同的是,大学生活的内核不是 社恐 ,而是 孤独 。鲁迅先生说:真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。 我能否顶住巨大的分流压力,坚持文化课学习?我能否不在乎他人的眼光,坚持对计算机的热爱、坚持对computer science的拓展探索?我能否接受内心深处的不甘,化痛苦为前进的动力?

後藤同学,我能做到吗?

这个学期,我暂且成功顶住了压力,取得了相当不错的成绩,心里 长期而持久 的痛苦稍受慰藉,仿佛感受到了久违的童年时单纯的快乐。想必波奇酱在与主角团相遇前的“沉淀”阶段,也曾有过如此欣喜的时刻。

1

2

(成绩排名图片已隐藏)

这学期的学习方法很值得复盘。争取下学期稳中求进、再接再厉。
阅读全文 »