年10月26日 星期六

  • mmdatasdk: module for downloading and procesing multimodal datasets using computational sequences.
  • mmmodelsdk: tools to utilize complex neural models as well as layers for building new models. The fusion models in prior papers will be released here.
  1. mmdatasdk

将每个数据集看成是可计算的序列,每个序列包含一个模态的数据(以分层结构存储)

关于csd格式文件(csd = computational sequential data):

  • 两个主要元素(key elements)
    • data:特征,根据video id等进行分类
      • 每个多模态数据源关联两个矩阵:特征和时间(timestamp),特征和时间矩阵都是numpy 2d array
    • metadata:完整性和版本信息
  • 存储在hdf5对象中

本例中,csd文件中存储了提取出来的特征(用于可以将提取出来的特征进行分享)

  1. 步骤:

Step1 下载

Step2 对齐(下载的数据频率可能不一样)

sometimes the data needs to be aligned

Code 1>>>获取情感态度标签(label) cmumosi_highlevel.add_computational_sequences(mmdatasdk.cmu_mosi.labels,'cmumosi/')

Code 2>>> 使everything对齐

cmumosi_highlevel.align('Opinion Segment Labels')

举例:

对于视频模态的数据v0,用v0[2]来表示视频的第三段

  1. 单词级别的对齐:word level alignment

>>> from mmsdk import mmdatasdk
>>> cmumosi_highlevel=mmdatasdk.mmdataset(mmdatasdk.cmu_mosi.highlevel,'cmumosi/')
>>> cmumosi_highlevel.align('glove_vectors',collapse_functions=[myavg])
>>> cmumosi_highlevel.add_computational_sequences(mmdatasdk.cmu_mosi.labels,'cmumosi/')
>>> cmumosi_highlevel.align('Opinion Segment Labels')

From <https://github.com/A2Zadeh/CMU-MultimodalSDK>

Align function:对齐函数,接受两个值:时间和特征(也就是前边的两个矩阵)

cmumosi_highlevel.align('glove_vectors',collapse_functions=[myavg])可以接受多个函数作为参数,这时将各个函数分别执行并将结果拼接

  1. 特征提取:

使用glove

  1. 数据集的数据结构分析

数据集结构(逻辑结构)

存储结构:

  1. 查看数值的方法:

print(dataset[text_field]['5W7Z1C_fDaE[9]']['features'])

输出

[[b'its']
[b'completely']
[b'different']
[b'from']
[b'anything']
[b'sp']
[b'weve']
[b'ever']
[b'seen']
[b'him']
[b'do']
[b'before']]

print(dataset[label_field]['5W7Z1C_fDaE[10]']['intervals'])

输出

[[32.239227 34.50408 ]]

(时间戳的起止点)

  1. 如何用HDF5格式表达多模态数据?

Pivot modality:核心模态

不同模态数据的采样频率不一样,需要对齐到pivot modality上,通常情况下,对齐到words

对齐的办法:使用collapse函数

将不同模态数据按主要模态的时间轴进行分组,然后collapse函数将其进行池化

ATTN:本SDK将collapse函数应用到所有模态,但是Word模态无法求均值,因此需要一个try:except,捕获文本求均值产生的异常

  1. 读取数据样式:

dataset=md.mmdataset(recipe)

dataset变量结构如下:

其中,'CMU_MOSI_ModifiedTimestampedWords' 模态的数据格式如下:

data里边存储了文本数据及其时间戳:

第一个维度:

对于一个batch(也就是变量train、变量test)来说,5个维度的含义如下:

print(batch[0].shape)

#wordvectors,paddedtomaxlen

print(batch[1].shape)

#visualfeatures

print(batch[2].shape)

#acousticfeatures

print(batch[3])

#labels

print(batch[4])

#lengths

rain_loader = DataLoader(train, shuffle=False, batch_size=batch_sz, collate_fn=multi_collate)

上述四个变量,在训练中通过train_loader赋值给train_iter,再划分成每轮次循环中的batch:

在文件train.py中:

for batch in train_iter:

model.zero_grad()

t, v, a, y, l = batch

batch_size = t.size(0)

t,v,a,y,l=batch

# t,v,a,y,l中存储了一个batchsize中的所有数据

使用MOSI数据集,第一个batchsize之后,tval的维度如下:

t: [33, 56]

v: [33, 56, 47]

a: [33, 56, 74]

l: [56]

第二个batchsize之后,tval的维度如下:

t: [42, 56]

v: [42, 56, 47]

a: [42, 56, 74]

l: [56]

最后一个batchsize之后,上述变量的维度如下:

t: [59, 49]

v: [59, 49, 47]

a: [59, 49, 74]

l: [49]

debug模式下对上述y变量进行inspect,得到结果如下:

且有len(y) == 168

  1. 对上述数据的分析:

    由于batchsize = 56

    Dataloader的batchsize = batchsize * 3,因此len(y) == 168

划分batch之后,train_loader内保存了dataset的一部分,也按照上边的顺序保存

例如:

train_loader.dataset[0]的返回结果表示一整条多模态数据

  1. 数据的物理含义:

train_loader.dataset[0]以及train_loader.dataset[1]等:

  • train_loader.dataset的第一个维度表示数据条数,对应一段视频中的文本声音图像及其label

train_loader.dataset[0][0]中存储了三种模态的数据(文本声音图像)

train_loader.dataset[0][1]中存储了label(情感标签)

train_loader.dataset[0][2]中存储了视频对应的字符串(视频文件名)

ATTN:

train_loader.dataset[0][0]是一个list,list中有三个元素,是三个array,表示三种模态的数据

例如train_loader.dataset[67][2]返回:

Out[12]: u'Oz06ZWiO20M[22]'

  1. 多模态数据的获取方式:

train_loader.dataset[0][0][0]是wordvector(是一个array)

train_loader.dataset[0][0][1]是visual feature(是一个array)

train_loader.dataset[0][0][2]是acoustic feature(是一个array)

上述三个array构成了一个list

  1. 总结:

  • train_loader.dataset是一个list
  • train_loader.dataset[0]或train_loader.dataset[99]等,是tuple(三元组),三元组由两个array和一个字符串构成
    • train_loader.dataset[0][0]中存储了三种模态的数据(文本声音图像),是一个tuple
      • train_loader.dataset[0][0][0]是一个ndarray,表示word vector,一个值对应说话人说的一个单词
      • train_loader.dataset[0][0][1]表示视觉信号ndarray,其列数等于视觉信号提取出来的特征维度(47),其行数等于说话人说的单词数
      • train_loader.dataset[0][0][2]表示听觉信号ndarray,其列数等于听觉信号提取出来的特征维度(74),其行数等于说话人说的单词数
    • train_loader.dataset[0][1]中存储了label(情感标签),是ndarray
    • train_loader.dataset[0][2]中存储了视频对应的字符串(视频文件名)
  1. 对各个维度的分析:

wordvector的维度比较低,通常少于10维

visual feature和acoustic feature在对齐之后含有多个array(本例中,每个音视频array有46维长度)

即:

train_loader.dataset[78][0][2]表示音频模态数据,但是这个数据包括14个特征向量(其他样本可能包含不同数值)

相当于以下14个tensor,每个tensor有46维:

train_loader.dataset[78][0][2][0]

... ...

train_loader.dataset[78][0][2][13]

总结:

MOSI数据集是语素级的,以数据集中编号为'8qrpnFRGt2A'的视频的第15小段为例,该段视频中人物说了14个字(word),因此对应的另外两种模态中,有14个array,验证方法是:

如图,train_loader.dataset[78][0][2].__len__()==14,因此说明语素级别上数据集是对齐的

在数据集中可以查找到对应的这句话

[['it']

['fell']

['like']

['i']

['was']

['watching']

['one']

['of']

['those']

['army']

['of']

['one']

['commercials']

['sometimes']]

对应的情感标签:

  1. 网络的训练流程:

在trainloader的基础上,新建一个`train_iter` 变量如下

train_iter=tqdm_notebook(train_loader)

train_iter增加了sample的功能

事实上,train_iter就是train_loader的基础上增加了进度条功能

sample的方法使用的是pyTorch中的dataloader

_________________________

  1. 补充1:

collate函数是pytorch中用Dataloader来处理数据集的概念,而不是多模态处理中的概念

collate取"拼接"之意

defmulti_collate(batch):

这个函数对一个batch的数据进行拼接

把batch[1]取出来作为label(就是y)

把batch[0][0]取出来作为文本模态(就是t)

batch[0][1]以及batch[0][2]取出来作为视觉和音频模态(就是v和a,多维tensor)

返回值是:

returnsentences,visual,acoustic,labels,lengths

————————————————————

  1. 补充2:

数据集中共有1281条数据,即:

X_train_l.__len__()==1281

问题:最后整理出来的每个batch下的t,v,a,y,l进行拼接,得到1281条y和1281条l,但是v,a,t却只有1014条

debug模式下,发现在某一轮batch循环中,batchsize=56,有:

y.__len__() == l.__len__() == 56,

但是a,v,t的长度却是32

进一步分析a,v,t的维度,有:

In[14]: a.shape

Out[14]: torch.Size([48, 56, 74])

In[15]: v.shape

Out[15]: torch.Size([48, 56, 47])

因此,上边a,v,t的length和y,l的length不一样,其原因在于:代码中拼接a,v,t时选错了维度

解决方案:

需要将a,v,t的前两个维度互换位置,

t=list(np.array(t).transpose((1,0)))

第一步:torch.tensor转换成ndarray

第二步:ndarray前两维互换

第三步:转换成list

ATTN:

如果使用list(array1)的形式,则只将最外层转换成list,里边还是array

如果使用array1.tolist()方法,则整个array的每一层都变成了list

在第一个batch中,将t,v,a,y,l转换成ndarray之后的shape如下:

t的shape为(40,56)

v的shape为(40,56,47)

a的shape为(40,56,74)

y的shape为(56,1)

l的shape为(56,)

此时的ndarray的各个轴进行过变换

第二维(56)表示batchsize

第一维表示语素的个数(单词数)

第三维表示模态特征(应作为X_train的一行,进行拼接)

整理数据的代码:

forbatchintrain_iter:

#batch=list(batch)

#X_train_tmp=X_train_tmp+batch

t,v,a,y,l=batch

t=list(np.array(t).transpose((1,0)))

v=list(np.array(v).transpose((1,0,2)))

a=list(np.array(a).transpose((1,0,2)))

y=list(np.array(y))

l=list(np.array(l).reshape((-1,1)))

ifcnt==0:

X_train_t=t

X_train_v=v

X_train_a=a

Y_train=y

X_train_l=l

else:

X_train_t+=t

X_train_v+=v

X_train_a+=a

Y_train+=y

X_train_l+=l

上述代码之后:

X_train_a是一个list(len==1281),每个元素是一个array,每个array的shape是(40, 74):

X_train_a[0].shape

Out[3]: (40, 74)

其中,40是语素的个数,74是提取的特征数

CMU-Multimodal SDK Version 1.1 (mmsdk)使用方法总结的更多相关文章

  1. Android开发学习---template requires a minimum SDK version of at least 7,build target API version of 14

    adt 22.6.3的bug 当adt更新到22.6.3,其编辑器中最低支持api7,即android 2.1,这里可能是google故意这么做的,也可能是其bug.其target sdk 和comp ...

  2. 版本适配 sdk version MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 解决Visual Studio 2015创建工程时的“DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' failed to install.”错误

    前段时间发布了Visual Studio2015,在后,发现创建Asp.Net工程和时,出现了"DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' f ...

  4. Windows SDK version 8.1 下载地址

    Windows SDK version 8.1 下载地址 https://go.microsoft.com/fwlink/p/?LinkId=323507

  5. flutter doctor出现问题 [!] Android toolchain - develop for Android devices (Android SDK version 28.0.3) X Android license status unknown. Try re-installing or updating your Android SDK Manager. 的解决方案

    首先,问题描述: flutter doctor Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Cha ...

  6. Android SDK Manager 更新失败的解决方法

    Android SDK Manager 更新失败的解决方法 原文地址 最近使用Android SDK Manager 更新Android SDK tools 发现经常更新失败,获取不到更新信息: Fe ...

  7. Visual Studio 2015创建ASP.NET5项目“DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' 无法安装的错误

    使用asp.net5建立web application时遇到DNX SDK版本 “dnx-clr-win-x86.1.0.0-beta5”无法安装的错误 解决办法: 运行cmd: 1.输入: @pow ...

  8. 解决failed to get the required adt version from sdk version

    在网上看了很多,选择其中的一个解决方法试了下, 还行. AS 2.3之后不能和Eclipse共用一个SDK,给Eclispe重新配置一个SDK路径

  9. [转]未能加载文件或程序集 CrystalDecisions.Web Version=10.2.3600解决方法

    找到你开发的机器上VS安装目录中的SDK\v2.0\BootStrapper\Packages\CrystalReports\CRRedist2005_x86.msi和SDK\v2.0\BootStr ...

随机推荐

  1. Skeleton-Based Action Recognition with Directed Graph Neural Network

    Skeleton-Based Action Recognition with Directed Graph Neural Network 摘要 因为骨架信息可以鲁棒地适应动态环境和复杂的背景,所以经常 ...

  2. nginx上传大文件,413错误解决

    在nginx里增加了配置. client_max_body_size 500m; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_se ...

  3. django 权限设置-登录配置权限

    1.首先需要一个判断用户是否拥有这个权限的name来区分在主页上是否显示标签 在permission中加入 name=models.CharField(max_length=32, verbose_n ...

  4. 实验十四 团队项目评审&个人学习总结

    实验十四 课程学习总结 项目 内容 这个作业属于哪个课程 (https://www.cnblogs.com/nwnu-daizh/) 这个作业的要求在哪里 (https://www.cnblogs.c ...

  5. IE a zoom:1

  6. 【反防盗链】img 标签 访问图片 返回403 forbidden问题

    解决方案,页面头添加 <meta name="referrer" content="no-referrer" /> 隐藏请求体中标注来源referr ...

  7. 小程序开发第一天josn和wxml

    视频中只有app.josn路径还有wxm文本.js中没有调用page.原视频中是可以出来文本内容的. 但是把js调用page以后是可以呈现的 所以疑问点就是为什么以前可以? 1.微信开发工具改了,强制 ...

  8. 【java异常】expected at least 1 bean which qualifies as autowire candidate for this depende

    1.查看接口实现类是否加入注解,如service.repository等 2.查看spring配置文件是否自动扫描包    <context:component-scan base-packag ...

  9. Hyperparameters

    参数是机器学习算法的关键.它们通常由过去的训练数据中总结得出.在经典的机器学习文献中,我们可以将模型看作假设,将参数视为对特定数据集的量身打造的假设. 模型是否具有固定或可变数量的参数决定了它是否可以 ...

  10. LeetCode 1146. Snapshot Array

    原题链接在这里:https://leetcode.com/problems/snapshot-array/ 题目: Implement a SnapshotArray that supports th ...