关于Mer2023实验结果复现的问题。
我在根据readme进行1,2阶段的训练后在Mer2023数据集上进行了测试,在stage1时,我们采用
self.task_pool = [ "emotion", "reason", # "reason_v2", ]
的方式在MERR_coarse_grained.txt上进行了训练,在stage2时,我们采用了
self.task_pool = [ # "emotion", # "reason", "reason_v2", ]
进行在MERR_fine_grained.txt训练。但是在finetune后使用stage2_checkpoint_29.pth进行测试时的结果为:
Accuracy: 0.7110311750599521 Precision: 0.7735778710323865 Recall: 0.7110311750599521 F1 Score: 0.636738734264007 [[168 1 0 13 0 1] [ 3 149 0 15 0 2] [ 36 29 8 85 0 8] [ 1 3 0 253 0 0] [ 1 0 0 9 3 1] [ 5 2 0 26 0 12]]
log_stage2.txt
我们的测试训练log文档如上所示。此外,我们在测试时设置的task_pool为self.task_pool = [ "emotion", # "reason", # "reason_v2", ]
测试文件为relative_test3_NCEV.txt。请问是否在我们的训练过程中出现了一些错误?
我注意到,使用您给的Emotion-Llma.pth进行测试,测试结果为
Accuracy: 0.8129496402877698 Precision: 0.8163218300808229 Recall: 0.8129496402877698 F1 Score: 0.8098997191529657 [[153 5 8 12 1 4] [ 0 144 11 7 2 5] [ 4 29 105 14 2 12] [ 2 3 1 249 0 2] [ 1 0 2 1 5 5] [ 2 4 3 13 1 22]]
而我的stage1的模型测试结果为
Accuracy: 0.7314148681055156 Precision: 0.5875497467970415 Recall: 0.7314148681055156 F1 Score: 0.647548290500557 [[181 1 0 1 0 0] [ 5 154 0 7 1 2] [ 67 29 0 42 1 27] [ 2 3 0 251 0 1] [ 3 0 0 6 3 2] [ 11 1 0 12 0 21]]
请问是否是某个默认配置文件出现了问题?
readme上关于1,2阶段的训练流程是为了多模态情绪推理这个任务效果而设计,按照这个教程使用MERR_coarse_grained在第一阶段训练模型,情绪识别效果一般,因为MERR_coarse_grained没有Neutral这个分类,导致Neutral这个分类的预测结果全是错误的。
在你的stage1的模型测试结果的混淆矩阵中的第三行[ 67 29 0 42 1 27]应该对应的就是Neutral分类的结果:
[[181 1 0 1 0 0]
[ 5 154 0 7 1 2]
[ 67 29 0 42 1 27]
[ 2 3 0 251 0 1]
[ 3 0 0 6 3 2]
[ 11 1 0 12 0 21]]
第三行第三列的数字是零,就代表没有一个Neutral类别的预测结果是正确的,这就是分数低的原因。
如果你更关心情绪识别任务的效果,建议你按照你使用MER2023_pseudo_label.txt这个文件训练第一阶段。MER2023_pseudo_label.txt文件是我们使用我们之前最好的baseline模型对所有无标注的视频打的伪标签,其中包含所有情绪类别。 相关链接如下:
https://drive.google.com/file/d/1MMAwIdqPOCnTFk3bxqQBsO35_XSHJItz/view?usp=sharing https://drive.google.com/drive/folders/1d-Sg5fAskt2s6OOEUNXFaM2u-C055Whj?usp=drive_link
readme上关于1,2阶段的训练流程是为了多模态情绪推理这个任务效果而设计,按照这个教程使用MERR_coarse_grained在第一阶段训练模型,情绪识别效果一般,因为MERR_coarse_grained没有Neutral这个分类,导致Neutral这个分类的预测结果全是错误的。
在你的stage1的模型测试结果的混淆矩阵中的第三行
[ 67 29 0 42 1 27]应该对应的就是Neutral分类的结果:[[181 1 0 1 0 0] [ 5 154 0 7 1 2] [ 67 29 0 42 1 27] [ 2 3 0 251 0 1] [ 3 0 0 6 3 2] [ 11 1 0 12 0 21]]第三行第三列的数字是零,就代表没有一个Neutral类别的预测结果是正确的,这就是分数低的原因。
如果你更关心情绪识别任务的效果,建议你按照你使用MER2023_pseudo_label.txt这个文件训练第一阶段。MER2023_pseudo_label.txt文件是我们使用我们之前最好的baseline模型对所有无标注的视频打的伪标签,其中包含所有情绪类别。 相关链接如下:
https://drive.google.com/file/d/1MMAwIdqPOCnTFk3bxqQBsO35_XSHJItz/view?usp=sharing https://drive.google.com/drive/folders/1d-Sg5fAskt2s6OOEUNXFaM2u-C055Whj?usp=drive_link
非常感谢您的回答,我重新使用MER2023_pseudo_label训练了一遍模型并且得到了接近论文中Pseudo-Label Training的结果。然后我还有几个问题想请教一下您。 1.首先是我观察到论文中table 8 Pseudo-Label Training的结果与table 3中Emotion-LLaMA-A, V 以及Table 6中最后一行的。三个结果非常接近,他们之间的区别是什么呢?是否 Pseudo-Label Training就可以视作Emotion-LLaMA消融了text模态的结果? 2.对于MER2023数据集的Instruction Tuning阶段,使用的Instruction Tuning方法是与Readme中的一致,使用MERR_fine_grained进行reason_v2的单独训练吗?
table 8 Pseudo-Label Training的结果就是使用MER2023_pseudo_label训练的结果。 table 3 中的Emotion-LLaMA A, V 0.8905 是去除了视频的文本模态的字幕的结果,这样做的目的是为对比MER2023-Baseline和VAT模型。因为MER2023-Baseline和VAT实验结果显示对于多模态特征融合只使用了A,V两个模态的分数要高于A,V,T三个模态的分数,所以它们把文本模态丢弃。我们发现对于大模型来说,保留文本模态的台词,会提升多模态大模型的情绪识别分数。我们在测试时用的是MER2023_pseudo_label训第一阶段,MERR_fine_grained训练第二阶段。 Table 6是为了消融实验来验证不同Encoder的组合效果,为了节约时间,每一行的数据都是在train set上训练的,所以导致最终的效果不如table 3中的实验结果。 总结,table 3 是通过双阶段训练,得到的最佳模型。Table 6是为了做消融实验,只训练了train set数据。
对于MER2023数据集的Instruction Tuning阶段,Table 8的Instruction Tuning是用MERR_fine_grained的数据继续进行emotion的单独训练,目的是为了继续提升情绪识别的分数。
非常感谢您耐心的回答。我还想请问一下以下几个问题 1.感觉您倒数第二段“只训练了train set数据”和最后一段“Table 6的Instruction Tuning是用MERR_fine_grained的数据继续进行emotion的单独训练”有点矛盾。前者的意思应该是Table 6中的实验只进行了stage 1的训练吧。 2.Table 3中的MERR_fine_grained阶段使用的task_pool应该是什么?我观察到MERR_fine_grained中['text']才是台词,而使用Instruction Tuning.md中的方法使用reason_v2的task_pool进行单独训练,使用的数据是[‘smp_reason_caption’]。这应该是视频的描述而非“保留文本模态的台词”。我想明确一下您进行Instruction Tuning时的task_pool,以使得我能够更好地复现您的结果。 非常感谢您的耐心回答。
1.不好意思,打错了,已经修改源回答了。
2Table 3中的MERR_fine_grained阶段使用的task_pool是“emotion”。我们没有使用MERR_fine_grained中的键值['text']加载台词,而是使用transcription_en_all.csv来加载文本模态的台词:
https://github.com/ZebangCheng/Emotion-LLaMA/blob/35b09357075cd5ee4c804d686680288ff23f55db/minigpt4/datasets/datasets/first_face.py#L92
每个样本获取对应的台词(sentence)的代码如下: https://github.com/ZebangCheng/Emotion-LLaMA/blob/35b09357075cd5ee4c804d686680288ff23f55db/minigpt4/datasets/datasets/first_face.py#L151-L155
table 8 Pseudo-Label Training的结果就是使用MER2023_pseudo_label训练的结果。 table 3 中的Emotion-LLaMA A, V 0.8905 是去除了视频的文本模态的字幕的结果,这样做的目的是为对比MER2023-Baseline和VAT模型。因为MER2023-Baseline和VAT实验结果显示对于多模态特征融合只使用了A,V两个模态的分数要高于A,V,T三个模态的分数,所以它们把文本模态丢弃。我们发现对于大模型来说,保留文本模态的台词,会提升多模态大模型的情绪识别分数。我们在测试时用的是MER2023_pseudo_label训第一阶段,MERR_fine_grained训练第二阶段。 Table 6是为了消融实验来验证不同Encoder的组合效果,为了节约时间,每一行的数据都是在train set上训练的,所以导致最终的效果不如table 3中的实验结果。 总结,table 3 是通过双阶段训练,得到的最佳模型。Table 6是为了做消融实验,只训练了train set数据。
对于MER2023数据集的Instruction Tuning阶段,Table 8的Instruction Tuning是用MERR_fine_grained的数据继续进行emotion的单独训练,目的是为了继续提升情绪识别的分数。
您好,非常感谢您的耐心回答,我在第一阶段取得了
Accuracy: 0.8932853717026379 Precision: 0.8941079870274884 Recall: 0.8932853717026379 F1 Score: 0.8923205330913054 [[179 1 2 0 0 1] [ 0 149 15 3 1 1] [ 9 10 133 5 1 8] [ 2 3 3 244 0 5] [ 1 0 3 0 6 4] [ 5 1 2 3 0 34]]
的结果,但是在按照您的说法使用MERR_fine_grained进行微调后,我的结果反而下降了
Error: doubt Target: worried
Error: doubt Target: happy
Accuracy: 0.8908872901678657
Precision: 0.8903701383585804
Recall: 0.8908872901678657
F1 Score: 0.8893047355310654
[[174 1 3 3 0 2]
[ 1 148 13 4 1 2]
[ 9 10 135 5 1 6]
[ 2 2 1 249 0 3]
[ 1 0 1 1 6 5]
[ 5 1 2 6 0 31]]
我怀疑是因为MERR_fine_grained中存在'contempt', 'doubt'两个多于的表情,但是当我使用emos = ['neutral', 'angry', 'happy', 'sad', 'worried', 'surprise']进行stage2的训练时,出现以下问题
[rank1]: File "/data1/lx22/anaconda3/envs/emo-llama/lib/python3.9/site-packages/torch/utils/data/_utils/fetch.py", line 52, in
[rank1]: data = [self.dataset[idx] for idx in possibly_batched_index]
[rank1]: File "/data1/lx22/work/DFER/Emotion-LLaMA/minigpt4/datasets/datasets/first_face.py", line 153, in getitem
[rank1]: emotion = self.emo2idx[t[2]]
[rank1]: KeyError: 'doubt'
我想请问你们是如何处理这两个标签的?
错误的原因是,你在emos = ['neutral', 'angry', 'happy', 'sad', 'worried', 'surprise']中删除了'contempt', 'doubt‘,但是MERR_fine_grained.txt文件中还有这两个类别的样本。你写一个代码,处理MERR_fine_grained.txt文件中的'contempt', 'doubt‘类别的样本删除,保存新的txt文件再训练。
Error: sadness Target: sad Accuracy: 0.8920863309352518 Precision: 0.8929344648226645 Recall: 0.8920863309352518 F1 Score: 0.890874777665671 [[174 1 2 3 0 3] [ 1 149 11 5 1 2] [ 9 11 133 5 1 7] [ 2 1 2 249 0 3] [ 1 0 1 1 6 5] [ 4 1 2 5 0 33]]
您好使用MERR_fine_grained.txt删除'contempt', 'doubt‘,'fear'进行微调后出现的结果。但是在我修正这个错误,将sadness标签修改为sad之后,效率依旧只为
Accuracy: 0.8980815347721822 Precision: 0.8990676812567019 Recall: 0.8980815347721822 F1 Score: 0.8967626148492687 [[175 1 1 3 0 3] [ 1 150 11 5 1 1] [ 9 10 134 5 1 7] [ 2 1 1 250 0 3] [ 1 0 1 1 6 5] [ 4 1 1 5 0 34]]
而我在stage 1的结果为
Accuracy: 0.8932853717026379 Precision: 0.8941079870274884 Recall: 0.8932853717026379 F1 Score: 0.8923205330913054 [[179 1 2 0 0 1] [ 0 149 15 3 1 1] [ 9 10 133 5 1 8] [ 2 3 3 244 0 5] [ 1 0 3 0 6 4] [ 5 1 2 3 0 34]]
经过Instruction Tuning后提升了0.044,但是相较于您论文里的0.086,性能差距比较大,我想请教您stage2的best checkpoint大概是第几个epoch?我在20-30个epoch都进行了测试,这是我得到的最好的结果
1.不好意思,打错了,已经修改源回答了。 2Table 3中的MERR_fine_grained阶段使用的task_pool是“emotion”。我们没有使用MERR_fine_grained中的键值['text']加载台词,而是使用
transcription_en_all.csv来加载文本模态的台词:Emotion-LLaMA/minigpt4/datasets/datasets/first_face.py
Line 92 in 35b0935
self.character_lines = pd.read_csv('/home/user/selected_face/face_emotion/transcription_en_all.csv') 每个样本获取对应的台词(sentence)的代码如下:
Emotion-LLaMA/minigpt4/datasets/datasets/first_face.py
Lines 151 to 155 in 35b0935
emotion = self.emo2idx[t[2]] sentence = self.character_lines.loc[self.character_lines['name'] == video_name, 'sentence'].values[0] character_line = "The person in video says: {}. ".format(sentence)
instruction = "
<FeatureHere> {} [{}] {} ".format(character_line, task, random.choice(instruction_pool))
另外,想问一下是如何消融的text。
我使用
instruction = "
进行消融实验时,测试的结果为
Accuracy: 0.8741007194244604 Precision: 0.8745252592952265 Recall: 0.8741007194244604 F1 Score: 0.8703322267412603 [[176 1 2 1 0 3] [ 4 145 15 3 0 2] [ 10 9 130 5 1 11] [ 3 3 2 246 0 3] [ 3 0 3 1 2 5] [ 6 1 3 5 0 30]]
这与您的结果差了0.02,而我与您一样使用的是4GPU的A100进行训练,不知道为什么会出现这么大的差距
我们先使用以下指令进行训练:
instruction = " [{}] {} ".format(character_line , task, random.choice(instruction_pool))
再测试时分别使用text和不使用text作为消融实验:
`instruction = " [{}] {} ".format(character_line , task, random.choice(instruction_pool))
`instruction = " [{}] {} ".format(task, random.choice(instruction_pool))