精华内容
下载资源
问答
  • 2021-12-07 21:58:56
    clear all;
    str = ['d', 'a', 'c', 'b', 'b', 'c', 'b', 'b', 'd', 'e'];
    %统计字符串中的字符种类,调用函数,放入数组b中
    string = unique(str); 
    %统计每种字符的个数,放入数组a中
    for i = 1 : length(string)
        num(i) = length(strfind(str, string(i)));
    end
    %排序,若数组b中的第一个元素为字符‘a’, 则数组a中的第一个元素为字符‘a’出现的次数
    for i = 1 : length(num)-1
        for j = i+1 : length(num)
            if num(i) < num(j)
                t1 = num(i); num(i) = num(j); num(j) = t1;
                t2 = string(i); string(i) = string(j); string(j) = t2;
            end
        end
    end
    string
    num
    H = 0; %熵
    %统计每种字符出现的频率,放入数组P中
    for i = 1 : length(num)
        P(i) = num(i) / sum(num);
        H = H + P(i) * log2( 1/P(i) );
    end
    P
    %计算码字长度 Ni
    N = [ ];
    for i = 1 : length(P)
        cnt = 1;
        while true
            if P(i)/2 <= power(2,-1*cnt) && power(2,-1*cnt) <= P(i)
                break;
            end
            cnt = cnt + 1;
        end
        N = [N, cnt];
    end
    N
    %计算累加概率 Ai
    A = 0;
    for i = 2 : length(string)
        A(i) = A(i-1) + P(i-1);
    end
    A
    L = 0; %平均码长
    %转换为二进制
    for i = 1 : length(A)
        tmp = A(i);
        code = [];
        for j = 1 : N(i) %每个字符的编码长度 = Ni
            if tmp >= power(2, -1*j) 
                tmp = tmp - power(2, -1*j);
                code = [code '1'];
            else
                code = [code '0'];
            end
        end
        fprintf("%c:%s\n", string(i), code);
        L = L + P(i) * length(code);
    end
    fprintf("平均码长 L = %f\n", L);
    fprintf("图像熵 H = %f\n", H);
    fprintf("编码效率η = %f\n", H/L);
    
    
    

    更多相关内容
  • 信息论测试题讲解

    2022-04-16 10:08:04
    Y|Z)=H(X|Z)+H(Y|Z)-H(XY|Z) 哈夫曼编码 q=(r-1)*θ+r 编码效率 η=(H(s)/log(r))/L craft不等式 知识点 一般情况下,哈夫曼编码的效率大于香农编码和费诺编码 在编m(m>2)进制的哈夫曼码时,要考虑是否需要...

    损失熵

    信道疑义度(channel equivocation)也称为损失,是信息传输理论的基本概念之一,表示当信道输出端Y接收到全部的输出符号后,对输入端X尚存的平均不确定性。这个对X尚存的不确定性是由于传达过程中信道的干扰机制造成的。

    剩余度

    相对熵=H(x)/Hmax(x)

    1与相对熵之差定义为剩余度,用E表示

    E=剩余度=1-[H(x)/Hmax(x)]

    公式简化算法

    如:

    I(X;Y|Z)=H(X|Z)+H(Y|Z)-H(XY|Z)

    可以看作 I(X;Y)=H(X)+H(Y)-H(XY)

    等书写完成后再将条件Z补上

    I(X;Y|Z)=H(X|Z)+H(Y|Z)-H(XY|Z)

    哈夫曼编码

    q=(r-1)*θ+r

    编码效率 

    η=(H(s)/log(r))/L

    craft不等式

    知识点

    一般情况下,哈夫曼编码的效率大于香农编码和费诺编码

    在编m(m>2)进制的哈夫曼码时,要考虑是否需要增加概率为0的码字,以使平均码长最短

    对于香农编码、费诺编码和哈夫曼编码,编码方法惟一的是香农编码

    连续信源的相对熵不一定具有非负性

    连续信源和离散信源的熵都具有可加性

    连续信源和离散信源的平均互信息都具有非负性

    当信源固定时,平均互信息量是信道传递概率的下凸函数

    平均互信息量不可能为负值

    多看维拉图的形式

    展开全文
  • 字节跳动人工智能岗

    千次阅读 2020-04-24 15:25:33
    我的面试经(只记得没回答出来的) 讲一下Adam,手撕三个算法题(凑...一般来说是建议选η=0.001之类的, 注意βt1,βt2中的t是参与指数运算的 最火的NLP模型 贝叶斯模型 大数据是否了解 使用tensorflow实现Kmeans算法 ...

    我的面试经(只记得没回答出来的)
    讲一下Adam,手撕三个算法题(凑零钱;输出给定数字下一个比它大的数字;赌徒获胜概率计算【有两个技巧相当的赌徒A,B,他们赌博胜率为0.5,现在设定这样的获胜规则:A只要赢了2局或以上就获胜,B只要赢了3局或以上就获胜】)
    其他人面经

    1. 有哪些优化函数,比较不同
      优化方法分为直接法和迭代法,其中迭代法包括一阶法(梯度下降法)和二阶法(牛顿法),基于梯度法的缺陷,出现很多改进算法,比如针对考虑全部训练数据计算梯度计算量很大,可以考虑使用随机梯度下降(方差大,迭代算法稳定性差),进一步还可以使用小批量梯度下降(m一般取2的幂),针对山谷和鞍点,可以考虑动量方法(考虑上一步,即惯性保持,一阶矩估计),adagrad(考虑周围环境,采用了历史梯度的平方和来衡量不同参数的梯度的稀疏性,二阶矩估计),adam(综合前两者)这三种改进方法。
      对比:adagrad相比于sgd和momentum更加稳定,即不需要怎么调参。而精调的sgd和momentum系列方法无论是收敛速度还是precision都比adagrad要好一些。在精调参数下,一般Nesterov优于momentum优于sgd。而adagrad一方面不用怎么调参,另一方面其性能稳定优于其他方法。

    2. 提高泛化能力的方法(和防止过拟合的含义相同)
      使用更小的batch size,正则化模型,减少模型参数,扩大数据集,提早结束训练,droupot,batch normalize,集成学习

    3. Dropout具体的实现与原理(2次),如何保证训练测试的一致性
      Dropout:前向传播时,让某个神经元的激活值以一定的概率p停止工作(让它的激活函数值以概率p变为0),使得模型不会依赖有些局部特征,增强模型的泛化能力。每一步只更新未被暂停的神经元的参数,他能解决过拟合的原因:取平均的作用,减少神经元之间复杂的共适应关系,相当于生物进化中的基因突变
      保证训练测试的一致性:

    4. GAN的应用场景;文字生成除了GAN还可以使用什么

    5. 介绍adam
      Adam是一种一阶迭代的梯度下降算法。结合了动量法和adagrad算法,计算梯度时既考虑了惯性保持,也考虑了历史信息(环境因素)。当前时刻的梯度更新利用了上一时刻的平方梯度vt的指数衰减均值vt和上一时刻的梯度mt的指数衰减均值mt。η是学习步长, 剩下的三个参数取值的建议是β1=0.9,β2=0.999,ϵ=10−8, 分母中的ϵ是为了防止除零. 其实这个步长的话,一般来说是建议选η=0.001之类的, 注意βt1,βt2中的t是参与指数运算的

    6. 最火的NLP模型

    7. 贝叶斯模型

    8. 大数据是否了解

    9. 使用tensorflow实现Kmeans算法
      https://blog.csdn.net/qq_21078557/article/details/85853198

    10. Tensorflow写KNN;KNN算法是否可微
      KNN算法分类模型的三要素:a:距离度量 b:K值的选择 c:分类决策的规则。
      https://blog.csdn.net/qq_35170267/article/details/84205585

    11. 写矩阵乘法;两个上三角矩阵相乘如何优化

    12. 介绍一下BERT的模型架构,多少层,怎么预训练,怎么feature based/fine-tune
      https://www.jianshu.com/p/160c4800b9b5
      模型架构:BERT的模型架构基于了Transformer,实现了多层双向的Transformer编码器
      关键技术
      1. Masked LM
      随机mask15%的词汇,使用其他词汇预测这些被mask的词汇,对于在原句中被抹去的词汇,80%情况下采用一个特殊符号[MASK]替换,10%情况下采用一个任意词替换,剩余10%情况下保持原词汇不变。这么做的主要原因是:在后续微调任务中语句中并不会出现[MASK]标记。预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇(10%概率),这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。
      2. 下一句预测:使用分割符
      论文给出的模型

    预训练过程:两个loss的计算(mask loss(输入BERT模型的最后一层encoder,输出遮蔽词预测任务的loss和概率矩阵),classification loss(输入BERT模型CLS的encoder,输出下一句预测任务的loss和概率矩阵)),total loss = mask loss + classification loss

    1. Mask Loss
      a.输入是BERT模型的最后一层sequence embeddings + masked_positions ==>通过gather函数将对应position上的embeddings聚集起来
      b.将上述gather到的embeddings + masked_lm_ids ==>得到每个mask的位置对应的loss
      c.上述的loss + masked_lm_weights ==>得到非padding部分的每个位置的loss
      d.从而再得到一个batch_size下的所有mask position的平均loss
    2. Classification Loss
      a.输入是BERT模型的最后一层pooled data, 即BERT模型最前面的[CLS]标志符的embedding
      b.上述embedding + next_sentence_labels ==>得到batch下的每个loss
      c.从而再得到一个batch_size下的平均loss
      微调过程

    优势:模型的主要创新点都在pre-traing方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。使用的是Transformer,相对于rnn而言更加高效、能捕捉更长距离的依赖。与之前的预训练模型相比,它捕捉到的是真正意义上的bidirectional context信息。
    缺点:1)[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;2)每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)
    13. 什么是self-attention,什么情况下要用,K、Q、V分别是啥
    计算attention时主要分为三步,如下图:将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention vector。 目前在NLP研究中,key和value常常都是同一个,即key=value。

    1. bagging boosting 的区别,谁是更关注方差 ,谁是更关注偏差;随机森林和boosting trees的区别
      bagging和boosting的区别:
      1)样本选择上:Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
      2)样例权重:Bagging:使用均匀取样,每个样例的权重相等。Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
      3)预测函数:Bagging:所有预测函数的权重相等。Boosting:每个弱分类器都有相应的权重,对于分类误差小(准确率达)的分类器会有更大的权重。
      4)并行计算:Bagging:各个预测函数可以并行生成。Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
      bagging是减少variance(方差),而boosting是减少bias(偏差):高方差是由于模型过于复杂,故而bagging可以解决过拟合问题,高偏差是由于模型过于简单,故而boosting可以解决欠拟合问题。Bagging通过再取样 (Bootstrap) 然后在每个样本上训练出来的模型取平均,所以降低了模型的variance;Boosting 则是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行加权,所以随着迭代不断进行,误差会越来越小,所以模型的 bias 会不断降低。
      随机森林(RF)和梯度提升决策树(GBDT)的区别:
      GBDT和随机森林最本质的区别是GBDT中的每一棵树学的是之前所有树结论和的残差,残差即指真实值减去预测值。
      详细来讲就是:1: 随机森林将多棵决策树的结果进行投票后得到最终的结果,对不同的树的训练结果也没有做进一步的优化提升,将其称为bagging算法。boosting算法是在迭代的每一步构建弱学习器来弥补原有模型的不足。 2: GBDT用到的是boosting算法,在迭代的每一步构建弱学习器弥补原有模型的不足。GBDT中的Gradient Boost就是通过每次迭代的时候构建一个沿梯度下降最快的方向的学习器。并且通过设置不同的损失函数可以处理各类学习任务(多分类、回归等)。

    2. 如何防止过拟合,项目中用过哪些手段
      扩张训练数据集,降低模型的复杂度,正则化方法(约束参数,比如Batch Normalization,参数范数惩罚等),集成学习(比如bagging),提前终止训练,dropout

    3. W2V 的原理 ,两种生成方式,W2V的思想到底是什么,为什么要这样做,W2V的缺点,W2V中所用的softmax比起普通softmax有何区别,为什么能减少计算量;Word2vec,fasttext,ELMo,GPT,BERT的区别
      W2v的原理与基本思想,缺点
      包括CBOW 和 Skip-grams,都是浅层神经网络,一个隐层,并且隐层没有激活函数,通过softmax归一化后输出向量,隐层的神经元的个数即为向量的维度,vector 向量其实就是隐藏层和输出层之间的权重矩阵 Hidden-Ouput Matrix。CBOW是给定上下文预测一个词的方法训练神经网络。Skip-gram是使用一个词预测上下文的方法训练神经网络。
      采用的softmax与普通的softmax的区别,减少计算量的原因
      Word2vec,fasttext,ELMo,GPT,BERT的区别
      关于词向量的表示方法:基于one-hot、tf-idf、textrank等的bag-of-words;主题模型:LSA(SVD)、pLSA、LDA;基于词向量的固定表征:word2vec、fastText、glove;基于词向量的动态表征:elmo、GPT、bert
      方法的特点:
      (1)One-hot 表示 :维度灾难、语义鸿沟;
      (2)分布式表示 (distributed representation) :矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大;基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题;word2vec、fastText:优化效率高,但是基于局部语料; glove:基于全局预料,结合了LSA和word2vec的优点;elmo、GPT、bert:动态特征;
      方法的对比:3
      1) Word2vec vs fasttext
      都可以无监督学习词向量, fastText训练词向量时会考虑subword;fastText还可以进行有监督学习进行文本分类,其主要特点:结构与CBOW类似,但学习目标是人工标注的分类结果;采用hierarchical softmax对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径;引入N-gram,考虑词序特征;引入subword来处理长词,处理未登陆词问题;两者都无法解决一词多义等问题(静态的词向量)。
      2) elmo vs GPT vs bert
      都是动态的词向量,从特征提取器和单/双向语言模型上对比如下
      (1)特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。
      (2)单/双向语言模型:GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。

    4. FM FFM deep FM
      解决特征组合问题

    5. 怎么做特征,onehot 特征多了会有什么问题,为什么有时会导致效果下降;特征选择的方法
      做特征(获取特征):
      One-hot:
      特征选择的方法:
      1) Filter(自变量和目标变量之间的关联):方差选择法(选出方差大于阈值的特征项);相关系数(根据各个特征对目标值的相关系数以及相关系数的P值选择);卡方检验(检验定性自变量对定性因变量的相关确定性);互信息(同卡方验证)
      2) Wrapper(通过目标函数来决定是否加入一个变量):递归特征消除法,使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练
      3) Embedded(学习器自身自动选择特征):正则化(L1,L2);决策树(熵,信息增益);深度学习

    6. 模型的容量问题
      指拟合各种函数的能力,容量低的模型可能很难拟合数据集,但容量高的模型可能会过拟合。
      改变模型容量的方法:控制模型的假设空间(学习算法可以选择为解决方案的函数集);添加正则项对模型进行偏好排除。

    7. resnet VGG介绍 主要特色
      经典的CNN网络架构,还包括AlexNet,GoogleNet。VGG分为VGG16和VGG19(网络的深度不同),结构为卷积与池化的叠加,最后再加两层全连接,然后softmax输出。它全部使用33的卷积核和22的池化核,通过不断加深网络结构来提升性能
      VGG特点:网络深,卷积核小(3X3卷积核,两个3x3卷积核相当于一个5x5卷积核,但前者比后者参数量少,并且可行进行更多地非线性变换,获得更多的复杂特征和特征组合),池化核小(与AlexNet的33池化核相比,VGG全部用的是22的池化层),全连接卷积。
      ResNet是对VGG19基础上进行的修改,使用stride=2进行subsampling,使用global average pool layer代替FC layer,引入了highway network结构,使网络变得更深。供给两个连续卷积层的输出,并分流(bypassing)输入进入下一层。
      特点:它相比之前NN的层数多了非常多,进行了Residual learning(残差学习,解决网络退化的问题)。网络较深,控制了参数数量。存在明显层级,特征图个数层层递进,保证输出特征的表达能力。使用较少池化层,大量采用下采样,提高传播效率。没有使用dropout,利用BM和全局平均池化进行正则化,加快训练速度。层数较高时减少了3x3卷积核的个数,用1x1卷积核控制3x3卷积的输入输出特征map的数量。

    8. max pooling 梯度传导
      最大池化的传导:满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0
      平均池化的传导:mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的

    9. 如何防止梯度消失,为什么会有梯度消失
      梯度消失产生的原因:神经网络反向传播过程中需要对激活函数求导,若导数小于1,那么随着网络层数的增加梯度值会呈现指数级别衰退,称为梯度消失,根本原因在于反向传播训练
      防止梯度消失:预训练加微调(先寻找局部最优,然后整合起来寻找全局最优),使用relu,leakrelu,elu系列激活函数(激活函数的导数为1),batch normalization(通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性,消除了w带来的放大缩小的影响),残差结构(使得求导的每一项都添加了一个常数项1),LSTM(通过门控控制导数不是0就是1)

    10. LightGBM, GBDT,XGBoost思想原理(2次),残差怎么用一次和二次梯度,分裂点怎么求。XGBoost实际使用中重要的超参数,目标函数,为什么lightGBM速度更快,其并行计算如何实现;XGBoost和GBDT的区别。
      LightGBM, GBDT,XGBoost思想原理:lightGBM是一个实现GBDT算法的框架,支持高效率的并行计算,速度快,消耗的内存小,准确率高,支持分布式,可以处理海量数据;GBDT是所有弱分类器的结果叠加等于预测值,然后下一个弱分类器去拟合误差函数对预测值的残差(预测值与真实值之间的误差,弱分类器可以是各种树);XGBoost(极端梯度提升),由很多CART回归树集成。
      XGBoost重要的超参数,目标函数:参数包括一般参数(设置学习器的类型),基学习器参数(设置基学习器的一些个性化参数),任务参数(根据任务,目的设置的参数),命令行参数(用于训练模型和导出模型);目标函数由训练误差和正则化两项组成。
      lightGBM速度快的原因:直方图算法,牺牲切分准确性换取训练速度以及节省内存空间消耗。采用了两个策略,分别为GOSS(样本采样,基于梯度的单边采样,对样本进行采样来计算梯度,梯度大的样本点对信息增益的影响大,下采样的时候保留这样的样本点)和EFB(特征抽样,互斥特征捆绑,使用基于直方图的方法将某些特征进行捆绑来降低特征的维度,从而减少寻找最佳切分点的消耗,)
      lightGBM的并行实现方案:包括特征并行和数据并行
      1) 特征并行:每个worker在基于局部的特征集合找到最优分裂特征;workder间传输最优分裂信息,并得到全局最优分裂信息;每个worker基于全局最优分裂信息,在本地进行数据分裂,生成决策树。
      2) 数据并行:LightGBM算法使用Reduce Scatter并行算子归并来自不同worker的不同特征子集的直方图,然后在局部归并的直方图中找到最优局部分裂信息,最终同步找到最优的分裂信息。除此之外,LightGBM使用直方图减法加快训练速度。我们只需要对其中一个子节点进行数据传输,另一个子节点可以通过histogram subtraction得到。LightGBM可以将传输代价降低为O(0.5 * #feature * #bin)。
      3) 并行投票:进一步减小了数据并行中额通信代价,通过两轮的投票来减小特征直方图中的通信消耗
      GBDT、XGBoost区别:
      1)GBDT是机器学习算法,XGBoost是该算法的工程实现。
      2)在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
      3)GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
      4)传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
      5)传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
      6)传统的GBDT没有设计对缺失值进行处理,XGBoost可以自动学习出它的分裂方向。XGBoost对于确实值能预先学习一个默认的分裂方向。
      7)Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)

    11. SVM处理异常值的方法

    12. 正则化的本质,L1正则化和L2正则化的区别(2次),为什么要用正则化
      正则化的本质:加入惩罚项,约束优化空间
      L1和L2的区别:他们都可以看做是损失函数的惩罚项,L1正则添加了Laplace先验(结构化风险项)是一个一范数;L2正则添加了Gaussian先验,是一个二范数。使用L1范数,可以使得参数稀疏化(权重稀疏),用L2范数,倾向于使参数稠密地接近于0(权重平滑)。L1减少的是一个常量,L2减少的是权重的固定比例
      正则化的目的是防止过拟合

    13. 介绍mapreduce和spark
      Mappreduce
      Spark

    14. Hive如何提高效率

    15. 机器学习流程的各个模块的理解,验证集和测试集的划分,区别;怎么论证现有的模型需要多少额外的标注数据

    16. 相关系数怎么计算,协方差和它的意义

    17. 分类问题的指标

    18. 解释MCMC采样

    19. Linux常用命令

    20. Sql查询成绩排名中的前三

    21. 解释极大似然估计,为什么概率是0.4

    22. 卷积神经网络在maxpooling处怎么反向传播误差;1*1的卷积核 有什么用;为什么选CNN不选RNN,loss的选择,MSE和MAE对学习结果的影响
      算法题:背包问题(多元一次方程的解的数目);二叉树的宽度;在数组中找到和为0的三元组;排序算法的各项对比(3次),堆排序找出topk的思路;有序数组中绝对值不相等的元素的个数;二分法;找出一颗完全二叉树最后一个节点,时间复杂度要求 logN的平方(2次);判断实时访问的ip一小时之内的访问次数是不是超过了10000.;分解质因数;判断单链表是否有环;字符串转数字,以及边界条件;搜索数组中的中位数,要求复杂度小于o(n/logn);排序数组中绝对值不同的个数;1,2,…,N中,字符1出现的次数;判断a+b>c?要考虑溢出;买卖股票;由长度为length的array表示的整数,允许相邻位数交换,求n步交换内能得到的最小整数;一亿个浮点数,大小不超过2^32,均匀分布在值域内,求最快的排序方法;求几何分布的期望

    展开全文
  • Abstract 传统的视频压缩方法使用预测编码架构并对相应的运动信息和残差信息进行编码。本文利用传统视频压缩方法中的经典体系结构和强大的神经网络非线性表示能力,提出了第一个端到端视频压缩深度模型,该模型联合...

    《DVC: An End-to-end Deep Video Compression Framework》

    论文点这里
    原作代码点这里
    TensorFlow开源实现OpenDVC

    Guo Lu, Wanli Ouyang, Dong Xu, Xiaoyun Zhang, Chunlei Cai, Zhiyong Gao
    CVPR 2019 (Oral)

    DVC是首个端到端的深度学习视频压缩框架,在深度学习视频压缩领域也常被视为基准算法,在它之后仍有多篇paper对其进行优化和改进,并且一些方法的代码也开源了,很值得学习。

    Abstract

    传统的视频压缩方法使用预测编码架构并对相应的运动信息和残差信息进行编码。本文利用传统视频压缩方法中的经典体系结构和强大的神经网络非线性表示能力,提出了第一个端到端视频压缩深度模型,该模型联合优化了视频压缩的所有模块。具体地,基于学习的光流估计被用来获得运动信息并重建当前帧。然后,采用两个自编码器样式的神经网络来压缩相应的运动和残差信息。所有模块都是通过单个损失函数共同学习的,其中,它们通过考虑减少压缩位数和提高解码视频质量之间的权衡来相互协作。实验结果表明,该方法在PSNR指标上可以优于广泛使用的视频编码标准H.264,在MS-SSIM指标上甚至可以与最新标准H.265媲美。

    1. Introduction

    现如今,视频内容贡献了80%以上的互联网流量[26],而且这一比例有望进一步提高。因此,在给定的带宽预算下,构建高效的视频压缩系统并生成更高质量的帧至关重要。另外,大多数与视频相关的计算机视觉任务(例如:视频目标检测或视频目标跟踪)对压缩视频的质量敏感,并且有效的视频压缩可能为其它计算机视觉任务带来好处。同时,视频压缩技术也有助于行为识别(action recognition)[41]和模型压缩(model compression)[16]。

    然而,在过去的几十年中,视频压缩算法[39、31]依靠手动设计的模块,例如基于块的运动估计和离散余弦变换(DCT)(原文:block based motion estimation and Discrete Cosine Transform (DCT)),来减少视频序列中的冗余。尽管每个模块都经过精心设计,但整个压缩系统并未进行端到端优化。 期望通过联合优化整个压缩系统来进一步提高视频压缩性能。

    最近,用于图像压缩的基于深度神经网络(DNN)的自动编码器[34,11,35,8,12,19,33,21,28,9]已获得与JPEG [37]、JPEG2000 [29]或BPG [1]等传统图像编解码器相当甚至更好的性能。一种可能的解释是,基于DNN的图像压缩方法可以利用大规模的端到端训练和高度非线性的变换,而传统方法则没有使用这种方法。

    但是,直接应用这些技术来构建用于视频压缩的端到端学习系统并非易事。首先,学习如何生成和压缩针对视频压缩量身定制的运动信息仍然是一个悬而未决的问题。视频压缩方法严重依赖运动信息来减少视频序列中的时间冗余。一种简单的解决方案是使用基于学习的光流来表示运动信息。然而,当前基于学习的光流方法旨在产生尽可能精确的流场。但是,对于特定的视频任务,精确的光流通常不是最优的[42]。此外,与传统压缩系统中的运动信息相比,光流的数据量显着增加,并且直接应用[39,31]中的现有压缩方法来压缩光流值将大大增加存储运动所需的位数信息。第二,目前尚不清楚如何通过最小化残差和运动信息的率-失真(rate-distortion)来构建基于DNN的视频压缩系统。率-失真优化(RDO,Rate-distortion optimization)的目的是在给出用于压缩的位数(或比特率)(bits (or bit rate))时,实现更高质量的重构帧(即失真更少)。RDO对于视频压缩性能很重要。为了利用基于学习的压缩系统的端到端训练能力,需要使用RDO策略来优化整个系统。

    在本文中,作者提出了第一个端到端深度视频压缩(DVC)模型,该模型可以共同学习运动估计、运动压缩和残差压缩。该网络的优点可总结如下:

    • 视频压缩中的所有关键组件,即运动估计、运动补偿、残差压缩、运动压缩、量化和比特率估计,都是通过端到端的神经网络实现的。

    • 视频压缩中的关键组件通过单个损失函数,在率-失真权衡的基础上进行联合优化,提高了压缩效率。

    • 传统的视频压缩方法和我们提出的DVC模型之间存在一对一的映射关系。这项工作为从事视频压缩、计算机视觉和深层模型设计的研究人员提供了一座桥梁。例如,可以很容易地将更好的光流估计和图像压缩模型插入到该框架中。从事这些领域的研究人员可以使用DVC模型作为未来研究的起点。

    实验结果表明,利用本文的神经网络方法对运动信息进行估计和压缩,可以显著提高压缩性能。当用PSNR衡量时,该框架优于广泛使用的视频编解码器H.264,当用多尺度结构相似性指数(MS-SSIM)衡量时,该框架与最新的视频编解码器H.265不相上下[38]。
    在这里插入图片描述

    2. Related Work

    2.1. Image Compression

    在过去的几十年里,人们提出了很多图像压缩算法[37,29,1]。这些方法严重依赖手工技术。例如,JPEG标准通过使用DCT将像素线性映射到另一个表示,并在熵编码之前量化相应的系数[37]。一个缺点是这些模块是单独优化的,可能无法达到最佳的压缩性能。

    近年来,基于DNN的图像压缩方法越来越受到关注[34,35,11,12,33,8,21,28,24,9]。在文献[34,35,19]中,利用递归神经网络(RNNs)建立了一种渐进式图像压缩方案。采用CNN的其它编码方式进行网络压缩。为了优化神经网络,文献[34,35,19]中的工作只是尽量减少原始帧和重构帧之间的失真(例如,均方误差,mean square error),而没有考虑用于压缩的比特数。[11,12,33,21]采用了率-失真优化技术,通过在优化过程中引入位数来提高压缩效率。为了估计比特率,在[28,21,24]中学习了自适应算术编码方法的上下文模型,而在[11,33]中使用了非自适应算术编码。此外,为了提高图像压缩性能,还提出了其他技术,如广义除法归一化(generalized divisive normalization)(GDN)[11]、多尺度图像分解(multi-scale image decomposition)[28]、对抗训练(adversarial training)[28]、重要性图(importance map)[21,24]和帧内预测(intra prediction)[25,10]。这些现有的工作是本文视频压缩网络的重要组成部分。

    2.2. Video Compression

    在过去的几十年里,人们提出了几种传统的视频压缩算法,如H.264[39]和H.265[31]。这些算法大多遵循预测编码结构。尽管它们提供了高效的压缩性能,但它们是手动设计的,不能以端到端的方式联合优化。

    对于视频压缩任务,已经提出了许多基于DNN的帧内预测和残差编码方法(intra prediction and residual coding)[13]、模式决策(mode decision)[22]、熵编码(entropy coding)[30]、后处理(post-processing)[23]。这些方法用来改善传统视频压缩算法中某一特定模块的性能,而不是建立端到端的压缩方案。在[14]中,Chen等,提出了一种基于块的视频压缩学习方法。然而,它不可避免地会在块之间的边界产生块度伪影(blockness artifact)。另外,他们利用先前重建的帧通过传统的基于块的运动估计传播的运动信息,这将降低压缩性能。Tsai等,提出了一种自动编码器网络来压缩特定领域视频的来自H.264编码器的残差[36]。这项工作没有使用深度模型进行运动估计、运动补偿或运动压缩。

    最相关的工作是[40]中基于RNN的方法,其中视频压缩被定义为帧插值(frame interpolation)。然而,他们的方法中的运动信息也是由传统的基于块的运动估计产生的,而这些运动估计是由现有的基于非深度学习的图像压缩方法编码的[5]。也就是说,运动估计和压缩不是通过深度模型来完成的,也不是与其它组件联合优化的。另外,文献[40]中的视频编解码器只着眼于使原始帧和重建帧之间的失真(即均方误差)最小化,而没有考虑训练过程中的率-失真权衡。相比之下,在本文网络中,运动估计和压缩是由DNN来实现的,DNN通过考虑整个压缩系统的率-失真权衡,与其它组件联合优化。

    2.3. Motion Estimation

    运动估计是视频压缩系统中的一个重要组成部分。传统的视频编解码器使用基于块的运动估计算法[39],该算法很好地支持硬件实现。

    在计算机视觉任务中,光流被广泛应用于时间关系的挖掘。近年来,人们提出了许多基于学习的光流估计方法[15,27,32,17,18]。这些方法激励我们将光流估计整合到我们的端到端学习框架中。与现有视频压缩方法中基于块的运动估计方法相比,基于学习的光流方法可以在像素级提供精确的运动信息,并且可以进行端到端的优化。然而,如果用传统的视频压缩方法对光流值进行编码,则需要更多的比特来压缩运动信息。

    3. Proposed Method

    Introduction of Notations.

      V = { x 1 , x 2 , . . . , x t − 1 , x t , . . . } \ V={x_1,x_2,...,x_{t-1},x_t,...}  V=x1,x2,...,xt1,xt,...,表示当前视频序列;
      x t \ x_t  xt,时间步长   t \ t  t处的原始帧;
      x ˉ t \ \bar{x}_t  xˉt,预测帧;
      x ^ t \ \hat{x}_t  x^t,重构/解码帧;
      r t \ r_t  rt,原始帧   x t \ x_t  xt和预测帧   x ˉ t \ \bar{x}_t  xˉt之间的残差(误差);
      r ^ t \ \hat{r}_t  r^t,表示重建/解码残差;

    为了减少时间冗余,需要运动信息。其中,   v t \ v_t  vt表示运动矢量或光流值,   v ^ t \ \hat{v}_t  v^t 是其相应的重构版本。可以采用线性或非线性变换来提高压缩效率。因此,残差信息   r t \ r_t  rt被变换为   y t \ y_t  yt,运动信息   v t \ v_t  vt可以变换为   m t \ m_t  mt   r ^ t \ \hat{r}_t  r^t   m ^ t \ \hat{m}_t  m^t 分别是对应的量化版本。

    3.1. Brief Introduction of Video Compression

    在这里插入图片描述

    在本节中,简要介绍视频压缩。在[39,31]中提供了更多详细信息。通常,视频压缩编码器基于输入的当前帧生成比特流。并且解码器基于接收到的比特流来重构视频帧。在图2中,所有模块都包括在编码器侧,而蓝色模块不包括在解码器侧。

    图2(a)中经典的视频压缩框架遵循预测转换架构。具体地说,输入帧   x t \ x_t  xt被分成相同大小(例如8×8)的一组块,即正方形区域。编码器端传统视频压缩算法的编码过程如下:

    • Step 1. Motion estimation. (运动估计)
      估计当前帧   x t \ x_t  xt和前一重构帧   x ^ t \ \hat{x}_t  x^t之间的运动,得到每个块对应的运动矢量   v t \ v_t  vt

    • Step 2. Motion compensation. (运动补偿)
      基于Step 1中定义的运动矢量   v t \ v_t  vt,通过将前一重构帧中的对应像素复制到当前帧来获得预测帧   x ˉ t \ \bar{x}_t  xˉt。原始帧   x t \ x_t  xt与预测帧   x ˉ t \ \bar{x}_t  xˉt之间的残差为   r t \ r_t  rt=   x t \ x_t  xt   x ˉ t \ \bar{x}_t  xˉt

    • Step 3. Transform and quantization. (变换与量化)
      来自Step 2的残差   r t \ r_t  rt被量化为   y ^ t \ \hat{y}_t  y^t。在量化之前使用线性变换(例如,DCT),以获得更好的压缩性能。

    • Step 4. Inverse transform. (反变换)
      Step 3中的量化结果   y ^ t \ \hat{y}_t  y^t通过逆变换得到重构残差   r ^ t \ \hat{r}_t  r^t

    • Step 5. Entropy coding. (熵编码)
      Step 1中的运动矢量   v t \ v_t  vt和Step 3中的量化结果   y ^ t \ \hat{y}_t  y^t都通过熵编码方法编码成比特(bits),并发送到解码器。

    • Step 6. Frame reconstruction. (帧重构)
      Step 2中的预测帧   x ˉ t \ \bar{x}_t  xˉt和Step 4中的重构残差   r ^ t \ \hat{r}_t  r^t相加来获得重构帧   x ^ t \ \hat{x}_t  x^t。重构帧将被第   ( t + 1 ) \ (t+1)  (t+1)帧用于Step 1中的运动估计。

    对于解码器,基于在Step 5中由编码器提供的比特,在Step 2执行运动补偿,在Step 4执行反量化,然后在Step 6执行帧重构以获得重构帧   x ^ t \ \hat{x}_t  x^t

    3.2. Overview of the Proposed Method

    图2(b)提供了端到端视频压缩框架的概述。传统的视频压缩框架与本文提出的基于深度学习的框架之间存在一一对应关系。两者之间的关系及差异简要如下:

    • Step N1. Motion estimation and compression. (运动估计与压缩)
      使用CNN模型来估计光流[27],它被认为是运动信息   v t \ v_t  vt。图3中提出了一个MV编解码器网络来压缩和解码光流值,而不是直接编码原始光流值。通过运动编码器网络编码得到   m t \ m_t  mt,量化后的运动信息表示为   m ^ t \ \hat{m}_t  m^t,运动信息   v t \ v_t  vt经过MV解码器网络解码得到重构运动信息   v ^ t \ \hat{v}_t  v^t。详见第3.3节。

    • Step N2. Motion compensation. (运动补偿)
      基于Step N1中获得的光流,通过运动补偿网络来获得预测帧   x ˉ t \ \bar{x}_t  xˉt。详见第3.4节。

    • Step N3-N4. Transform, quantization and inverse transform. (变换、量化与反变换)
      使用高度非线性的残差编解码网络替换了Step 3中的线性变换,并通过残差编码网络将残差   r t \ r_t  rt非线性映射到   y t \ y_t  yt上。 然后将   y t \ y_t  yt量化为   y ^ t \ \hat{y}_t  y^t。为了建立端到端的训练方案,采用了文献[11]中的量化方法。然后   y ^ t \ \hat{y}_t  y^t经过残差解码网络得到重构残差   r ^ t \ \hat{r}_t  r^t。详见第3.5和3.6节。

    • Step N5. Entropy coding. (熵编码)
      在测试阶段,将来自Step N1的量化运动信息   m ^ t \ \hat{m}_t  m^t和来自Step N3的残差表示   y ^ t \ \hat{y}_t  y^t编码为比特,然后发送到解码器。
      在训练阶段,为了估算比特数成本,使用CNNs(图2中的比特率估算网络)来获得   m ^ t \ \hat{m}_t  m^t   y ^ t \ \hat{y}_t  y^t中每个符号的概率分布。详见第3.6节。

    • Step N6. Frame reconstruction. (帧重构)
      和3.1中的Step 6一样。Step N2中的预测帧   x ˉ t \ \bar{x}_t  xˉt和Step N4中的重构残差   r ^ t \ \hat{r}_t  r^t相加来获得重构帧   x ^ t \ \hat{x}_t  x^t。重构帧将被第   ( t + 1 ) \ (t+1)  (t+1)帧用于Step N1中的运动估计。

    3.3. MV Encoder and Decoder Network

    为了在Step N1压缩运动信息,设计了一个CNN将光流转换为相应的表示形式,以获得更好的编码效果。 具体来说,利用自动编码器样式的网络来压缩光流,这是[11]首次提出的用于图像压缩的任务。整个MV压缩网络如图3所示。光流   v t \ v_t  vt进过一系列的卷积运算和非线性变换。除最后一个反卷积层等于2之外,用于卷积(反卷积)的输出通道数为128。给定光流   v t \ v_t  vt的大小为M×N×2,MV编码器将生成大小为M/16×N/16×128的运动表示   m t \ m_t  mt,然后   m t \ m_t  mt被量化为   m ^ t \ \hat{m}_t  m^t。MV解码器接收量化表示   m ^ t \ \hat{m}_t  m^t并重构运动信息得到   v ^ t \ \hat{v}_t  v^t。此外,量化表示   m ^ t \ \hat{m}_t  m^t还将用于熵编码。
    在这里插入图片描述

    3.4. Motion Compensation Network

    在这里插入图片描述
    给定前一重构帧   x ^ t − 1 \ \hat{x}_{t-1}  x^t1和运动矢量   v ^ t \ \hat{v}_t  v^t,运动补偿网络将获得预测帧   x ˉ t \ \bar{x}_t  xˉt,该预测帧预计尽可能接近当前帧   x t \ x_t  xt。首先,基于运动信息   v ^ t \ \hat{v}_t  v^t将前一重构帧   x ^ t − 1 \ \hat{x}_{t-1}  x^t1变换到当前帧(current frame )。变换的帧仍然有伪影。为了消除伪影,将变换的帧   w ( x ^ t − 1 , v ^ t ) \ w(\hat{x}_{t-1},\hat{v}_t)  w(x^t1,v^t)、参考帧   x ^ t − 1 \ \hat{x}_{t-1}  x^t1和运动矢量   v ^ t \ \hat{v}_t  v^t连接起来作为输入,然后将它们输入到另一个CNN中,以获得精确的预测帧   x ˉ t \ \bar{x}_t  xˉt。网络的总体架构如图4所示。图4中CNN的细节在补充材料中提供。本文提出的方法是一种像素级的运动补偿方法,它可以提供更精确的时间信息,并且避免了传统的基于块的运动补偿方法中的块效应。这意味着不需要手工制作的循环滤波器或样本自适应偏移技术(loop filter or the sample adaptive offset technique)[39,31]来进行后期处理。

    3.5. Residual Encoder and Decoder Network

    如图2所示,原始帧   x t \ x_t  xt和预测帧   x ˉ t \ \bar{x}_t  xˉt之间的残差信息   r t \ r_t  rt由残差编码器网络编码。本文利用文献[12]中高度非线性的神经网络将残差转化为相应的潜在表示。与传统视频压缩系统中的离散余弦变换相比,该方法可以更好地利用非线性变换的能力,获得更高的压缩效率。

    3.6. Training Strategy

    Loss Function.

    视频压缩框架的目标是最小化用于对视频进行编码的位数,同时减少原始输入帧   x t \ x_t  xt与重构帧   x ^ t \ \hat{x}_t  x^t之间的失真。因此,文章提出以下率-失真优化问题,
      λ D + R = λ d ( x t , x ^ t ) + ( H ( m ^ t ) + H ( y ^ t ) ) , ( 1 ) \ λD+R=λd(x_t,\hat{x}_t)+(H(\hat{m}_t)+H(\hat{y}_t)), (1)  λD+R=λd(xt,x^t)+(H(m^t)+H(y^t)),(1)
    其中   d ( x t , x ^ t ) \ d(x_t,\hat{x}_t)  d(xt,x^t)表示   x t \ x_t  xt   x ^ t \ \hat{x}_t  x^t之间的失真,在实现中使用均方误差(MSE)。   H ( ⋅ ) \ H(·)  H()表示用于编码表示表示的位数。在本文方法中,残差表示   y ^ t \ \hat{y}_t  y^t和运动表示   m ^ t \ \hat{m}_t  m^t都应该被编码到比特流中。   λ \ λ  λ是拉格朗日乘数,它决定了比特数和失真之间的权衡。如图2(b)所示,将重构帧   x ^ t \ \hat{x}_t  x^t、原始帧   x t \ x_t  xt和估计比特输入到损失函数。

    Quantization.

    在熵编码之前,需要对残差表示   y t \ y_t  yt和运动表示   m t \ m_t  mt等潜在表示进行量化。然而,量化运算不是差分的,这使得端到端的训练变得不可能。为了解决这个问题,已经有很多方法被提出[34,8,11]。本文采用文献[11]中的方法,并在训练阶段通过加入均匀噪声来代替量化运算。以   y t \ y_t  yt为例,训练阶段的量化表示   y ^ t \ \hat{y}_t  y^t是通过在   y t \ y_t  yt上加上均匀噪声来近似得到的,即   y ^ t = y t + η \ \hat{y}_t=y_t+η  y^t=yt+η,其中   η \ η  η是均匀噪声。在推理阶段,直接四舍五入取整,即   y ^ t = r o u n d ( y t ) \ \hat{y}_t=round(y_t)  y^t=round(yt)

    Bit Rate Estimation.

    为了优化整个网络的比特数和失真度,需要获得所生成的潜在表示   y ^ t \ \hat{y}_t  y^t   m ^ t \ \hat{m}_t  m^t的比特率   H ( y ^ t ) \ H(\hat{y}_t)  H(y^t)   H ( m ^ t ) \ H(\hat{m}_t)  H(m^t)。比特率的正确度量是对应潜在表示符号的熵。因此,我们可以估计   y ^ t \ \hat{y}_t  y^t   m ^ t \ \hat{m}_t  m^t的概率分布,然后得到相应的熵。本文利用[12]中的CNNs来估计分布。

    Buffering Previous Frames.

    如图2所示,在压缩当前帧时,在运动估计和运动补偿网络中需要前一重构帧   x ^ t − 1 \ \hat{x}_{t-1}  x^t1。但是,前一重构帧   x ^ t − 1 \ \hat{x}_{t-1}  x^t1是基于重构帧   x ^ t − 2 \ \hat{x}_{t-2}  x^t2的网络输出,依此类推。因此,在帧   x t \ x_t  xt的训练过程中可能需要帧   x 1 , . . . , x t − 1 \ {x_1,...,x_{t−1}}  x1,...,xt1,这会减少小批量中训练样本的变化,并且当t较大时可能无法将其存储在GPU中。为了解决这个问题,本文采用了在线更新策略。具体地说,每次迭代中的重构帧   x ^ t \ \hat{x}_t  x^t将保存在缓冲区中。在接下来的迭代中,当编码   x t + 1 \ x_{t+1}  xt+1时,缓冲区中的   x ^ t \ \hat{x}_t  x^t将用于运动估计和运动补偿。因此,缓冲区中的每个训练样本都将在一个epoch中更新。这样,可以在每次迭代中为一个视频片段优化并存储一个帧,从而更加高效。

    4. Experiments

    4.1. Experimental Setup

    Datasets.

    作者使用Vimeo-90k数据集[42]来训练提出的视频压缩框架,该数据集是该数据集是最近为评估不同的视频处理任务(如视频去噪和视频超分辨率)而构建的。它由89,800个独立的剪辑组成,这些剪辑的内容互不相同。

    为了报告所提出的方法的性能,作者在UVG数据集[4]和HEVC标准测试序列(B类,C类,D类和E类)[31]上评估了提出的算法。这些数据集的内容和分辨率是多种多样的,它们被广泛用于衡量视频压缩算法的性能。

    Evaluation Method(评估方法)
    为了测量重构帧的失真,我们使用两个评估指标:PSNR和MS-SSIM [38]。与PSNR相比,MS-SSIM与人对失真的感知更好地相关。为了测量编码表示形式的位数,我们使用每像素位数(Bpp)表示当前帧中每个像素所需的位数。

    Implementation Details(实施细节)
    作者用不同λ(λ= 256,512,1024,2048)训练了四个模型。对于每个模型,使用Adam优化器[20],分别将初始学习率设置为0.0001,β1设置为0.9,将β2设置为0.999。当损失趋于稳定时,学习率除以10。mini-batch size设置为4。训练图像的分辨率为256×256。运动估计模块使用[27]中的预训练权重进行初始化。整个系统基于Tensorflow实现,使用两个Titan X GPU对整个网络进行训练大约需要7天时间。

    4.2. Experimental Results

    在本节中,将H.264[39]和H.265[31]都包括在内进行比较。此外,在文献[40]中Wu_ECCV2018的基于学习的视频压缩系统也包括在内以进行比较。为了通过H.264和H.265生成压缩帧,按照[40]中的设置,使用快速模式的FFmpeg。UVG数据集和HEVC数据集的GOP大小分别为12和10。有关H.264/H.265设置的更多详细信息,请参阅补充资料。

    图5显示了在UVG数据集、HEVC B类和E类数据集上的实验结果。补充材料中提供了HEVC C级和D级的结果。显然,本文方法在很大程度上优于最新的视频压缩[40]。在UVG数据集上,该方法在相同的Bpp水平下获得了约0.6dB的增益。值得一提的是,本文方法仅使用一个之前的参考帧,而Wu等人的工作却没有。[40]利用双向帧预测,并且需要两个相邻帧。因此,利用多个参考帧中的时间信息可以进一步提高框架的压缩性能。

    在大多数数据集上,当通过PSNR和MS-SSIM来衡量,本文提出的框架优于H.264标准。此外,与H.265相比,该方法在MS-SSIM指标上具有类似或更好的压缩性能。如前所述,损失函数中的失真项由MSE度量。尽管如此,根据MS-SSIM,本文方法仍可以提供合理的视觉质量。
    在这里插入图片描述

    4.3. Ablation Study and Model Analysis

    Motion Estimation.

    在本文提出的方法中,利用了端到端训练策略的优势,在整个网络中对运动估计模块进行优化。 因此,基于率-失真优化,系统中的光流有望得到进一步压缩,从而得到更精确的变换帧(warped frames)。为了验证其有效性,作者在整个训练阶段对初始化的运动估计模块的参数进行了固定,在这种情况下,对运动估计模块进行预训练只是为了更准确地估计光流,而不是为了获得最佳的率-失真。图6中的实验结果表明,与采用固定运动估计的方法相比,采用联合训练进行运动估计的方法可以显著提高运动估计的性能,在图6中由W/O联合训练表示(见蓝色曲线) 。
    在这里插入图片描述
    在表1中报告了用于编码光流的平均比特成本和相应的转换帧(warped frame)的峰值信噪比PSNR。具体地说,当运动估计模块在训练阶段固定时,对产生的光流进行编码需要0.044bpp,相应的转换帧的PSNR为27.33db。相比之下,在本文提出的方法中,需要0.029bpp来编码光流,并且转换帧的PSNR更高(28.17dB)。因此,联合学习策略不仅节省了编码操作所需的比特数,而且具有更好的转换图像质量。这些实验结果清楚地表明,将运动估计应用于率-失真优化可提高压缩性能。

    在图7中,提供了进一步的视觉比较。图7(a)和(b)表示序列的帧5和帧6。图7(c)表示在训练过程中光流网络被固定时的重建光流图。图7(d)表示使用联合训练策略后的重建光流图。图7(e)和(f)是光流量值的相应概率分布。可以看出,使用本文方法重建的光流包含了更多的像素,这些像素的流大小为零(例如,在人体区域)。尽管在这些区域中零值不是真正的光流值,但本文方法仍可以在均匀区域中生成精确的运动补偿结果。更重要的是,具有更多零值的光流图需要更少的比特来进行编码。例如,在图7(c)中对光流图进行编码需要0.045bpp,而对图7(d)中的光流图进行编码仅需要0.038bpp。

    应该提到的是,在H.264[39]或H.265[31]中,为了获得更好的压缩性能,许多运动矢量被分配为零。令人惊讶的是,本文提出的框架可以学习相似的运动分布,而无需像[39,31]中那样依赖任何复杂的手工制作的运动估计策略。
    在这里插入图片描述
    在这里插入图片描述

    Motion Compensation.

    本文利用运动补偿网络,在估计光流的基础上,对转换帧进行改善(refine the warped frame)。为了评估该模块的有效性,作者进行了另一个实验,移除了系统中的运动补偿网络。用W/O MC表示的另一种方法的实验结果(见图6中的绿色曲线)表明,在相同的bpp水平下,没有运动补偿网络的PSNR将下降约1.0db。

    Updating Strategy.(更新策略)

    如第3.6节所述,在对当前帧xt进行编码时,我们使用在线缓冲区在训练阶段存储先前重建的帧x ^ t-1。我们还报告了在训练阶段将先前重建的帧x ^ t-1直接替换为先前的原始帧xt-1时的压缩性能。由W / O更新表示的替代方法的结果(参见红色曲线)如图6所示。它表明,在相同的bpp电平下,缓冲策略可以提供约0.2dB的增益。

    如第3.6节所述,在对当前帧   x t \ x_t  xt进行编码时,使用在线缓冲区在训练阶段存储前一重构帧   x ^ t − 1 \ \hat{x}_{t-1}  x^t1。还报告了在训练阶段,当前一重构帧   x ^ t − 1 \ \hat{x}_{t-1}  x^t1被先前的原始帧   x t − 1 \ x_{t−1}  xt1直接替换时的压缩性能。图6显示了由W/O update表示的替代方法的结果(见红色曲线)。结果表明,在相同的bpp水平下,缓冲策略可以提供约0.2dB的增益。

    MV Encoder and Decoder Network.(MV编码器和解码器网络)

    在本文提出的框架中,作者设计了一个CNN模型来压缩光流并编码相应的运动表示。在不使用CNN的情况下,直接对原始光流值进行量化编码也是可行的。作者进行了一个新的实验,去掉了MV编解码器网络。图6中的实验结果表明,去除运动压缩网络后,用W/O MVC表示的替代方法的PSNR(见红色曲线)将下降超过2db。此外,表1还提供了在该设置下对光流进行编码的比特成本和相应的转换帧的PSNR(用W/O MVC表示)。很明显,直接编码原始光流值需要更多的比特(0.20Bpp),对应的PSNR(24.43dB)比本文方法(28.17dB)要差得多。因此,当光流用于运动估计时,运动压缩是至关重要的。

    Motion Information.(运动信息)

    在图2(b)中,还研究了仅保留残差编码器和解码器网络的设置。与本文方法相比,在不使用任何运动估计方法的情况下单独处理每个帧(见由W/O运动信息表示的黄色曲线)导会致PSNR下降超过2dB。

    Running Time and Model Complexity. (运行时间和模型复杂性)

    本文提出的端到端视频压缩框架的参数总数约为11M,为了测试不同编解码器的速度,使用装有Intel Xeon E5-2640 v4 CPU和单个Titan 1080Ti GPU的计算机进行了实验。对于分辨率为352x288的视频,Wu等人[40]的每次迭代的编码(解码)速度为29fps(38fps),而本文的整体速度是24.5fps(41fps)。基于官方软件JM[2]和HM[3]的H.264和H.265的编码速度分别为2.4fps和0.35fps。商业软件x264[6]和x265[7]的编码速度分别为250fps和42fps。虽然商用编解码器x264[6]和x265[7]可以提供比本文更快的编码速度,但它们仍需要大量代码优化。

    Bit Rate Analysis.(比特率分析)

    本文利用文献[12]中的概率估计网络估计运动信息和残差信息的比特率。为了验证可靠性,使用图8(a)中的算术编码来比较估计的比特率和实际的比特率。很明显,估计的比特率与实际比特率很接近。此外,还进一步研究了比特率的组成。在图8(b)中,提供每个点的   λ \ λ  λ值和运动信息的百分比。当目标函数   λ ∗ D + R \ {λ*D+R}  λD+R中的   λ \ λ  λ变大时,整个Bpp也变大,而相应的运动信息百分比下降。

    5. Conclusion

    本文提出了一个完整的端到端深度学习视频压缩框架。该框架继承了传统视频压缩标准中经典预测编码方案的优点以及DNNs强大的非线性表示能力。实验结果表明,该方法优于目前广泛采用的H.264视频压缩标准和最新的基于学习的视频压缩系统。该工作为深度神经网络在视频压缩中的应用提供了一个很有前景的框架。基于所提出的框架,其他新的光流技术、图像压缩技术、双向预测技术和速率控制技术都可以很容易地嵌入到该框架中。

    展开全文
  • 转自:http://blog.csdn.net/zouxy09/article/details/8781543/ 1.Convolutional Neural Networks卷积神经网络  卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。它的权值...
  • 编译原理总结,看这一篇就够了!

    万次阅读 多人点赞 2020-03-15 20:55:20
    编译原理总结第一章 编译概述一.翻译程序的三种方式二.编译程序的五个阶段第二章 文法与语言2.1 符号串和语言2.1.1 字母表2.1.2 符号串2.1.3 语言2.2 文法和语言的形式化定义2.2.1 文法的形式化定义2.2.2 语言的形式...
  • 深度学习和并行化实现

    千次阅读 2018-02-07 14:54:29
    摘要: 深度学习可以完成需要高度抽象特征的人工智能任务,如语音识别、图像识别和检索、自然语言理解等。深层模型是包含多个隐藏层的人工神经网络,多层非线性结构使其具备强大的特征表达能力和对复杂...
  • 深度学习及并行化实现概述

    千次阅读 2018-02-08 21:25:50
    黑色框可以看作是一个编码器,将原始输入编码为第一层的初级特征,可以将编码器看作模型的一种“认知”。为了验证这些特征确实是输入的一种抽象表示,且没有丢失太多信息,需要引入一个对应的解码器,即图中左侧的...
  • 优点: 1) 如果最优路径存在,那么一定能找到最优路径 缺点: 1) 有权图中可能是负边 2) 扩展的结点很多,效率低 1.2 A*算法 A* 算法发表于1968年,A* 算法是将Dijkstra算法与广度优先搜索算法(BFS, Breath ...
  • 《数字图像处理》题库5:计算题 ②

    千次阅读 2022-05-12 17:52:45
    这是我在学习数字图像处理这门课程时,从网络上以及相关书籍中...2、为了提高复习的效率,这篇文章从考试可能涉及到的各个考点出发, 将题目按照考点归类,每一个考点中包括知识点回顾、经典例题、举一反三这3个部分。
  • OFDM学习笔记(二)(OFDM基本原理)

    万次阅读 多人点赞 2020-08-19 23:52:59
    IFFT变换与j IDFT变换的作用相同,只是有更高的计算效率,所以适用于所有的应用系统。其中,上半部分对应于发射机链路,下半部分对应于接收机链路。由于FFT操作类似于IFFT, 因此发射机和接收机可以使用同一硬件设备...
  • 寻址,读取编码 ROM存储器:存储管理程序、字符库和汉字库 RAM存储器:需要打印的内容 2️⃣ 喷墨打印机:打印头上的喷口将墨滴按特定的方式喷到打印介质上形成文字或图像, 分为热汽泡式和压电式 打印质量较好、噪音...
  • j)logP(a_j) H(z)=−∑j=1J​P(aj​)logP(aj​) 编码效率η = H L a v g \eta = \frac{H}{L_{avg}} η=Lavg​H​, L a v g L_{avg} Lavg​代表平均码长 \ 无损压缩 哈夫曼编码 按照P的概率大小排序,然后合并最小...
  • 本文对基于Tensorflow2的深度网络构建进行详细的讲述,想要使用Tensorlow框架来进行深度学习的学习者可以一阅
  • 原文地址:http://blog.csdn.net/playoffs/article/details/7588597 李航 :http://research.microsoft.com/en- us/people/hangli/,是MSRA Web Search and Mining Group高级研究员和主管,主要研究领域...
  • 深度学习知识点全面总结

    千次阅读 多人点赞 2022-01-03 13:34:04
     假设网络参数是 θ \thetaθ,学习率是 η \etaη,网络表示的函数是 J ( θ ) J(\theta)J(θ),函数此时对θ \thetaθ的梯度为:▽ θ J ( θ ) \bigtriangledown_{\theta }J(\theta)▽θ​J(θ),于是参数 ...
  • 深度学习实验(一)

    2021-11-09 22:10:06
    线性回归与 softmax 线性回归 ... \end{aligned} wb​←w−∣B∣η​i∈B∑​∂w​l(i)(w,b)=w−∣B∣η​i∈B∑​x(i)(w⊤x(i)+b−y(i)),←b−∣B∣η​i∈B∑​∂b​l(i)(w,b)=b−∣B∣η​i∈B∑​(w⊤x(i)+b−y...
  • 电力系统中的风光场景生成方法总结

    千次阅读 多人点赞 2022-04-30 11:43:49
    ω~)η(d(ω,ω~))}(7) 总何公式(6)与(7)可以得出结论:若 P \mathbf{P} P 与 Q \mathbf{Q} Q 的关系满足公式(7),则“简化概率测度 Q \mathbf{Q} Q 求得SO模型的最优值式(8)”和“原始概率侧度 P \mathbf{P} P 求得...
  • DIN模型

    千次阅读 2022-01-15 22:38:29
    如果向量 t i t_i ti​计算的 k = 1 k=1 k=1表明是one-hot编码, k > 1 k>1 k>1表明是multi-hot编码。一个样本可以表示为 x = [ t 1 T , t 2 T , ⋯   , t M T ] T x=[t_1^T,t_2^T,\cdots,t_M^T]^T x=[t1T​,t2T​,...
  • 数字通信系统相关基本概念(一)

    千次阅读 2021-02-24 11:08:34
    二是压缩信源的冗余度(即多余度),以提高通信系统传输消息的效率,压缩(compression)可以是有损的(lossless)(如计算数据文件压缩)或有损的(lossy)(如视频、静态图像或音乐压缩,其中的损失可以做到难以...
  • 简单讲就是用来描述求解问题的难易程度或者算法执行效率的高低。 对于算法的计算复杂性,我们一般很容易进行判断,例如使用蛮力法去枚举旅行商问题或者0-1背包问题的算法,就是具有指数计算复杂性的算法。 对于某...
  • 期末复习-移动通信

    万次阅读 多人点赞 2021-06-17 17:36:00
    移动通信知识总结 参考资料: 1.哈尔滨工业大学(深圳)2021年春季《移动通信》课件 by 张霆廷 2.《Wireless Communications》by Andrea Goldsmith ...导入CSDN后图片比例有问题,但是我不想改了。 无线通信系统概述
  • 为简单起见,我们假设观察每个候选实体e的名称m的概率P(m|e)相同,并且定义为常数η,其中0 其中e是实体提及m的候选实体。如公式(4)所示的这种概率链接模型主要由两部分组成: (1)实体流行度模型P(e)捕获实体e的流行...
  • 值得提一句这里的损失函数,用的是 annotator-robust loss function, where y i is the ground truth edge probability, η is a predefined threshold, meaning that a pixel is discarded and not considered to...
  • 一天1个机器学习知识点(一)

    万次阅读 多人点赞 2020-06-13 12:12:43
    今天开始陆陆续续更新机器学习的面试题,资料大多数来自网上,不做盈利目的,如果侵权请告知即删!如果文章中有错误的地方还请各位同学指正,如果大家面试中遇到好的面试题也请分享,一起学习,一起进步!...
  • 稀疏表示综述:A Survey of Sparse Representation: Algorithms and Applications_2015(2) 本文地址:http://blog.csdn.net/shanglianlm/article/details/46866803
  • 缺点: 由图可知其在0点处的导数不连续,使得求解效率低下,导致收敛速度慢;而对于较小的损失值,其梯度也同其他区间损失值的梯度一样大,所以不利于网络的学习。 1.1.2 L2 Loss L2 Loss也称为Mean Squred Error,...
  • 指针使用)作为起点 定义1:(程序、函数、语句、令牌):程序P是一组(系列)函数f1……fη,用P = {f1……fη}表示,A 函数 fi, 其中1 ≤ i ≤ η,是一组(系列)有序的语句si,1……si,mi,表示为fi= { si,1, ....
  • 在实际应用中,可实现的光谱效率r是一个上界,而有效光谱效率reff依赖于实现的Rx[如:Rx]。,即最小均方误差(MMSE)][24],决策反馈[25],或时域均衡器[26]),是可实现光谱效率的一小部分。有效通信速率则是信号带宽W...
  • BP算法

    2021-04-23 16:31:33
    delta_w_mid = np.zeros([3, 4]) # 存放因此能权值阈值的逆向计算误差 yita = 1.75 # η: 学习速率 Err = np.zeros([maxiter]) # 记录总体样本每迭代一次的错误率 # 1.样本总体训练的次数 for it in range(maxiter)...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

编码效率η csdn