年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. Nginx对图片进行防盗链

    这里需要使用两台Linux主机(一台充当防盗链服务器,一台充当盗链服务器),下表是它们所使用的操作系统以及IP地址. 两台Linux主机所使用的操作系统以及IP地址 主机名称 操作系统 IP地址 防盗 ...

  2. macOS Catalina 的zsh升级

    MacOS最近做了一个大版本升级,这次升级中对开发者有个很大的更新是,模式的shell变成了zsh,官方提供了升级配置文档:https://support.apple.com/zh-cn/HT2080 ...

  3. Quay: Introducing an Application Registry for Kubernetes

    转自: https://coreos.com/blog/quay-application-registry-for-kubernetes.html When we started Quay, we w ...

  4. SPA项目开发之动态树+数据表格+分页

    SPA项目开发之动态树+数据表格+分页 动态生成NavMenu导航菜单(只支持2级菜单) <el-menu key="" index=""> < ...

  5. 链接指示:extren"C"

    C++程序有时需要调用其他语言编写的函数,最常见的是调用C语言编写的函数.像所有其他名字一样,其他语言中的函数名字也必须在C++中进行声明,并且该声明必须指定返回类型和形参列表.对于其他语言编写的函数 ...

  6. 【DP】【P5615】 [MtOI2019] 时间跳跃

    Description 给定 \(n\) 条边,第 \(i\) 条边的长度为 \(i\),每条边都有 \(50\%\) 的概率被选择,求如果选出的边能组成一个平面凸多边形,则方案的权值是方案中边的数量 ...

  7. nuxtjs如何通过路由meta信息控制路由查看权限

    我们知道NUXTJS可以通过路由中间件进行路由鉴权,中间件允许您定义一个自定义函数运行在一个页面或一组页面渲染之前. 但是我在实际使用过程中发现,中间件只有在路由跳转到路由中时才会进入,而在强制刷新网 ...

  8. Codeforces Round 558(Div 2)题解

    这场比赛没有打,后来和同学们一起开了场镜像打…… B是SB题结果WA了5发…… C是SB题结果差5min调出……虽然中间有个老师讲题吃掉了1h D是比较神仙的题(2200),但是做出来了?算是比较超常 ...

  9. Python、Spyder的环境搭建

    有什么不对欢迎大家指出,一起交流啊,只针对Windows!!!!(苹果买不起...)Python安装的话2.7版本和3.6版本都可以,虽然2.7比较全面,但还是建议安装3.6,这里以3.6为例进行介绍 ...

  10. 安装-supervisor

    centos 7.xx 1.#yum install python-setuptools 2.#easy_install supervisor 3.# vim /etc/supervisord.con ...