精华内容
下载资源
问答
  • 向量数据:密集连接网络(Dense层) 图像数据:二维卷积神经网络 声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络 文本数据:一维卷积神经网络(首选)或循环神经网络 时间序列数据:循环神经...

    输入模式与网络架构间的对应关系:

    • 向量数据:密集连接网络(Dense层)
    • 图像数据:二维卷积神经网络
    • 声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络
    • 文本数据:一维卷积神经网络(首选)或循环神经网络
    • 时间序列数据:循环神经网络(首选)或一维卷积神经网络
    • 其他类型的序列数据:循环神经网络或一维卷积神经网络。如果数据顺序非常重要(比如时间序列,但文本不是),那么首选循环神经网络
    • 视频数据:三维卷积神经网络(如果需要捕捉运动效果),或者帧级的二维神经网络(用于特征提取)+循环神经网络或一维卷积神经网络(用于处理得到的序列)
    • 立体数据:三维卷积神经网络

    三种网络架构:

    • 1.密集连接网络

    • 2.卷积网络

    • 3.循环网络

    1.密集连接网络

    密集连接网络是Dense层的堆叠,用于处理向量数据(向量批量)。这种网络假设输入特征中没有特定结构:之所以叫作密集连接,是因为Dense层的每个单元都和其他所有单元相连接;

    from keras import models
    from keras import layers
    
    model = models.Sequential()
    model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
    model.add(layers.Dense(32,activation='relu'))
    model.add(layers.Dense(1,activation='sigmoid'))
    
    model.compile(optimizer='rmsprop',loss='binary_crossentropy')
    

      

    对于二分类问题,层堆叠的最后一层使用sigmoid激活且

    只有一个单元的Dense层,并使用binary_crossentropy

    作为损失,目标应该是0或1.

    from keras import models
    from keras import layers
    
    model = models.Sequential()
    model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
    model.add(layers.Dense(32,activation='relu'))
    model.add(layers.Dense(num_classes,activation='softmax'))
    
    model.compile(optimizer='rmsprop',loss='categorical_crossentropy')

    对于单标签多分类问题,每个样本只有一个类别(不会超过一个),

    层堆叠的最后一层是一个Dense层,它使用softmax激活,其

    单元个数等于类别个数。如果目标是one-hot编码的,那么使用

    categorical_crossentropy作为损失;如果目标是整数,那么

    使用sparse_categorical_crossentropy作为损失

     

    from keras import models
    from keras import layers
    
    model = models.Sequential()
    model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
    model.add(layers.Dense(32,activation='relu'))
    model.add(layers.Dense(num_classes,activation='sigmoid'))
    
    model.compile(optimizer='rmsprop',loss='binary_crossentropy')

    对于多标签多分类问题,每个样本可以有多个类别,层堆叠的最后一层

    是一个Dense层,它使用sigmoid激活其单元个数等于类别个数,并使用

    binary_crossentropy作为损失,目标应该是k-hot编码的

    from keras import models
    from keras import layers
    
    model = models.Sequential()
    model.add(layers.Dense(32,activation='relu',input_shape=(num_input_features,)))
    model.add(layers.Dense(32,activation='relu'))
    model.add(layers.Dense(num_classes)
    
    model.compile(optimizer='rmsprop',loss='mse')
    

      

    对于连续值向量的回归问题,层堆叠的最后一层是一个不带激活Dense层,

    其单元个数等于你要预测的值的个数(通常只有一个值,比如房价)。

    有几种损失可用于回归问题,最常见的是

    mena_squared_error(均方误差,MSE)

    mean_absolute_error(平均绝对误差,MAE)

    2.卷积神经网络

    卷积层能够查看空间局部模式,其方法是对输入张量的不同空间位置(图块)应用相同的几何变换。这样得到的表示具有平移不变性,这使得卷积层能够高效利用数据,并且能够高度模块化。

    卷积神经网络或卷积网络是卷积层和最大池化层的堆叠。池化层可以对数据进行空间下采样, 这么做有两个目的随着特征数量的增大,我们需要让特征图的尺寸保持在合理范围内;让后面的卷积层能够“看到”输入中更大的空间范围。卷积神经网络的最后通常是一个 Flatten 运算 或全局池化层,将空间特征图转换为向量,然后再是 Dense 层,用于实现分类或回归。 注意,大部分(或者全部)普通卷积很可能不久后会被深度可分离卷积(depthwise separable convolution,SeparableConv2D 层)所替代,后者与前者等效,但速度更快、表示效率更高。 对于三维、二维和一维的输入来说都是如此。如果你从头开始构建一个新网络,那么一定要使用深度可分离卷积。SeparableConv2D 层可直接替代 Conv2D 层,得到一个更小、更快的网络, 在任务上的表现也更好。

    model = models.Sequential() 
    model.add(layers.SeparableConv2D(32, 3, activation='relu', input_shape=(height, width, channels)))                                 
    model.add(layers.SeparableConv2D(64, 3, activation='relu')) 
    model.add(layers.MaxPooling2D(2)) model.add(layers.SeparableConv2D(64, 3, activation='relu'))
    model.add(layers.SeparableConv2D(128, 3, activation='relu'))
    model.add(layers.MaxPooling2D(2)) model.add(layers.SeparableConv2D(64, 3, activation='relu'))
    model.add(layers.SeparableConv2D(128, 3, activation='relu'))
    model.add(layers.GlobalAveragePooling2D()) model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(num_classes, activation='softmax')) model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
    图像多分类

     

    3.循环神经网络

    循环神经网络(RNN)的工作原理是,对输入序列每次处理一个时间步,并且自始至终保存一个状态(state,这个状态通常是一个向量或一组向量,即状态几何空间中的点)。

    如果序列中的模式不具有时间平移不变性,那么应该优先使用循环神经网络,而不是一维卷积神经网络。keras中有三种RNN层:SimpleRNN/GRU/LSTM。对于大多数实际用途,你应该使用GRU或LSTM。两者中LSTM更强大,计算代价也更高。可以将GRU看作是一种更简单、计算代价更小的替代方法。想要将多个RNN层逐个堆叠在一起,最后一层之前的每一层都应该返回输出的完整序列(每个输入时间步都对应一个输出时间步)。

    如果你不再堆叠更多的RNN层,那么通常只返回最后一个输出,其中包含关于整个序列的二分类。

    model = models.Sequential() 
    model.add(layers.LSTM(32, input_shape=(num_timesteps, num_features))) 
    model.add(layers.Dense(num_classes, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy')
    一个单层 RNN 层,用于向量序列的二分类
    model = models.Sequential() 
    model.add(layers.LSTM(32, return_sequences=True, input_shape=(num_timesteps, num_features))) 
    model.add(layers.LSTM(32, return_sequences=True)) 
    model.add(layers.LSTM(32)) 
    model.add(layers.Dense(num_classes, activation='sigmoid')) 
     
    model.compile(optimizer='rmsprop', loss='binary_crossentropy')

    RNN 层的堆叠,用于向量序列的二分类。

    转载于:https://www.cnblogs.com/nxf-rabbit75/p/10123737.html

    展开全文
  • 针对目前传统的隐写分析技术对特征集要求越来越高的问题,构建了一个密集连接网络模型(Steganalysis-Densely Connected Convolutional Networks,S-DCCN)进行图像隐写分析,避免了人工提取特征,提高了隐写分析...
  • 目录密集连接网络keras.layers.Inputkeras.models.Model多输入和多输出模型 密集连接网络 该Sequential模型可能是实现这种网络的更好选择,但它有助于从非常简单的事情开始。 图层实例可调用(在张量上),并...


    参考:RNN及LSTM: https://blog.csdn.net/zhaojc1995/article/details/80572098

    密集连接网络

    该Sequential模型可能是实现这种网络的更好选择,但它有助于从非常简单的事情开始。

    • 图层实例可调用(在张量上),并返回张量
    • 然后可以使用输入张量和输出张量来定义Model
    • 这种模型可以像Keras Sequential模型一样进行训练。
    from keras.layers import Input, Dense
    from keras.models import Model
    import keras
    import numpy as np
    from tensorflow.examples.tutorials.mnist import input_data
    import tensorflow as tf
    
    # 载入数据
    batch_sizes = 10000
    def loadData(filename):
        mnist = input_data.read_data_sets(filename, one_hot=True)
        mnist.train.cls = np.argmax(mnist.train.labels, axis=1)
        mnist.test.cls = np.argmax(mnist.test.labels, axis=1)
        mnist.validation.cls = np.argmax(mnist.validation.labels, axis=1)
        return mnist
    
    
    datas = loadData(r'C:\Users\Cs\Desktop\深度学习\tf_day011\datas\mnist')
    train_images, train_labels = datas.train.next_batch(batch_sizes)
    # 返回一个张量,这个输入数据不包括数据数量维度
    inputs = Input(shape=(784,))
    
    # 一个层实例可以在一个张量上调用,并返回一个张量
    x = Dense(64, activation='relu')(inputs)
    x = Dense(64, activation='relu')(x)
    predictions = Dense(10, activation='softmax')(x)
    
    # 创建一个包含输入层和三个密集层的模型
    model = Model(inputs=inputs, outputs=predictions)
    model.compile(optimizer='rmsprop',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    model.fit(train_images, train_labels)  # starts training
    # # 与上面功能相同
    # model = keras.Sequential()
    # model.add( Dense(64, activation='relu',input_shape=(784,)))
    # model.add( Dense(64, activation='relu'))
    # model.add( Dense(10, activation='softmax'))
    # model.compile(optimizer='rmsprop',
    #               loss='categorical_crossentropy',
    #               metrics=['accuracy'])
    # model.fit(train_images, train_labels,batch_size=500,epochs=30)  # starts training
    

    keras.layers.Input

    输入接口,返回一个可以使用的张量。
    使用功能API,可以轻松地重用经过训练的模型:通过在张量上调用,可以将任何模型视为一个层。请注意,通过调用模型,您不仅可以重用模型的体系结构,还可以重用其权重。
    示例:

    from keras.layers import Input,
    
    # 生成一个Nx 784的Tensor
    inputs = Input(shape=(784,))
    

    例如,这可以允许快速创建可以处理输入序列的模型。您可以将图像分类模型转换为视频分类模型,只需一行。

    from keras.layers import TimeDistributed
    # 20个时间步序列的输入张量,每个包含784维向量
    input_sequences = Input(shape=(20, 784))
    # 这将把前面的模型应用到输入序列中的每个时间步。前一个模型的输出是一个10路softmax,所以下面这个层的输出将是一个由20个大小为10的向量组成的序列。
    processed_sequences = TimeDistributed(model)(input_sequences)
    

    keras.models.Model

    功能和Sequential()差不多,都是生成模型的,不过上方式通过add增加图层,下方是设计了各图层之间的连接关系,然后再创建Model的时候使用最后一个图层
    示例:

    from keras.models import Model
    # inputs为keras.layers.Input实例,
    # predictions为连接图层,参考最上面的代码
    model = Model(inputs=inputs, outputs=predictions)
    model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
    model.fit(data, labels)  # starts training
    

    多输入和多输出模型

    这是功能API的一个很好的用例:具有多个输入和输出的模型。功能API使操作大量交织在一起的数据流变得容易。

    让我们考虑以下模型。我们试图预测有多少转推和喜欢新闻标题将在Twitter上收到。模型的主要输入将是标题本身,作为一系列单词,但为了增加趣味,我们的模型还将具有辅助输入,接收额外数据,例如标题发布时的时间等。该模型还将通过两个损失函数进行监督。使用模型中较早的主要损失函数是深度模型的良好正则化机制。
    模型:
    在这里插入图片描述
    用功能API实现它。
    主要输入接收新闻标题本身,即一个整数序列(每个整数编码一个词)。 这些整数在 1 到 10,000 之间(10,000 个词的词汇表),且序列长度为 100 个词。

    from keras.layers import Input, Embedding, LSTM, Dense
    from keras.models import Model
    
    # 标题输入:表示接收100个整数序列,在1到10000之间。
    # 注意,我们可以通过传递一个“name”参数来命名任何层。
    main_input = Input(shape=(100,), dtype='int32', name='main_input')
    # 该嵌入层将输入序列编码为密集的512维向量序列。
    x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
    
    # LSTM将把向量序列转换为包含关于整个序列的信息的单个向量
    lstm_out = LSTM(32)(x)
    

    在这里,我们插入辅助损失,使得即使在模型主损失很高的情况下,LSTM 层和 Embedding 层都能被平稳地训练。

    auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
    

    此时,我们将辅助输入数据与 LSTM 层的输出连接起来,输入到模型中:

    auxiliary_input = Input(shape=(5,), name='aux_input')
    x = keras.layers.concatenate([lstm_out, auxiliary_input])
    
    # 堆叠多个全连接网络层
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    x = Dense(64, activation='relu')(x)
    
    # 最后添加主要的逻辑回归层
    main_output = Dense(1, activation='sigmoid', name='main_output')(x)
    

    然后定义一个具有两个输入和两个输出的模型:

    model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])
    

    现在编译模型,并给辅助损失分配一个 0.2 的权重。如果要为不同的输出指定不同的 loss_weightsloss,可以使用列表或字典。 在这里,我们给 loss 参数传递单个损失函数,这个损失将用于所有的输出。

    model.compile(optimizer='rmsprop', loss='binary_crossentropy',
                  loss_weights=[1., 0.2])
    

    我们可以通过传递输入数组和目标数组的列表来训练模型:

    model.fit([headline_data, additional_data], [labels, labels],
              epochs=50, batch_size=32)
    

    由于输入和输出均被命名了(在定义时传递了一个 name参数),我们也可以通过以下方式编译模型:

    model.compile(optimizer='rmsprop',
                  loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
                  loss_weights={'main_output': 1., 'aux_output': 0.2})
    
    # 然后使用以下方式训练:
    model.fit({'main_input': headline_data, 'aux_input': additional_data},
              {'main_output': labels, 'aux_output': labels},
              epochs=50, batch_size=32)
    

    共享网络层

    函数式 API 的另一个用途是使用共享网络层的模型。我们来看看共享层。
    来考虑推特推文数据集。我们想要建立一个模型来分辨两条推文是否来自同一个人(例如,通过推文的相似性来对用户进行比较)。
    实现这个目标的一种方法是建立一个模型,将两条推文编码成两个向量,连接向量,然后添加逻辑回归层;这将输出两条推文来自同一作者的概率。模型将接收一对对正负表示的推特数据。
    由于这个问题是对称的,编码第一条推文的机制应该被完全重用来编码第二条推文。这里我们使用一个共享的 LSTM 层来编码推文。
    让我们使用函数式 API 来构建它。首先我们将一条推特转换为一个尺寸为 (140, 256) 的矩阵,即每条推特 140 字符,每个字符为 256 维的 one-hot 编码 (取 256 个常用字符)。

    import keras
    from keras.layers import Input, LSTM, Dense
    from keras.models import Model
    
    tweet_a = Input(shape=(140, 256))
    tweet_b = Input(shape=(140, 256))
    

    要在不同的输入上共享同一个层,只需实例化该层一次,然后根据需要传入你想要的输入即可:

    # 这一层可以输入一个矩阵,并返回一个 64 维的向量
    shared_lstm = LSTM(64)
    
    # 当我们重用相同的图层实例多次,图层的权重也会被重用 (它其实就是同一层)
    encoded_a = shared_lstm(tweet_a)
    encoded_b = shared_lstm(tweet_b)
    
    # 然后再连接两个向量:
    merged_vector = keras.layers.concatenate([encoded_a, encoded_b], axis=-1)
    
    # 再在上面添加一个逻辑回归层
    predictions = Dense(1, activation='sigmoid')(merged_vector)
    
    # 定义一个连接推特输入和预测的可训练的模型
    model = Model(inputs=[tweet_a, tweet_b], outputs=predictions)
    
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    model.fit([data_a, data_b], labels, epochs=10)
    

    让我们暂停一会,看看如何读取共享层的输出或输出尺寸。

    层「节点」的概念

    每当你在某个输入上调用一个层时,都将创建一个新的张量(层的输出),并且为该层添加一个「节点」,将输入张量连接到输出张量。当多次调用同一个图层时,该图层将拥有多个节点索引 (0, 1, 2…)。
    在之前版本的 Keras 中,可以通过 layer.get_output()来获得层实例的输出张量,或者通过 layer.output_shape来获取其输出形状。现在你依然可以这么做(除了 get_output()已经被 output属性替代)。但是如果一个层与多个输入连接呢?
    只要一个层只连接到一个输入,就不会有困惑,.output会返回层的唯一输出:

    a = Input(shape=(140, 256))
    lstm = LSTM(32)
    encoded_a = lstm(a)
    assert lstm.output == encoded_a
    

    但是如果该层有多个输入,那就会出现问题:

    a = Input(shape=(140, 256))
    b = Input(shape=(140, 256))
    
    lstm = LSTM(32)
    encoded_a = lstm(a)
    encoded_b = lstm(b)
    
    lstm.output
    >> AttributeError: Layer lstm_1 has multiple inbound nodes,
    hence the notion of "layer output" is ill-defined.
    Use `get_output_at(node_index)` instead.
    

    好吧,通过下面的方法可以解决:

    assert lstm.get_output_at(0) == encoded_a
    assert lstm.get_output_at(1) == encoded_b
    

    input_shapeoutput_shape这两个属性也是如此:只要该层只有一个节点,或者只要所有节点具有相同的输入/输出尺寸,那么「层输出/输入尺寸」的概念就被很好地定义,并且将由 layer.output_shape/ layer.input_shape返回。但是比如说,如果将一个 Conv2D 层先应用于尺寸为 (32,32,3) 的输入,再应用于尺寸为 (64, 64, 3) 的输入,那么这个层就会有多个输入/输出尺寸,你将不得不通过指定它们所属节点的索引来获取它们:

    a = Input(shape=(32, 32, 3))
    b = Input(shape=(64, 64, 3))
    
    conv = Conv2D(16, (3, 3), padding='same')
    conved_a = conv(a)
    
    # 到目前为止只有一个输入,以下可行:
    assert conv.input_shape == (None, 32, 32, 3)
    
    conved_b = conv(b)
    # 现在 `.input_shape` 属性不可行,但是这样可以:
    assert conv.get_input_shape_at(0) == (None, 32, 32, 3)
    assert conv.get_input_shape_at(1) == (None, 64, 64, 3)
    
    展开全文
  • 采用密集连接网络结构,充分利用每层网络提取的特征,减少网络推理时间;采用具有更大感受野的扩张块结构;使用扩张块结构和反卷积网络结构将浅层特征图和深层特征图进行信息融合,从而增强遥感图像中多尺度目标的检测...
  • 主要是将SE模块融合到密集连接模块,并使用共享显存的方式减少显存的大小。
  • ©PaperWeekly 原创 ·作者|蔡晞阳学校|北京交通大学研究方向|时间序列分析与挖掘‍‍本文介绍一篇北京交通大学网络科学与智能系统研究所于计算机领域顶级会议 ACM MM 202...

    ©PaperWeekly 原创 · 作者|蔡晞阳

    学校|北京交通大学

    研究方向|时间序列分析与挖掘

    本文介绍一篇北京交通大学网络科学与智能系统研究所于计算机领域顶级会议 ACM MM 2020 发表的论文,该研究提出了一种基于注意力机制的 3D DenseNet 对多媒体刺激产生的情感脑电信号进行分类,该模型在统一的框架下同时提取数据中的空间、频率、时间特征;并且设计了一种 3D 注意机制来自适应地探索具有判别力的局部模式提升情绪分类效果,在现有的多个数据集上分类表现均为最优。该文提出的模型是一个多变量脑电信号的通用框架,可以被拓展到其余信号分类任务中。

    论文标题:

    SST-EmotionNet: Spatial-Spectral-Temporal based Attention 3D Dense Network for EEG Emotion Recognition

    论文链接:

    https://dl.acm.org/doi/abs/10.1145/3394171.3413724

    代码链接:

    https://github.com/ziyujia/SST-EmotionNet

    论文作者主页:

    https://ziyujia.github.io/

    背景简介

    情绪会影响人类的行为,且在日常生活中发挥着重要作用。许多精神疾病与情绪有关,例如自闭症和抑郁症。因此,情绪常被用作评估患者精神障碍的参考。越来越多的研究人员专注于针对特定刺激模式引起的不同情绪的脑电图分析。研究主要集中在使用多媒体材料(包括图像,声音,文本等)设计实验来刺激大脑并暴露其认知活动以进行情感分类。

    动机

    2.1 挑战

    2.1.1 挖掘脑电信号时-频-空特征的互补性

    现存的脑电情绪模型大多仅单独使用了脑电信号的时域、频域、空域信息或是以上两种特征的组合。这些模型忽略了脑电信号时-频-空特征之间的互补性,会在一定程度上限制脑电分类模型的性能表现。如何利用脑电信号中时-频-空特征之间的互补性,这是一个挑战。

    2.1.2 捕获时-频-空特征之间的局部特征

    脑电信号的时-频-空特征中会存在一些反映大脑情绪的局部特征。如图中的红框所示,受试者处于积极情绪时,大脑颞叶在频段下的激活程度会比消极时更高。这些局部特征的存在有助于情绪的识别。因此,如何捕获情绪识别任务中脑电信号的局部时-频-空特征是另一个挑战。

    2.2 贡献

    1. 基于构建的脑电的时-频-空特征,我们提出了一种双流 3D 密集连接网络,在统一的网络框架下融合了脑电信号的时-频-空特征;

    2. 我们设计了一种并行的时-频-空注意力机制,用于动态捕获在不同脑区、频段、时间之间的局部判别特征;

    3. 在基准数据集的实验结果表明,提出的 SST-EmotionNet 优于传统的基线方法,取得了 SOTA 的性能。

    数据表示与问题定义

    脑电信号的 3D 表示的过程如图。具体而言,在本研究中,定义 为长为 个时间点的 个 EEG 电极的数据。

    利用各个电极的空间位置信息,我们 将变换成2D时间平面图 , 分别为 2D 平面图的高与宽。将所有时间点下形成的 个 2D 平面图堆叠起来,我们能够得到信号的 3D 时空表示:

     

    我们定义  为包含了 B 个频段的 EEG 信号的频域特征。其中, 为在频段 下的所有电极的数据。

    与时域同理, 会被变换成 2D 频域平面图 。将所有频段下形成的 个2D平面图堆叠起来,我们能够得到信号的 3D 频空表示

    此处,我们使用了 5 个频段的 EEG 频域特征,即

    EEG 情绪识别问题被定义如下,模型需要学习一个映射函数 ,将输入映射到对应的情绪标签:

    此处 表示映射函数, 表示情绪的分类标签。

    SST-EmotionNet

    SST-EmotionNet 的总体架构如图所示。我们总结了本文模型的四大关键点:

    1. 基于构建的脑电 3D 时-频-空特征,在一个统一的网络框架下融合了脑电信号的时-频-空特征;

    2. 提出了一种并行的空-频/时注意力机制,用于动态捕获在不同脑区、频段、时间中的局部判别特征;

    3. 设计了 3D 密集连接模块和过渡层帮助特征重用,加强特征传播过程,以达到更高的模型效率;

    4. 使用伪 3D 模块提高 3D 卷积的内存效率与计算效率。

    4.1 空-频/时注意力机制

    脑电信号在不同情绪状态下的时-频-空特征激活中且存在一些有判别力的局部特征。我们设计了一种空-频/时注意力机制(SST-Attention)用于动态捕获这些有价值的局部特征。SST-Attention 由两个子组件构成:空间注意力机制与频段/时间注意力机制。

    由于空-频注意力机制与空-时注意力机制在结构上较为相似,此处我们将以空-频注意力机制为例进行展示。空-频注意力机制组件的结构如图所示。首先,跨通道的全局池化(channel-wise global average pooling, cGAP)被用于减少计算成本,它被定义如下:

    其中, 在通道维度 上退化可得到 表示 cGAP 函数; 表示在张量 处的跨通道数据向量。

    4.1.1 空间注意力机制

    空间注意力机制用于动态关注空间上对情绪识别任务有价值的大脑区域。最开始,跨频段全局池化(band-wise global average pooling, bGAP)将用于退化频段维度,其过程定义如下:

    其中 表示频域特征在空间上的分布情况,它由 退化频段维度 得到; 表示 bGAP 函数; 表示一个在张量 处的一个包含着跨频段数据的向量。

    随后,空间注意力矩阵将由一个带有 激活的全连接层得到:

    其中 为可学习的参数; 为归一化后的 2D 空间注意力矩阵。

    4.1.2 频/时注意力机制

    为了动态捕获不同频带、时间点中对情绪识别有辨识度的特征,我们设计了频/时注意力。以频域注意力机制为例,我们首先对输入的张量作空间全局池化(spatial-wise global average pooling, sGAP)用于退化空间维度,其过程定义如下:

    其中, 表示频域特征在不同频带上的分布情况,它由 退化空间维度 得到; 表示 sGAP 函数; 表示 上第 个频带上对应的平面。

    而后,频域注意力矩阵将由一个带有 激活的全连接层得到:

    其中 和  为可学习参数; 为归一化后的频域注意力矩阵。

    在得到了空间注意力矩阵 与频域注意力矩阵 以后,频-空注意力机制被定义如下:

    其中 代表逐元素相乘操作。在乘积操作过程中,频域注意力与空间注意力的数值将会分别沿着空间维度与频域维度被广播。 为空-频/时注意力机制的输出张量。

    4.2 3D密集连接模块

    为了加强特征传播、达到更好的参数效率,受到 2D DenseNet 的启发,我们设计了一种 3D 密集连接模块(3D Densely Connected Module, 3DCM)。每个 3DCM 由若干个密集连接的伪 3D 卷积组成。频-空流中的 3DCM 结构如图所示。

    密集连接:3DCM 中采用了密集连接机制。对于该模块内的第 层,它将前序的所有层的特征图作为输入:

    其中 表示 进行拼接; 表示每层内进行的伪 3D 卷积。

    伪 3D 卷积:传统的 3D 卷积核为 ,其中 为卷积核在空间维度的边长、 为频/空维度的长度,而传统 3D 卷积的计算开销较大。为了减少计算开销,伪 3D 卷积将传统的 的 3D 卷积核分解为了等价于空域上 2D 卷积的 卷积核的与时/频域上的 1D 卷积的 卷积核。为了加快计算速度,我们在 3DCM 中使用伪 3D 卷积代替了传统的 3D 卷积操作。这样一来,前面的 可被定义为:

    其中 表示伪 3D 卷积模块的输入; 表示捕获空间特征的 2D 卷积; 表示捕获频域或时域 EEG 特征的 1D 卷积。


    4.3 过渡层

    为了提高模型的紧凑性,我们采用了 DenseNet 的一个重要组成部分——过渡层。过渡层通过减少特征图的数量使模型变得紧凑。过渡层由一个 Batch Normalization 层、一个 的卷积层、一个 的平均池化层构成。 的卷积层被用于减少特征图的数量,平均池化层用来减小特征图的大小。若一个 3DCM 包含 个特征图,则跟随它的过渡层将会输出 个特征图,其中 被称为压缩率。

    4.4 融合分类层

    SST-EmotionNet 从频空流中提取脑电信号的频空特征,并从时空流中提取脑电信号的时空特征。频空流和时空流的输出被融合层所融合,从而进行高精度分类。融合层由连接层和具有激活的完全连接层组成。

    实验

    5.1 数据集

    我们在 SEED(SJTU Emotion EEG Dataset)与 SEED-IV 数据集上评估了我们提出的模型。SEED 数据集包含来自 15 名受试者在 3 个时间段内观看的 15 个能够诱发 3 种情绪电影片段的 EEG 记录;SEED-IV 数据集则包含来自 15 名受试者在 3 个时间段内观看的 15 个能够诱发 4 种情绪电影片段的 EEG 记录。EEG 信号在 5 个频带下的差分熵特征(differential entropy, DE)被提取作为输入的频域特征。

    5.2 结果

    我们与 8 种 Baseline 方法进行了比较,结果如表 2 所示:

    SST-EmotionNet 在两个数据集上均取得了优于所有基线方法的性能。我们推测模型分类性能提升原因有以下几点:

    1. 不同于现有的方法,SST-EmotionNet 同时捕获脑电信号的空间、频率、时间特征,并利用了各种特征之间的互补性进行情绪分类;

    2. 空-频/时注意力机制的引入使模型更专注于对情绪识别有辨识力的时-频-空局部模式的识别,提升了分类表现。

    5.3 消融实验

    为了进一步验证我们模型各个组件的有效性,我们设计了一系列消融实验。

    双流消融: 我们首先将双流的模型结构消融成了单流的模型结构,实验结果如图所示:

    在使用双流模型的情况下,模型的准确率能够比单独使用时-空、频-空流的模型分别高出 9.48% 与 3.51%。该结果表明利用不同特征之间的互补性能够有效提高分类准确率。

    注意力机制消融: 我们对 SST-Attention 的两个子组件分别进行了消融,实验结果如图所示:

    在消融各个注意力机制时,各类评价指标均有下降。如仅使用时/频注意力机制的模型比原模型的分类准确率下降了 1.94%,仅使用空间注意力机制的模型则下降了 3.30%。该实验结果表明了 SST-Attention 模块能够捕获有价值的局部特征从而提高模型的分类性能。

    结论

    本文提出了一种脑电情绪识别模型 SST-EmotionNet,该模型使用双流的结构同时捕获脑电信号具有互补性的空间、频率、时间三类特征;同时,设计了一种空-频/时注意力机制,使该模型能够动态关注一些对情绪识别任务较有辨识度的时-频-空局部模式。在公开的脑电情绪识别数据集 SEED 与 SEED-IV 上的实验表明,该模型有着出色的性能优于传统的基线方法。此外,该文提出的模型是一个多变量生理时间序列的通用框架,未来可以应用于睡眠分期、疲劳驾驶监测等相关领域中。

    更多阅读

    ????

    现在,在「知乎」也能找到我们了

    进入知乎首页搜索「PaperWeekly」

    点击「关注」订阅我们的专栏吧

    关于PaperWeekly

    PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

    展开全文
  • Sina Weibo:小锋子Shawn Tencent E-mail:403568338@qq.com ... ICLR2018 Oral论文 [1] Multi-Scale Dense Networks for Resource Efficient Image Class...

    Sina Weibo:小锋子Shawn
    Tencent E-mail:403568338@qq.com
    http://blog.csdn.net/dgyuanshaofeng/article/details/80370826

    ICLR2018 Oral论文

    [1] Multi-Scale Dense Networks for Resource Efficient Image Classification 2017 [paper]

    展开全文
  • 密集连接网络通过密集连接通路探索新特征,但有高冗余度。 3、论文从数学表达上对ResNet、DenseNet和HORNN的关系进行了表示,经证明,当连接在层中共享时残差网可看作密集连接网络,当权重在各步中共享时密集连接...
  • 泛连接的密集连接卷积网络的新架构
  • 该算法由生成网络和判别网络组成,在生成网络结构中,将原始低分辨率图像作为网络的输入,为了实现对特征的充分利用,采用密集连接方式将浅层网络的特征输送到深层网络结构的每一层,有效避免图像特征的丢失。并在末端...
  • 本文提出了一种使用反馈自校正系统与密集连接卷积网络相结合的水质监测方法。 我们找到了一种有效的方法来校正模型输出,并创新了生物水质监测方法。 鱼类运动轨迹是所有文献中所使用的各种水质分类特征的综合表达,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 678
精华内容 271
关键字:

密集连接网络