Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 注意力是您所需要的,只保留视频分类的编码部分_Python_Tensorflow_Keras - Fatal编程技术网

Python 注意力是您所需要的,只保留视频分类的编码部分

Python 注意力是您所需要的,只保留视频分类的编码部分,python,tensorflow,keras,Python,Tensorflow,Keras,我试图修改一个代码,该代码可以通过以下方式找到,即提议的与本文相关的变压器模型:仅保留整个变压器模型的编码器部分。此外,我想修改网络的输入,而不是将文本序列修改为来自视频的图像序列(或者更好地提取图像特征)。从某种意义上说,我想从我的输入中找出哪些帧彼此相关,并将这些信息编码到一个输出中,嵌入方式与Transformers模型相同 所提供链接中的项目主要执行序列转换。输入是一种语言的文本,输出是另一种语言的文本。该模型的主要形成过程发生在生产线上。初始化模型并编译模型的地方。对我来说,我想做一些

我试图修改一个代码,该代码可以通过以下方式找到,即提议的与本文相关的
变压器
模型:仅保留整个
变压器
模型的
编码器
部分。此外,我想修改
网络的输入
,而不是将文本序列修改为来自视频的图像序列(或者更好地提取图像特征)。从某种意义上说,我想从我的输入中找出哪些帧彼此相关,并将这些信息编码到一个输出中,嵌入方式与
Transformers
模型相同

所提供链接中的项目主要执行序列转换。输入是一种语言的文本,输出是另一种语言的文本。该模型的主要形成过程发生在生产线上。初始化模型并编译模型的地方。对我来说,我想做一些事情,比如:

#414-416 
self.encoder = SelfAttention(d_model, d_inner_hid, n_head, layers, dropout)
#self.decoder = Decoder(d_model, d_inner_hid, n_head, layers, dropout)
#self.target_layer = TimeDistributed(Dense(o_tokens.num(), use_bias=False))
#434-436
enc_output = self.encoder(src_emb, src_seq, active_layers=active_layers)
#dec_output = self.decoder(tgt_emb, tgt_seq, src_seq, enc_output, active_layers=active_layers)  
#final_output = self.target_layer(dec_output)
此外,由于我想使用
LSTM
和密集层(使用分类优化调整整个
编码
过程)将
编码器
的输出(即
多头注意力
位置前馈
的输出)结合起来。因此,我在定义模型时添加以下层:

self.lstm = LSTM(units = 256, input_shape = (None, 256), return_sequences = False, dropout = 0.5)
self.fc1 = Dense(64, activation='relu', name = "dense_one")
self.fc2 = Dense(6, activation='sigmoid', name = "dense_two")
然后使用以下代码将
编码器的输出按行传递:

enc_output = self.lstm(enc_output)
enc_output = self.fc1(enc_output)
enc_output = self.fc2(enc_output)
def get_loss(y_pred, y_true):

    y_true = tf.cast(y_true, 'int32')
    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred)
    mask = tf.cast(tf.not_equal(y_true, 0), 'float32')
    loss = tf.reduce_sum(loss * mask, -1) / tf.reduce_sum(mask, -1)
    loss = K.mean(loss)
    return loss

loss = get_loss(enc_output, tgt_seq_input)
self.ppl = K.exp(loss)
现在,我想替换Github代码提供的文本数据的视频数据具有以下维度:
Nx10x256
其中N是样本数,10是帧数,
256
是每个帧的特征数。我在理解代码的某些部分时遇到了一些困难,为了成功地修改它以满足我的需要。我想,现在嵌入层对我来说不再是必要的,因为它与文本分类和NLP相关

此外,我需要将输入修改为如下内容:

src_seq_input = Input(shape=(None, 256,), dtype='float32') # source input related to video
tgt_seq_input = Input(shape=(6,), dtype='int32') # the target classification size (since I have 6 classes)
我需要跳过或修改代码的其他哪些部分?下一行中使用的
PosEncodingLayer
有什么用处:

self.pos_emb = PosEncodingLayer(len_limit, d_emb) if self.src_loc_info else None
我的情况需要吗?我能跳过它吗

在修改代码后,我注意到当我运行代码时,我可以从
def get_loss(y_pred,y_true)
检查loss函数,但是,在我的情况下,为同样返回准确性的分类任务定义损失是至关重要的。使用提供的代码,我如何做到这一点

编辑: 我必须补充一点,我将我的输入视为初始NLP代码嵌入层的输出。因此,对我来说(在为我工作的代码版本中):

我将
src\u emb
视为我的输入,完全忽略
src\u seq

编辑:

计算损失的方法是使用以下代码:

enc_output = self.lstm(enc_output)
enc_output = self.fc1(enc_output)
enc_output = self.fc2(enc_output)
def get_loss(y_pred, y_true):

    y_true = tf.cast(y_true, 'int32')
    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred)
    mask = tf.cast(tf.not_equal(y_true, 0), 'float32')
    loss = tf.reduce_sum(loss * mask, -1) / tf.reduce_sum(mask, -1)
    loss = K.mean(loss)
    return loss

loss = get_loss(enc_output, tgt_seq_input)
self.ppl = K.exp(loss)
编辑:
正因为如此,损失函数(sparse\u softmax\u cross\u entropy\u with\u logits)返回损失分数。即使整个过程都是关于分类的。我如何进一步调整我的系统,使其返回准确度

恐怕这种方法行不通

视频数据在相邻帧之间具有海量相关性,每一帧与上一帧非常相似。对先前帧的依赖性也较弱,因为对象往往会以类似的方式相对于其他对象继续移动。现代视频格式使用这种冗余来实现高压缩率

这意味着您的人际网络将对上一张图片产生非常强烈的关注。正如您所建议的,您可以对相隔几秒钟的帧进行子采样,以消除对前一帧的大部分依赖,但是如果您这样做,我真的想知道您是否会在结果中找到结构?即使你给它输入手工编码的特征,关于哪些特征将处于运动状态,哪些不处于运动状态,也几乎没有一般规则,那么你的注意力网络可以学习什么样的结构呢


处理视频的问题与处理句子完全不同。视频具有非常复杂的元素(图片),这些元素随着时间的推移基本上是静态的,并且以非常简单的方式在几帧内具有局部可预测的运动。文本在复杂的句子结构中有简单的元素(单词),复杂的依赖关系延伸到许多单词。这些差异意味着它们需要根本不同的方法。

首先,正如你在上一个问题中所说,你删除了什么,你必须首先定义,你想选择什么来实现分类任务的目标。没有此目标(标签),您的模型无法分类。那么,分类器的目标是什么?根据此目标(标签)的类型,我们可以向前选择丢失函数。我丢失的目标是我用于视频分类的标签。他们拥有视频样本的大小,每个样本有6个维度(每个类别的分类编码)。在代码中,我发布的是tgt_seq_输入。@Geeocode我正在比较tgt_seq_输入和enc_输出,以计算损失。好的,我理解。视频帧将按顺序馈送,即每帧相同视频的逐帧馈送?那么下一个视频等等?@Geeocode是的,没错。所以我假设每20帧有10000个视频,每一帧有256个特征。对于每个示例视频,我都有一个注释。现在,我的主要困惑是我是否可以跳过PosEncodingLayers,以及主代码中的丢失是否对我有意义。一种克服相邻帧问题的方法,正如我所认为的,是从整个视频中抽取2-3秒10帧(90帧中)的子样本。这样,相邻帧具有不同的8帧和n