伴随着互联网技术的不断提升,各大在线点评平台都致力于向用户提供更专业化的服务。用户和商家为餐馆提供了文字和图片,形成了丰富的餐馆介绍信息,这些信息需要分类存放。以Yelp网站为例,平台记录了大量餐馆的图像信息,每张图像信息可能附带有一些文字,这是典型的多模态数据。现在,平台需要为这些图片-文本分类,以供用户查看。
预装:Ubuntu20.04, Python 3.10, Pytorch 2.4.0, CUDA 11.8, cuDNN 8, NVCC, VNC
Yelp 部分数据集 按照7 : 1.5 : 1.5 划分训练测试验证集
文件一:filter_photo.json,内部格式如下 { // string, 22 character unique photo id "photo_id": "_nN_DhLXkfwEkwPNxne9hw", // string, 22 character business id, 在本任务中无用 "business_id" : "tnhfDv5Il8EaGSXZGiuQGg", // string, the photo caption, if any "caption" : "carne asada fries", // string, the category the photo belongs to, if any "label" : "food" } 文件二:yelp_filtered_image.zip,解压后有20000张图片,图片名为{photo_id}.jpg
yelp.sh 文件中的两行代码用于从公盘中复制解压文件,存储在/opt
cp /course362/yelp/filter_photo.json /opt
unzip /course362/yelp/yelp_filtered_image.zip -d /opt
由于在文本处理阶段使用了huggingface上的预训练模型,使用huggingface镜像。
在terminal中输入:
export HF_ENDPOINT=https://hf-mirror.com
另外还需要安装一些python包
pip install transformers timm
对于文本的处理,我们需要提取文本的语义信息,以用于指导分类。在这里我们可以使用预训练好的文本模型BERT或者CLIP,代码中给出了参数可以选择使用哪个模型。
对于图片处理,在此次实验中提出了两个方法,用来提取图片语义信息。
- 直接使用预训练模型microsoft/resnet-50
- 仿照ViT,利用文本信息指导图像信息的提取
ViT:将图片分成一个一个patch,每一个patch的大小是超参数。每一个patch进行嵌入,形成图像 patch 嵌入序列。有了一个序列就可以利用Transformer的方法进行处理。同时,将文本信息通过CrossAttention加入到训练过程中,进行模态信息的融合。
如果文本信息和图片信息都是使用的预训练的模型,一个简单但有效的方法是,直接将文本信息的embedding和图片得到的embedding相加,或者拼接,通过softmax层得到分类结果。
nn.CrossEntropyLoss()
计算交叉熵,作为训练的损失。
优化器采用
optim.AdamW
在测试集上ACC:0.815,precision:0.7428 有分类效果
code包括
yelp_classification.py 训练模型,并评估结果
module:model.py 定义了模型
utils: compute_metrics.py 计算评价结果的指标
text_represent.py 获取文字的embedding表示



