精华内容
下载资源
问答
  • 层次模型构造
    千次阅读
    2020-12-29 04:33:43

    1. 我的评价指标体系中没有中间层怎么办?

    中间层并不是必须的。

    2. 构造层次结构模型时,每个备选方案节点都需要与中间层要素连接吗?

    不需要,可以直接连接到决策目标节点。

    3. 我想确定AA、BB、CC对OO的排序权重,备选方案应该是什么?

    备选方案就是AA、BB、CC。

    4. 层次模型如果有四层,yaahp还能处理吗?

    可以。现在一个节点影响因素最多可以有99个,但是大于9个会有一个提示,点击确定可以继续计算。

    5. 我的层次模型怎么总是提示非法?

    层次模型必须符合一定的原则才是合法的,yaahp中合法性检查的部分规则如下:

    1) 总目标层节点不能作为起点;

    2) 方案层不能作为终点;

    3) 中间层节点的top不能作为终点;

    4) 中间层节点的bottom不能作为起点;

    5) 中间层节点top和bottom必须全部连接;

    6) 总目标层节点必须有大于等于两个连接到中间层或方案层;

    7) 方案层节点必须有大于等于两个连接到中间层或总目标层;

    8) 中间层节点的bottom必须有大于两个连接到中间层或方案层节点。

    6. 我有很多备选方案怎么办?

    一般大于9阶的判断矩阵就很难保证判断的一致性, 如果模型中有大量备选方案(例如学校的所有教师), 直接处理会产生阶数非常大的判断矩阵, 无论对于人的思维能力还是yaahp处理能力都是无法应付的.

    这种备选方案较多的问题, 处理办法有两种:

    在层次模型中通过抽象高层要素, 降阶判断矩阵;

    使用AHP与其他评价方法相结合的方式来处理.

    1. 在层次模型中通过抽象高层要素, 降阶判断矩阵

    利用AHP中常用的高阶判断矩阵降阶方法, 结合一个例子说明.

    例如一个模型如下图, 备选方案12个, 会产生三个12阶的判断矩阵(要素A, B, C对应的判断矩阵).

    因为判断矩阵阶数较高, 所以考虑抽象出一个中间层, 例如将备选方案进行分类, 将分类作为一个新的层次加入, 如下图(图中的”分类一”和”分类二”是新增的):

    优点: 可以使用两两比较的方式进行决策, 并且不需要学习/使用其他评价方法;

    缺点: 备选方案如果发生变化(备选方案较多的模型中, 备选方案可能比较容易发生变化, 例如今年20个备选方案明年加到了22个等情况), 需要重新输入不少决策数据(新增/改变的要素涉及的所有两两比较都要处理). 另外, 如果要素无法进行合理的抽象(也即抽象后无法两两比较, 例如上图中的两两比较: ”分类一”和”分类二”对于”A”哪个更重要, 这个问题可能无法回答), 那么也不能使用这种方法.

    如果有很多备选方案, 可能需要抽象出多个中间层才能将所有判断矩阵阶数降到小于9, 处理过程复杂并且合理性不好保证.

    2. 使用AHP与其他评价方法相结合的方式来处理

    可以考虑使用层次分析法(AHP)与模糊综合评价法(FCE)相结合的方式来处理你的问题. 将现在模型最下方的中间层改为方案层, 也就是将评价具体备选方案时的各个指标(示例模型中是A, B和C)作为方案层, 如下图:

    把模型最下方中间层改为方案层(A,B,C三个要素), 使用AHP方法得到这三个要素的权重, 然后利用模糊综合评价法对2000多个备选方案进行评价, 最终得到评价结果. 这种方法的优点是不需要繁杂费脑的抽象高层要素, 并且评价问题中的备选方案变化只需要做其自身的数据处理即可; 缺点是不能使用两两比较的方式进行决策了(其实FCE的决策数据输入方式也不错).

    推荐使用第二种方法, 虽然需要额外用到FCE, 但yaahp支持的很好, 参考软件使用文档直接使用即可, 但为了更好地应用建议至少大概了解下FCE是什么/解决什么问题.

    结合AHP和FCE的评价方法请参考此文.

    yaahp的FCE相关操作可以参考使用手册, 以及相关视频教程.

    更多相关内容
  • 基于阻塞先验知识的文本层次分类模型
  • 提出一种新的自适应层次分类(HAC)模型,通过本体对特征集进行语义扩展,并以增量形式在层次模型中构建特征上下文和类别相关上下文,以辅助实现一种高效、无阻滞的层次分类.实验结果证明,模型HAC具有相对更好的分类...
  • 传统的知识库多层次标签分类算法分类精度低,为了解决这一问题,基于最临近模型的知识库研究一种新的多层次标签分类算法。该算法对知识库多层次标签进行特征提取,将提取的对象标签特征进行特征降维,以此获得简化...
  • 具有层次结构意识的全局模型利用预先定义的层次结构的先验知识改进了常规文本分类模型。 项目文件夹由以下部分组成: config:配置文件(json格式) 数据:数据目录,可以在配置文件中更改(带有示例数据) data_...
  • 层次分析模型

    千次阅读 2019-07-16 21:18:27
    层次模型(AHP)是一种定性与定量相结合的、系统化、层次化的分析方法。 人们在进行社会的、经济的以及科学管理领域问题的系统分析中,面临的常常是一个互相关联、相互制约的众多元素构成复杂而往往缺少定量数据的...

    离散模型:代数方程与差方程、整数规划、图论、对策论、网络论

    层次模型(AHP)是一种定性与定量相结合的、系统化、层次化的分析方法。

    人们在进行社会的、经济的以及科学管理领域问题的系统分析中,面临的常常是一个互相关联、相互制约的众多元素构成复杂而往往缺少定量数据的系统

    • 建立阶梯层次结构模型
    • 构造出各层次中的所有判断矩阵
    • 层次单排序及一致性检验
    • 层次总排序及一致性检验

    阶梯层次结构的建立与特点
    复杂问题被分解为元素的组成部分。这些元素按其属性及关系形成若干层次。上一层次的元素作为准则对下一层次有关元素起支配作用。
    层次可以大致分为三类:

    • 最高层
      在一层次中只有一个元素。一般是它分析问题的预定目标或理想结果,因此也称为目标层
    • 中间层
      这一层次中包含了为实现目标所涉及的中间环节,它可以由若干个层次组成,包括所需要的准则、子准则,因此也称为准则层
    • 最底层
      这一层包括了为实现目标可供选择的各种措施、决策方案等,因此也称为措施层或方案层

    层次分析法的基本步骤:如何在3个目的地中按照景色、费用、居住条件等因素选择

    在这里插入图片描述
    思维归纳:

    • 将决策问题分为3个层次:目标层,准则层、方案层;每层有若干元素,各层元素间的关系用相连的直线表示
    • 通过互相比较确定各准则对目标的权重,以及方案对每一准则的权重
    • 将上述两组权重进行综合,确定各方案对目标的权重

    构造判断矩阵
    层次结构反映了因素之间大的关系,但准则层中的各准则在目标衡量中所占的比重并不一定相同,在决策者心中,它们所占有一定的比例

    在确定影响某因素的诸因子在该因素中所占的比重时,遇到主要困难是这些比重常常不易定量化。此外,当影响某因素的因子较多时,直接考虑各因子对该因素有多大程度的影响时,常常会因考虑不周、顾此失彼而使决策者提出与他实际认为的可作重要性程度不相一致的数据
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    层次单排序及一致性检验
    在这里插入图片描述
    经归一化后即为同一层次相应因素对于上一层次某因素相对重要性的排序权值,这一过程被称为单排序。

    上述构造对比较判断的办法虽能减少其他因素的干扰,较客观地反映出一对因素对于上一层次某因素影响力的差别。

    成对比较阵和权向量
    成对比较完全一致性的情况满足aij.ajk=aik,i,j,k=1,2,…,n的正互反阵A称一致阵

    A的秩为1,A的唯一非零特征根为n
    A的任一列向量是对应于n的特征向量
    A的归一化特征向量可作为权向量

    一致性检验:
    在这里插入图片描述

    展开全文
  • 基于三元矩阵的层次分析多分类模型
  • 传统两阶段层次文本分类模型(THTC模型)是一种解决大规模层次文本分类问题的有效方法,但该模型的分类准确率仍然不是很高。为了缓解这个问题,提出了结合邻居辅助策略的两阶段层次文本分类模型(THTC-NA模型)。...
  • 基于层次聚类的车辆模型数据分类算法
  • 基于深度学习和层次语义模型的极化SAR分类.pdf
  • 基于层次语义模型和散射机制的PolSAR图像分类
  • 情感分类是观点挖掘的热点研究之一,微博文本情感分类具有很高的应用价值。...采用SVM层次结构分类模型,实现多种情感分类。实验结果表明,采用特征融合的层次结构情感分类方法,能有效提高微博情感分类的准确率。
  • 本文同步发布知乎:HFT-CNN:层级多标签分类,让你的模型多学习几次知乎主页lynne阿黎请大家不吝关注~ 背景 长文本由于自身的特点和信息量,一段文本会描述一个特定的主题。短文本由于其自身长度的原因是缺少这种...

    本文同步发布知乎:HFT-CNN:层级多标签分类,让你的模型多学习几次知乎主页lynne阿黎请大家不吝关注~

    背景

    长文本由于自身的特点和信息量,一段文本会描述一个特定的主题。短文本由于其自身长度的原因是缺少这种特征的。一般对于短文本的处理会借鉴上下文的语料或者同义词来扩充短文本的含义。但是由于文本的领域相关性,上下文的语料和同义词的分布未必和原始语料一致。由于以上原因短文本分类一直受到人们的关注。

    在深度学习领域,对于短文本分类CNN是一种常见的方法,但是这种方法通常需要大规模的语料。文中认为短文本的多标签分类任务所面临的的问题主要是由多标签带来的数据稀疏的问题。在多标签分类中,我们会遇到标签是平行和具有层级结构的情况,例如我们看新闻的时候有生活类,科技类,娱乐类,而娱乐类又会分为电影频道,电视剧频道等等。对于标签有层级关系的问题,文中提出了Hierarchical CNN结构。

    模型结构

    1. CNN结构

    文中文本分类的CNN模型类似于Text-CNN,输入是短文本sentence,sentence由词向量拼接而成,文中使用的是fasttext,接着使用卷积核为w的卷积层提取sentence的特征,然后添加max-pooling层,将这些池化层的的结果拼接然后经过全连接层和dropout得到上层标签[A,B,...]的概率,loss采用交叉熵。这是一个非常经典的CNN结构。

    2. Hierarchical结构

    对于下层标签的预测文中的思路是在上层标签的预测中模型已经学到了通用的特征,但是深层layer应该去学习原始数据集中比较详细的信息。因此文中对embedding和卷积层参数保持不变,在这个基础上进行微调学习,这一步标签也由[A,B]变为[A1,A2,B1,B2]。

    对于最终文本分类的结果判断文章采用了两种得分方式:

    • BSF(Boolean Scoring Function)

    • MSF(Multiplicative Scoring Function)

    两种方法都是设置一个阈值,文本在某个分类的得分超过阈值则认为是该分类的。区别是BSF只有在文本被分到一级分类的情况下才会认为分类的二级分类是正确的,MSF没有这项限制。

    其实说到这里大家应该明白了文章的基本思路,就我个人来说感觉是比较原始但又水到渠成。因此这里的代码感觉也没有什么好讲的,就是Finetune的思路,在原始模型上加了一层全连接层。需要注意的是作者使用的是chainer实现的,相比于torch和tensorflow比较小众。

    # Network definition for HFT model
            # =========================================================
            if self.mode == "fine-tuning":
                parameters = np.load('./CNN/PARAMS/parameters_for_multi_label_model_' + self.load_param_node_name + '.npz')
                super(CNN, self).__init__()
                set_seed_random(0)
                with self.init_scope():
                    self.lookup = L.EmbedID(in_size = parameters['lookup/W'].shape[0], out_size = parameters['lookup/W'].shape[1], initialW = parameters['lookup/W'], ignore_label = -1)
                    self.conv1 = L.Convolution2D(self.in_channels,self.out_channels,(2, self.row_dim),stride=1,initialW=parameters['conv1/W'],initial_bias=parameters['conv1/b'])   
                    self.conv2 = L.Convolution2D(self.in_channels,self.out_channels,(3, self.row_dim),stride=1,initialW=parameters['conv2/W'],initial_bias=parameters['conv2/b'])
                    self.conv3 = L.Convolution2D(self.in_channels,self.out_channels,(4, self.row_dim),stride=1,initialW=parameters['conv3/W'],initial_bias=parameters['conv3/b'])
                    self.l1=L.Linear(in_size = None, out_size = self.hidden_dim, initialW=self.initializer)
                    self.l2=L.Linear(in_size = self.hidden_dim, out_size = self.n_classes, initialW=self.initializer)

    实验效果

    文中数据集采用RCV1和Amazon 670K,相关链接可以见相关资料部分。数据集的基本情况如下,L表示数据集标签的层级深度,TrTe表示训练数据和测试数据,C表示标签整体的量。分类的效果采用F1值进行衡量,此外还采用了P@k和NDCG@k标准。

    基础效果

    文中将HFT-CNN和没有经过微调的CNN模型(WoFT-CNN)和没有经过层级结构标签处理的模型(Flat Model)进行对比,实验效果如下,其中B表示BSF,M表示MSF。

    我们看到表格中有Micro和Macro这是什么意思呢?这是F1值得两种计算方式,对于单个分类来说在多分类的情况下计算F1值有两种方式,Micro和Macro。

    • Micro是不管类别,直接计算

    • Macro是将各个类别的F1计算之后然后进行平均

    可以看出在效果上RCV1和Amazon 670K,HFT-CNN的效果都是优于其他模型的,但是在使用MSF得分和Micro F1值时WoFT的效果和HFT相同,但是在Macro F1的得分缺逊于HFT-CNN。这个我们猜测是因为WoFT整体效果比较好,但是在某一类上的分类效果差于HFT-CNN所以导致Macro F1值比较低,这也证明了HFT-CNN的初衷:对标签分类,模型先学习比较通用的知识,然后进行细分。

    STOA效果比较

    STOA效果文中主要对比了XML-CNN,实验效果如下,可以看到在两个数据集上,HFT-CNN的效果超越了目前的STOA的效果。

    • 层级分类效果

    文中统计了多个层级的文本分类效果,可以看出标签层级越深,分类效果越差,但是HFT-CNN的效果依然优于XML。

    • 多标签数量

    文中对于每个短文本的有多个分类的情况下对分类的数量的准确率进行了统计,可以看到分类越多识别的准确率越低。

    • 训练数据规模

    文中也讨论了训练数据的规模对实验结果的影响,可以看到训练数据越多实验效果越好。但是需要注意的是随着训练数据规模的降低,HFT-CNN的效果下降的较XML比较平缓。这表示经过多轮学习,HFT-CNN学到的语料内容更多一点。

    个人思考

    相比于Bert和其他文章,这篇文章的模型结构是比较简单而且原始的,思路也感觉是Bert玩剩下的。预训练+Finetune已经是非常流行的手段了,所以我个人对这篇文章的定位应该是术而不是道。文中对于标签层级结构的理解是非常具有启发性的,如果大家要用Bert的话也可以据此设计一些相关的预训练任务,比如让模型去学习二级标签或二级标签是否正确等,这样模型可以有针对性的学习。

    但是文中的思想同样存在一个问题就是标签层级的划分,以及不同标签的不相关性。如果标签层级本身就划分不清楚,或标签自身有重叠,那么这样模型可能依旧无法准确的对文本进行判断。同时文章中提到了数据稀疏的问题,随着层级结构的划分,低级标签的训练文本应该比较少,那么模型是否可以如我们所想学到预期的知识这也是值得探索的。那么这时候或许我们就应该使用一些方法进行数据增强了。

    相关资料

    1.  RCV1
    2. Amazon 670K
    3. HFT-CNN论文
    4. ShimShim46/HFT-CNN-源码
    展开全文
  • O奖论文。按照模型分类,共一百多篇优秀论文。包含BP神经网络模型层次分析法、PSR模型、差分方程、排队论、TOPSIS模型、目标规划类、遗传算法等模型
  • 使用具有稀疏集合显着区域的语义层次模型进行图像分类
  • 层级分类(续)-使用B-CNN(Branch CNN)实现

    千次阅读 多人点赞 2020-04-23 11:18:25
    在上一篇博客中,我尝试建立这样一个结构的多层次化的分类模型: 然而实际上我构建的是一个这样的一个分类模型: 虽然最终的分类效果还不错,但我也清楚很大程度上是依赖于利用了训练好的VGG16模型,以及当前分类...

    一、上回介绍

    承接上回多级分类留下的困惑,这一次更新分享一些取得实质的进展!
    在上一篇博客中,我尝试建立这样一个结构的多层次化的分类模型:
    在这里插入图片描述
    然而实际上我构建的是一个这样的一个分类模型:
    在这里插入图片描述
    虽然最终的分类效果还不错,但我也清楚很大程度上是依赖于利用了训练好的VGG16模型,以及当前分类的数目相对较少。这样的实现是难以符合实际工程需求的,因为实际上很多情况下要分类的类别数目是成千上万的,这样简单的分类方式再加之以百万级别的数据,效果可想而知。所以很自然而然地会想到如何去实现一个像上上图一样的模型,通过层次化的分类,我认为可以提高整个模型应对更多类别以及更多的数据的能力。之前的疑惑也正在此,如何去实现这么一个层次化的模型?

    二、B-CNN(Branch Convolutional Neural Network)

    感谢校内老师的点拨!这一次发现了一个好东西,B-CNN(Branch CNN),很大程度上解除了我的疑惑,在此分享一下!

    Zhu X , Bain M . B-CNN: Branch Convolutional Neural Network for Hierarchical Classification[J]. 2017.

    2.1 B-CNN结构

    接下来先通过简单分享几个论文的关键片段介绍一下B-CNN的关键构成!首先直接放出结构图!
    在这里插入图片描述

    A possible way to embed a hierarchy of classes into a CNN model is to output multiple predictions along the CNN layers as the data flow through, from coarse to fine. In this case, lower layers output coarser predictions while higher layers output finer predictions.

    We name it Branch Convolutional Neural Network (B-CNN) as it contains several branch networks along the main convolution workflow to do predictions hierarchically.

    即论文中认为要实现一个层次化的分类结构,使其能够完成从粗类到细类的分类功能,则应该让模型的lower layers输出粗类(大类)的分类结果而higher layer输出细类(小类)的分类结果。而该模型命名为B-CNN的原因也在于其包含了多个输出分支(如上图)以实现层次化的分类。

    A B-CNN model uses existent CNN components as building blocks to construct a network with internal output branches. The network shown at the bottom in Figure 1a is a traditional convolutional neural network. It can be an arbitrary ConvNet with multiple layers. The middle part in Figure 1a shows the output branch networks of a B-CNN. Each branch net produces a prediction on the corresponding level in the label tree (Figure 1b, shown in same color). On the top of each branch, fully connected layers and a softmax layer are used to produce the output in one-hot representation. Branch nets can consist of ConvNets and fully connected neural networks. But for simplicity, in our experiments, we only use fully connected neural networks asour branch nets.

    简要概括一下,即论文中所构建的B-CNN结构,在图中水平推进的方向上,(即从input到最后的fine prediction)大多使用的都是ConvNet构成的block,而其中垂直分支出来的部分,为了实验的方便则采用的是全连接层进行预测输出。

    2.2 Loss Function&Loss Weight

    在这里插入图片描述

    When the image is fed into B-CNN, the network will output three corresponding predictions as the data flow through and each level’s loss will contribute to the final loss function base on the loss weights distribution.

    论文中同样提到了Label-Tree这样一个概念,即针对不同层次的分类数目,由Coarse 1到最终的Fine(Coarse 3)拥有三种不同one-hot标签。而当一张图片输入进该模型后,整个模型会相应输出三个与层次对应的预测向量,然后每一个层次输出的loss将对应一个loss weight(损失权重),而三个层次的loss则根据各自的weight合并构成最终模型的loss。

    在这里插入图片描述
    这里附上论文中所定义的损失函数。简要的解释一下,其中K代表的是不同的层次数,A代表的是损失权重(Loss weight),而最后那个logxxx则是交叉熵损失(Cross Entropy Loss)。这样的一个损失函数能够考虑到每一个层次的loss及它们各自对最终loss的贡献影响。

    2.3 Branch Training Strategy-分支训练策略

    他来了他来了,他带着策略走来了。我认为又让我眼前一亮的就是论文中提出的针对这个分支模型的训练策略。那么具体来说是怎么样一个策略呢?
    论文中提出,通过调整各层次的loss weight,可以使模型在不同训练阶段(即epoch数目)的训练有所侧重(focus)。简单来说,比如一个两层的模型,起初损失权重的分配可以是[0.9,0.1],即让模型focus于第一个层次的学习,而过了比如30个epoch后,权重分配可以是[0.2,0.8],这样模型又将focus于第二个层次的学习训练。

    This procedure requires the classifier to extract lower features first with coarse instructions and fine tune parameters with fine instructions later. It to an extent prevents the vanishing gradient problem which would make the updates to parameters on lower layers very difficult when the network is very deep.

    如论文所阐述的,这样一个有所侧重分支训练策略具有可解释性,并且能够一定程度上减少深度学习常面对的梯度消失问题。

    三、实际实现

    ok接下来就针对B-CNN结合之前的代码和论文代码进行实现!这里要说明一下原论文代码在这里->B-CNN
    首先是一些必要的包以及预设的一些值如下:

    import keras
    import numpy as np
    import os
    import cv2
    import tensorflow as tf
    from keras.models import Model
    from keras.layers import Dense, Dropout, Activation, Flatten
    from keras.layers import Conv2D, MaxPooling2D, Input
    from keras.initializers import he_normal
    from keras import optimizers
    from keras.callbacks import LearningRateScheduler
    from keras.layers.normalization import BatchNormalization
    from keras.utils.data_utils import get_file
    from keras import backend as K
    import matplotlib
    from keras.preprocessing.image import ImageDataGenerator
    from keras.optimizers import Adam
    from keras.preprocessing.image import img_to_array
    from sklearn.preprocessing import MultiLabelBinarizer
    from sklearn.model_selection import train_test_split
    
    
    Image_width=150
    Image_height=150
    Image_channels=3
    Image_size=(Image_width,Image_height)
    Image_shape=(Image_width,Image_height,Image_channels)
    batch_size=15
    
    #不同层次的损失权重
    alpha = K.variable(value=0.8, dtype="float32", name="alpha") # A1
    beta = K.variable(value=0.2, dtype="float32", name="beta") # A2
    
    #用于根据不同训练阶段调整学习率
    def scheduler(epoch):
        learning_rate_init=0.0003
        if epoch>20:
            learning_rate_init=0.0005
        if epoch>30:
            learning_rate_init=0.0001
        return learning_rate_init
    
    #用于调整不同层次的损失权重
    class LossWeightsModifier(keras.callbacks.Callback):
        def __init__(self, alpha, beta):
            self.alpha = alpha
            self.beta = beta
    
        def on_epoch_end(self, epoch, logs={}):  # focus
            if epoch == 10:
                K.set_value(self.alpha, 0.8)
                K.set_value(self.beta, 0.2)
            if epoch == 25:
                K.set_value(self.alpha, 0.1)
                K.set_value(self.beta, 0.9)
            if epoch == 40:
                K.set_value(self.alpha, 0)
                K.set_value(self.beta, 1)
    

    接下来一步是上回提到的,就是将label分别按层次处理成对应的one-hot编码以及划分训练集和验证集,详细可以对应上回。

    #输入训练文件路径,返回数据array以及labels
    def prepare(path):
        fileList = os.listdir(path)  # 待修改文件夹
        data=[]
        labels1=[]
        labels2=[]
        for fileName in fileList:
            image=cv2.imread(os.path.join(path,fileName))
            if image is not None:
                std_image=tf.image.per_image_standardization(image)#图片normalization
                image2=cv2.resize(std_image.numpy(),Image_size)
                image2=img_to_array(image2)
                data.append(image2)
                label1=str(fileName).split("_")[0:1]
                label2=str(fileName).split("_")[1:2]
                labels1.append(label1)
                labels2.append(label2)
        data=np.array(data,dtype="float32")
        return data,labels1,labels2
    
    path=r"./DATA/train"
    data,labels1,labels2=prepare(path)
    mlb1=MultiLabelBinarizer()#用于生成one-hot编码
    mlb2=MultiLabelBinarizer()
    labels1_onehot=mlb1.fit_transform(labels1).astype('float32')#one-hot编码
    labels1_num=len(mlb1.classes_)
    labels2_onehot=mlb2.fit_transform(labels2).astype('float32')
    labels2_num=len(mlb2.classes_)
    
    label=[]
    for i in range(labels2_onehot.shape[0]):
        lab=[]
        lab.append(labels1_onehot[i])
        lab.append(labels2_onehot[i])
        label.append(lab)#创建自定义标签
    
    (trainX,testX,trainY,testY)=train_test_split(data,label,test_size=0.2,random_state=42)
    

    然后构建一个自定义的Generator用于数据增强,与上回提到的方法一样:

    train_datagen = ImageDataGenerator(#用于数据增强
        rotation_range=15,
        shear_range=0.1,
        rescale=1./255,
        zoom_range=0.2,
        horizontal_flip=True,
        width_shift_range=0.1,
        height_shift_range=0.1
    )
    validate_datagen = ImageDataGenerator(
        rescale=1./255
    )
    def data_generator(generator,images,labels,batch_size):#自定义generator,输出多标签
        num_samples=len(images)
        input_generator=generator.flow(images,labels,batch_size=batch_size)
        while True:
            for offset in range(0,num_samples,batch_size):
                batch_samples,batch_labels=input_generator.next()
                X_train=[]
                y1_train=[]
                y2_train=[]
                for i in range(len(batch_samples)):
                    img=batch_samples[i]
                    labels1=batch_labels[i][0]
                    labels2=batch_labels[i][1]
                    X_train.append(img)
                    y1_train.append(labels1)
                    y2_train.append(labels2)
                X_train=np.array(X_train)
                y1_train=np.array(y1_train)
                y2_train=np.array(y2_train)
                yield X_train,[y1_train,y2_train]
    
    

    接下来是模型的搭建,其中包含了一个Coarse分支(对应我原先 交通工具-动物的大类),以及一个Fine分支细分。

    #------------------model----------------------
    img_input = Input(shape=Image_shape, name='input')
    #--- block 1 ---
    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)
    x = BatchNormalization()(x)
    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)
    x = BatchNormalization()(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)
    
    #--- coarse branch ---
    c_1_bch = Flatten(name='c1_flatten')(x)
    c_1_bch = Dense(256, activation='relu', name='c1_fc2')(c_1_bch)
    c_1_bch = BatchNormalization()(c_1_bch)
    c_1_bch = Dropout(0.5)(c_1_bch)
    class_one_classify = Dense(labels1_num, activation='softmax', name='class_one')(c_1_bch)
    
    #--- block 3 ---
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)
    x = BatchNormalization()(x)
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)
    x = BatchNormalization()(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)
    
    #--- fine block ---
    x = Flatten(name='flatten')(x)
    x = Dense(256, activation='relu', name='fc_cifar10_1')(x)
    x = BatchNormalization()(x)
    x = Dropout(0.5)(x)
    class_two_classify = Dense(labels2_num, activation='softmax', name='class_two')(x)
    
    model = Model(input=img_input, output=[class_one_classify, class_two_classify], name='branch-CNN')
    
    sgd = optimizers.SGD(lr=0.003, momentum=0.9, nesterov=True)
    model.compile(loss='categorical_crossentropy',
                  optimizer=sgd,
                  loss_weights=[alpha, beta],
                  metrics=['accuracy'])
    

    接下来就是对Keras又进一步的了解,即如何使用callbacks实现可控制的训练过程:

    change_lr = LearningRateScheduler(scheduler)#可控制学习率变化
    change_lw = LossWeightsModifier(alpha, beta)#控制损失权重的变化
    cbks = [change_lr, change_lw]
    
    total_validate=len(testY)#总验证数
    total_train=trainX.shape[0]#总训练数
    history=model.fit_generator(
        data_generator(train_datagen,trainX,trainY,batch_size),
        epochs=60,
        validation_data=data_generator(validate_datagen,testX,testY,batch_size),
        validation_steps=total_validate//batch_size,
        steps_per_epoch=total_train//batch_size,
        callbacks=cbks,
        verbose=1,
    )
    

    发现callbacks是一个很有趣的东西,通过callbacks可以动态调整训练参数、提早结束训练等让我觉得有意思的操作。打算接下来再仔细学习一下关于callbacks的使用技巧,以深化对keras的运用嘿嘿。
    那么以上即为根据B-CNN对于层级分类的具体实现啦!

    四、实验结果

    囿于设备有限,我暂时还没调整出能得到比较好结果的参数。不过接下来会慢慢进行调整,我还是挺相信这个结构能带来比较好的成果的!待之后调试出比较好的参数再放结果上来嘿嘿。

    五、接下来目标

    基本上来说,对于自己探索的这一整个流程,已经经历了从数据搜集、数据预处理、模型构建、模型优化这些个过程,接下来要做的就是模型的部署。这些天在家其实捣鼓了不少,接下来的一篇应该是记录一下部署的成果!
    在这里插入图片描述

    展开全文
  • 首先从双语训练语料中抽取时态特征构建最大熵分类模型,然后再抽取包含各类时态信息的层次短语规则的时态特征,最后将规则的时态分类结果作为一类新特征,融入基于层次短语的翻译系统中。实验结果表明,与基线系统...
  • 行业分类-设备装置-基于近邻传播模型从图书目录中学习层次结构的方法.zip
  • 行业分类-设备装置-一种建立服装图像多层次细节骨架模型的方法
  • 模型实现主要分为建立集成分类模型、实例初步预测和结合分析三个层次。MapReduce编程方式实现的分类模型以P2P流量识别为例,分别与单个随机森林和集成其他算法进行对比,实验表明提出模型能获得更好的P2P流量识别...
  •   本文在BERT模型上,提出了利用多任务架构来解决层级多标签文本分类问题。 ·参考文献:   [1] MSML-BERT模型的层级多标签文本分类方法研究 [0] 摘要   在摘要中,作者主要给出了本篇论文的创新点:   1...
  • 数据模型是指数据库的组织形式,它决定了数据库中数据之间联系的表达方式,即把在计算机中表示...1、传统数据模型层次模型、网状模型、关系模型) 2、面向对象模型 3、时态GIS模型 4、三维数据模型 二、传统数据模...
  • 层次分析法模型(数学建模学习)

    千次阅读 2020-07-24 17:32:00
    层次分析法模型 一、层次分析法应用场景 层次分析法(The Analytic hierarchy process/AHP)是比赛中最基础最常用的模型,应用场景在于解决评价类问题。比如哪个人最优秀,哪种方案最好之类。
  • 13.数据分类模型

    千次阅读 2018-11-16 16:48:40
    一、数据分类模型 数据库的类型是根据数据模型来划分的,而任何一个DBMS也是根据数据模型有针对性地设计出来的,这就意味着必须把数据库组织成符合DBMS规定的数据模型。目前成熟地应用在数据库系统中的数据模型有:...
  • 分类、聚类模型

    千次阅读 2020-08-22 18:25:53
    分类、聚类模型一、分类模型(1)逻辑回归(2)举个逻辑回归的例子--水果分类(3)Fisher线性判别分析(4)举个Fisher线性判断的例子二、聚类模型(1)K-means聚类算法(2)K-means++算法(3)举个例子--K-means++...
  • 模型将调序看作分类问题,首先使用递归自动编码器为任意长度的字符串计算向量表示,然后使用这些向量表示作为分类特征,用于预测不同调序方式的概率,最后将这些概率作为新的特征加入翻译模型中进行翻译。...
  • 分类评估模型及优化之交叉验证 交叉验证的三种基本方法: **1、将拆分与评价合并执行** sklearn.model_selection.cross_val_score **2、同时使用多个评价指标** sklearn.model_selection.cross_validate **3、使用...
  • 数学建模--分类模型/聚类模型

    千次阅读 2020-07-17 11:47:27
    第1部分_逻辑回归求解二分类问题(spss) 详情参考pdf 保留一列:苹果为1,橙子为0.删除想要预测的值 越接近1,我们越有理由相信它是苹果。 内生性:扰动项和自变量相不相关 连接函数,保证定义在0到1....
  • 基于层次化聚类的3D模型多示例生成算法,万丽莉,张俊青,现有的3D模型检索研究中均将3D模型作为一个整体进行特征提取和分类,但互联网上大量3D模型由多个物体组成,已有方法对于这些模型
  • 提出一种基于非监督式的层次话题的情感(Unsupervised Level Aspect-Sentiment,ULAS)模型,利用贝叶斯非参数性模型作为先验知识,实现非监督式发现未标记评论文本集话题的层次结构,分析层次话题的情感极性....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,483
精华内容 47,393
关键字:

层次分类模型