年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. SpringBoot——IDEA使用 Spring Initializer快速创建项目【四】

    前言 使用Spring Initializer快速创建项目 步骤 首先肯定是打开我们的IDEA的编辑器呀~ 创建项目 File -> New -> Project Spring Initi ...

  2. AtCoder Grand Contest 038题解

    好久没更了 写点东西吧= = A 01Matrix 简单构造 左上角和右下角染成1其他染成0即可 #include<bits/stdc++.h> #define ll long long ...

  3. P1908 逆序对-(cdq分治)

    https://www.luogu.org/problem/P1908 沿用归并排序的思想求逆序对. 坑1:结果爆int型,需要用longlong 坑2:相对于归并排序,在比较的时候多了一个等号 举例 ...

  4. python基础之五:dict 字典

    1.数据类型的划分:可变数据类型.不可变数据类型 不可变的有:元组(tuple).字符(str).整型(int).布尔型(bool) 它们都可以哈希 可变的:列表(list).set.字典(dict) ...

  5. 2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017)

    2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017) 全靠 wxh的博客 补完这套.wx ...

  6. html--前端javascript初识

    一.JavaScript简介 JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,有了JavaScript,可使网页变得生动.使用它的目的是与HTML超文本标识语言.Java 脚本语 ...

  7. 几个golang 静态资源嵌入包

    静态资源嵌入二进制文件中,可以方便我们的软件分发(只需要简单的二进制文件就可以了),目前大部分golang 的 web 应用都是使用类似的方法. 以下是收集到的一些常见方案 github.com/go ...

  8. chrome-解决该扩展程序未列在 Chrome 网上应用店中

    1.win10添加策略组 复制以下内容到.bat文件中,右键-以管理员身份运行,即可添加策略组 pushd "%~dp0" dir /b C:\Windows\servicing\ ...

  9. Layui 关闭当前标签页

    parent.layui.admin.events.closeThisTabs();

  10. 【CF573E】Bear and Bowling

    [CF573E]Bear and Bowling 题面 洛谷 题解 首先有一个贪心的结论: 我们一次加入每个数,对于\(\forall i\),位置\(i\)的贡献为\(V_i = k_i\times ...