精华内容
下载资源
问答
  • 深度学习在用户画像标签模型中的应用

    万次阅读 热门讨论 2018-02-14 01:18:28
    最近一段时间都在学习深度学习,想着在用户画像标签模型中看能不能用上,终于,用了一个多月的时间,结合实际的场景和数据,搭建了一套“孕妇标签”的深度学习模型。这篇文章重点介绍了在用户画像标签模型中运用深度...

    最近一段时间都在学习深度学习,想着在用户画像标签模型中看能不能用上,终于,用了一个多月的时间,结合实际的场景和数据,搭建了一套“孕妇标签”的深度学习模型。这篇文章重点介绍了在用户画像标签模型中运用深度学习建模的过程中,我们遇到的一些问题,以及其中的一些体会和思考,对于深度学习的一些基础概念和模型,文章没有过多的介绍。另外,自己也属于深度学习的入门阶段,若有理解有误的地方,欢迎大家指正。

    什么是用户画像标签

    基于用户事实数据,进行一定抽象后的用户特征表示

    拿电商为例,用户的购物性别,年龄,消费能力等都是用户画像的标签。这些标签能帮助我们理解用户,将用户进行归类,进一步进行个性化运营,例如针对高消费人群,那我们可以展示比较有品味的服装给用户。

    标签建模的方法

    标签建模有什么方法?可分为两大类:

    • 人工建模

      凭借经验,对标签定义一个数据描述口径,通过大数据ETL跑出标签结果,再逐步通过调整口径达到运营可接受的模型。

    • 机器建模

      通过机器对标签样本数据的多维度学习,建立机器自学习的标签模型,可通过对样本数据的调整以及模型结构及参数的调整来逐步优化模型。

    两种建模方式各有优缺点,这里介绍如何运用深度学习进行机器建模。

    下面以“孕妇标签”为例(电商场景下),我们是怎样一步步完成深度学习建模的。

    简陋的模型

    一开始思路很简单,将用户的各个品类购买行为做为模型训练的特征,并通过对品类划分中挑出和孕妇明显相关的品类(例如孕期护理,孕妇装,高跟鞋,彩妆等),通过某些品类的购买行为筛选出训练正负样本,例如按一年统计用户对各个品类的购买次数,若孕妇相关品类购买次数超过5次,则标识为正样本,若高跟鞋,彩妆类购买次数超过5次,则标识为负样本。

    正负样本,模型训练需要的特征数据都有了,最简单的就是构造一个浅层神经网络模型,将数据丢给模型,看看模型能否自我训练学习,这就是模型最初的样子:

    image

    这个版本的模型直接用Keras构造,非常简单,也可以直接看到实时训练的情况。准备了5万的样本训练数据,大概几分钟就可以发现模型的Training accuracy和Validate accuracy都达到了0.9以上,可以试试模型的效果,但要再找出一批已知是否孕妇的数据,是个大难题,所以比较直接的就是找了几个(女)同事的帐号,虽然测试数量少,但比较有代表性,很容易发现模型的问题: 对于几个月前是孕妇,现在已经是妈妈的情况,没有准确的识别出来。想想,因为模型输入的数据是过去一年的购买记录,模型无法感知数据在时间维度上的变化。

    时序模型

    由于孕妇标签的时间敏感性,模型中需要考虑时间维度,比如6个月前有购买过孕妇类,最近2个月已经不再买了,而是开始买婴幼品类的商品,这个说明现在已经不再是孕妇了,应该打上新生妈妈的标签了。

    因此,首先在模型的特征维度上需要将一年的购买行为按时间间隔(月)拆开,同时将用户的购买行为数据放在一个时间轴上,这样可以提供更立体的特征数据给模型训练,于是我们选用了可以感知时序数据的RNN模型,对用户某段短时间内的购买行为综合分析学习,这样模型更容易准确地判断出孕妇标签。

    比如,用户购买平底鞋这个行为,一般情况下,对孕妇标签的判断没有太大的作用,但如果用户购买平底鞋的时候,还买了孕妇裤,这就不同了,购买平底鞋这个行为就变得和孕妇行为相关了,和标签结果就有一定的相关性。就是因为加上用户前后购买行为这个Context,而让数据更立体,更丰富,模型对标签的判断也就更准确。

    image

    模型的特征是用户每个月对各个品类的购买次数,比如我们对最近18个月的,2000个品类进行统计,得到18*2000的矩阵,作为一个用户的特征表示,所以模型的inputs维度是:user_num * months * categorys (e.g. 10000 * 18 * 2000),output targets维度是:user_num * 1 (e.g. 10000 * 1)

    模型采用LSTM,对LSTM的最后一个output通过sigmoid映射到[0,1]后和target对比,计算得出cost函数。

    模型训练完后,再用测试数据校验了下,已经可以准确区分出新生妈妈和孕妇了。

    但这个模型的输入特征不够丰富,用户的行为除了购买之外,点击行为也是放进来,让学习维度更加丰富。

    多时序模型

    从用户的浏览->点击->购买这个转化漏斗可以知道,用户的点击行为远比购买行为更频繁。以月为单位,一个用户在某个品类的购买次数一般为1次,很少超过10次。但点击不同,如果以月为单位统计,点击的数量会很大,这样会有什么问题?

    假设按自然月统计,如果一个用户在1号那天就对某个品类点击次数达到10次,我们知道用户对这个品类是有偏好的,但如果放到1个月统计这个维度,10次可能还没达到模型认为有强相关的程度。换句话说,就是模型无法实时感知到用户的偏好变化

    所以,针对点击行为,我们得采用以天为单位统计用户在各个品类下的点击次数,作为模型的输入。这样就出现了购买行为和点击行为的两套时序模型,他们的时间维度不同,不能放在一套LSTM模型里,只能分开两套,再通过一层fully connected layer,将两套LSTM的输出作为这层的输入,得到最终的模型结果。

    image

    模型调优

    结合点击和购买时序行为的模型,使用样本的筛选规则得到的数据,都可以准确的识别出结果,但模型的泛化能力如何,会不会overfit,由于缺乏更丰富的数据样本,并不好验证这点。

    所以,对于模型的评估,我们采取人工伪造数据的方式来校验,比如将训练样本中的购买数据全部抹掉,这样用一份只有点击的数据来校验模型对点击行为的学习能力;再比如将训练样本中强孕妇相关品类的购买,点击数据抹掉,来验证模型对其他“潜在”的相关维度的学习能力。

    值得一提的是,模型的训练样本是按照一定的规则进行人工筛选标注完成的,而筛选的条件同时也是模型的学习维度中的一部分,这意味着模型很容易学习到这些“人工设定”的规则,而忽略那些“潜在”的维度和结果之间的相关性。模型容易出现“Memorize more than Learning”,也就是缺失泛化能力。

    如何提高模型的泛化能力:

    • 减少Hidden Size,降低模型记忆单元数
    • 增加Dropout,通过随机抹掉部分hidden layer的节点,类似通过让模型变得简单,同时通过将多个简单的模型的结果综合起来,达到提高泛化能力的目的
    • 采用L2 Regularizer,通过对权重的惩罚,来提高模型泛化能力
    • 提供更丰富的训练样本,让模型接触更多不一样的数据

    体会和思考

    • 深度学习模型更像一个黑盒子,无法通过因果关系进行逻辑推导,而只能通过不同的数据不断从外部试探,理解模型

    • 人的很多特征都是会随着时间变化的,用户画像的标签建模是需要考虑好时间维度的数据

    • 用户画像标签模型的数据样本获取成本大,通过规则筛选的数据,不够丰富,容易导致模型泛化能力差

    展开全文
  • 基于用户行为的兴趣标签模型

    万次阅读 2018-09-07 13:50:29
    “千人千面”算法在互联网行业已经不是个新鲜的词汇,但如何做到对用户兴趣的精准匹配仍是难点,特别是对图片、视频等非文本内容来说,因为本身缺乏描述性文本,因此兴趣标签成为一种非常重要的语义素材。...

    随着网站规模的扩大,内容也相应的与日俱增,涵盖的频道也越来越繁杂,在如此海量的信息平台下,如何更好的服务用户成了各门户网站的首要任务。从用户需求的角度考虑,对内容的判断标准无疑是用户对此内容是否感兴趣。“千人千面”算法在互联网行业已经不是个新鲜的词汇,但如何做到对用户兴趣的精准匹配仍是难点,特别是对图片、视频等非文本内容来说,因为本身缺乏描述性文本,因此兴趣标签成为一种非常重要的语义素材。本文主要介绍根据优酷用户历史行为构建的兴趣标签模型,模型能够及时捕捉用户兴趣的变化,调整个性化兴趣标签的排序,从而达到提高精准推荐和个性化推荐的效果。

    1.模型数据流程

    模型从用户行为出发,最终定位用户的兴趣标签,根据行为权重、时间衰减等因素,计算标签权重并排序。流程如下所示: 
    数据流程

    在用户行为的选取上,登录用户考虑的用户行为包括观看、搜索、收藏、评论、顶踩和上传,未登录用户考虑的用户行为则只有观看和搜索。

    1.1 用户行为数据采集

    在本项目中,我们选取了最近180天内的用户行为,每天将新的行为数据和历史数据进行累加计算。 
    用户行为

    1.2 视频Tag信息

    视频都有一些特定的分词标签描述,一般是通过视频标题和描述分词提取出来的,可以单独使用这些分词,也可以用机器学习算法给标签打上不同的权重,来标识标签不同的重要性。 
    视频tag

    1.3 用户兴趣标签

    用户兴趣标签体系是一个分层级表示用户兴趣的结构,目的是为了从不同的粒度定位用户的兴趣。从视频分词标签到用户兴趣标签有一个映射关系,目前视频分词标签量级为百万,用户兴趣标签有8万左右。我们给用户打上下一层级标签的同时也会打上上一层级的标签。 
    兴趣标签

    2. 用户兴趣标签权重计算规则

    2.1 用户行为打分规则(每日)

    我们对用户不同的行为类型设置了不同的权重。如此设定行为权重带有一定的主观性,但设定值符合大多数用户的行为特点,也可以快速推进项目的进行。在下一版的改进计划中,拟先对用户进行一次聚类,然后对每个聚类群体利用回归算法迭代出一组最优权重值,从而使权重的设定更具有针对性。下面主要介绍下观看行为打分规则。 
    主要考虑因素如下: 
    1、 视频观看比例,用户一天内的观看比例有可能多倍于视频长度。 
    2、 降低短视频的打分值。 
    3、 考虑视频播放次数的因素。 
    4、 限定打分范围。

    2.2 用户视频Tag打分规则

    将用户行为融合,并转化成对视频标签的打分。在生成用户Tag打分数据时,我们考虑以下几个因素: 
    1、 时间衰减系数。用户行为距当前时间越近的影响越大,因此从用户标签上可以反应该用户最近的兴趣点。 
    2、 每天Tag数量衰减系数。考虑到用户某一天内对某一标签的集中行为有可能会拉偏此用户的兴趣点,因此添加了tag数量的衰减。 
    行为融合

    2.3 用户兴趣标签打分规则

    这一步只是简单的将视频标签映射到用户兴趣标签分级体系,累加得到兴趣标签分值并按由高到低进行排序。结果数据形式如下,Weight为该兴趣标签分值占总标签分值的百分比,Support为该兴趣标签的累加分值。 
    打分结果展示

    小结:

    虽然目前的兴趣标签模型还存在一些不足之处有待进一步改进,但引入用户兴趣模型确实可以在一定程度上更精确的定位用户的兴趣,进而提高个性化推荐的质量。此外,如何优化兴趣标签的提取也会直接影响着模型的精度。

    展开全文
  • 本文同步发布知乎: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-源码
    展开全文
  • 翻译:吴金笛校对:郑滋本文约4600字,建议阅读12分钟。本文明确了多标签图像分类的概念,并讲解了如何构建多标签图像分类模型。介绍你正在处理图像数据吗?我们可以使用计算...

    翻译:吴金笛 校对:郑滋

    本文约4600字,建议阅读12分钟

    本文明确了多标签图像分类的概念,并讲解了如何构建多标签图像分类模型。


    介绍


    你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情:


    • 对象检测

    • 图像分割

    • 图像翻译

    • 对象跟踪(实时),还有更多……



    这让我思考——如果一个图像中有多个对象类别,我们该怎么办?制作一个图像分类模型是一个很好的开始,但我想扩展我的视野以承担一个更具挑战性的任务—构建一个多标签图像分类模型!


    制作一个图像分类模型

    https://www.analyticsvidhya.com/blog/2019/01/build-image-classification-model-10-minutes/?utm_source=blog&utm_medium=multi-label-image-classification


    我不想使用简单玩具数据集来构建我的模型—这太普通了。然后,它打动了我—包含各种各样的人的电影/电视剧海报。我可以仅通过看海报就能来构建我自己的多标签图像分类模型来预测不同的流派吗?


    640?wx_fmt=png


    答案很简单——是的!在本文中,我解释了多标签图像分类背后的思想。我们将使用电影海报构建我们自己的模型。你将会对我们的模型产生的令人印象深刻的结果感到惊讶。如果你是《复仇者联盟》或《权力的游戏》的粉丝,那么在实现部分会有一个很棒的惊喜(无剧透的)给你。


    激动吗?很好,我们开始吧!


    目录


    1. 什么是多标签图像分类?

    2. 多标签图像分类与多类图像分类有何不同?

    3. 了解多标签图像分类模型体系结构;

    4. 构建多标签图像分类模型的步骤;

    5. 案例研究:用Python解决多标签图像分类问题;

    6.接下来的步骤和你的实验;

    7.尾记。


    1. 什么是多标签图像分类?


    让我们通过一个直观的例子来理解多标签图像分类的概念。 看看下面的图片:


    640?wx_fmt=png


    图1中的对象是一辆汽车。这是显而易见的。然而,在图2中没有汽车,只有一组建筑物。你能看出我们要怎么做吗?我们将图像分为两类,即,有车还是没车。


    当我们只有两类图像可以分类时,这就称为二值图像分类问题。


    让我们再看一个图片:


    640?wx_fmt=png


    在这个图片中,你识别出了多少个物体?有太多了——房子、带喷泉的池塘、树木、岩石等等。所以,当我们可以将一个图像分类为多个类(如上图所示)时,就称为多标签图像分类问题。


    现在,这里有一个问题——我们大多数人对多标签和多类图像分类感到困惑。当我第一次遇到这些术语时,我也被迷惑了。现在我对这两个主题有了更好的理解,让我来为你们澄清一下区别。


    2. 多标签图像分类与多类图像分类有何不同?

     

    假设给我们一些动物的图片,让我们把它们分成相应的类别。为了便于理解,我们假设一个给定的图像可以分为4类(猫、狗、兔子和鹦鹉)。现在,可能有两种情况:


    • 每个图像只包含一个对象(上述4个类别中的任何一个),因此,它只能被归入4个类别中的一个。

    • 图像可能包含多个对象(来自上述4个类别),因此该图像将属于多个类别。


    让我们通过例子来了解每种情况,从第一个场景开始:


    640?wx_fmt=png


    这里,我们的每个图像都只包含一个对象。敏锐的你会注意到在这个集合中有4种不同类型的对象(动物)。


    这里的每张图片只能被分类为猫、狗、鹦鹉或兔子。没有任何一个图像属于多个类别的情况。


    • 当图像可分类的类别超过两种时

    • 一个图像不属于一个以上的类别


    如果满足上述两个条件,则称为多类图像分类问题。


    现在,让我们思考第二种情况 —— 看看下面的图像:


    640?wx_fmt=png


    • 第一张图片(左上角)包含一只狗和一只猫

    • 第二幅图(右上角)包括一只狗、一只猫和一只鹦鹉

    • 第三幅图(左下角)包含一只兔子和一只鹦鹉,以及

    • 最后一张图片(右下角)包含一只狗和一只鹦鹉

     

    这些都是给定的图像的标签。这里的每个图像都属于一个以上的类,因此它是一个多标签图像分类问题。


    这两种情况应该有助于你理解多类和多标签图像分类之间的区别。如果你需要进一步的说明,请在本文下面的评论部分与我联系。


    在进入下一节之前,我建议你通读这篇文章——在10分钟内构建你的第一个图像分类模型!它将帮助你了解如何解决一个多类图像分类问题。


    在10分钟内构建你的第一个图像分类模型:

    https://www.analyticsvidhya.com/blog/2019/01/build-image-classification-model-10-minutes/?utm_source=blog&utm_medium=multi-label-image-classification


    3. 构建多标签图像分类模型的步骤


    现在我们已经对多标签图像分类有了一个直观的认识,让我们深入讨论解决这个问题应该遵循的步骤。


    第一步是以结构化格式获取数据。这既适用于图像二分类,也适用于多类图像分类。


    你应该有一个文件夹,其中包含您想要训练模型的所有图像。现在,为了训练这个模型,我们还需要图像的真实标签。因此,你还应该有一个.csv文件,其中包含所有训练图像的名称及其对应的真实标签。


    我们将在本文后面学习如何创建这个.csv文件。现在,只要记住数据应该是一种特定的格式。数据准备好后,我们可以将进一步的步骤划分如下:


    加载和预处理数据


    首先,加载所有图像,然后根据项目的需求对它们进行预处理。为了检查我们的模型将如何对不可见的数据(测试数据)执行,我们创建了一个验证集。我们在训练集上训练我们的模型并使用验证集对其进行验证(标准的机器学习方法)。


    定义模型的结构


    下一步是定义模型的结构。这包括决定隐藏层的数量、每层神经元的数量、激活函数等等。


    训练模型


    是时候在训练集上训练我们的模型了!我们输入训练图像及其对应的真标签对模型进行训练。我们还在这里传入验证图像,以帮助我们验证模型在不可见数据上的性能。


    作出预测


    最后,我们使用训练过的模型对新图像进行预测。


    4. 了解多标签图像分类模型结构

     

    现在,多标签图像分类任务的预处理步骤将类似于多类问题的预处理步骤。关键的区别在于我们定义模型结构的步骤。


    对于多类图像分类模型,我们在输出层使用softmax激活函数。对于每个图像,我们想要最大化单个类的概率。当一个类的概率增大时,另一个类的概率就减小。所以,我们可以说每个类的概率都依赖于其他类。


    但是在多标签图像分类的情况下,单个图像可以有多个标签。我们希望概率彼此独立。使用softmax激活函数并不合适。相反,我们可以使用sigmoid激活函数。这将独立地预测每个类的概率。它将在内部创建n个模型(这里的n是总类数),每个类一个模型,并预测每个类的概率。


    利用sigmoid激活函数将多标签问题转化为n-二分类问题。因此对于每幅图像,我们将得到概率来确定图像是否属于第一类,以此类推。由于我们已经将其转换为一个n-二分类问题,我们将使用binary_cross-sentropy损失。我们的目标是尽量减少这种损失,以提高模型的性能。


    这是我们在定义用于解决多标签图像分类问题的模型结构时必须做的主要更改。训练部分将类似于一个多类问题。我们将传入训练图像及其对应的真实标签,以及验证集来验证模型的性能。


    最后,我们将获取一张新的图像,并使用训练过的模型来预测该图像的标签。还跟得上吗?


    5. 案例研究:用Python解决多标签图像分类问题


    祝贺你来到这一步!你的奖励——用Python解决一个可怕的多标签图像分类问题。是时候启动你最喜欢的Python IDE了!


    让我们明确问题陈述。我们的目标是通过电影的海报图像来预测电影的类型。你能猜到为什么这是一个多标签图像分类问题吗?在你往下看之前想一下。


    一部电影可以属于多种类型,对吧?它不仅仅属于一个类别,如动作片或喜剧片。电影可以是两种或多种类型的结合。因此,它是多标签图像分类。


    我们将使用的数据集包含多个多类型电影的海报图像。我对数据集做了一些更改,并将其转换为结构化格式,即一个包含图像的文件夹和一个存储真正标签的.csv文件。你可以从这里下载结构化数据集。下面是一些来自我们数据集的海报:


    这里

    https://drive.google.com/file/d/1dNa_lBUh4CNoBnKdf9ddoruWJgABY1br/view


    640?wx_fmt=png


    如果你愿意,可以在这里下载原始数据集和基准真值。


    这里 

    https://www.cs.ccu.edu.tw/~wtchu/projects/MoviePoster/index.html


    让我们开始编程!


    首先,导入所有需要的Python库:


    1. import keras  

    2. from keras.models import Sequential  

    3. from keras.layers import Dense, Dropout, Flatten  

    4. from keras.layers import Conv2D, MaxPooling2D  

    5. from keras.utils import to_categorical  

    6. from keras.preprocessing import image  

    7. import numpy as np  

    8. import pandas as pd  

    9. import matplotlib.pyplot as plt  

    10. from sklearn.model_selection import train_test_split  

    11. from tqdm import tqdm  

    12. %matplotlib inline  


    现在,读取.csv文件并查看前五行的内容:


    1. train = pd.read_csv('multi_label_train.csv')    # reading the csv file  

    2. train.head()      # printing first five rows of the file  


    640?wx_fmt=png


    这个文件中有27列。 让我们输出这些列的名字看看:


    1. train.columns  


    640?wx_fmt=png


    Genre列包含每个图像的列表,其中明确了每个图像对应的电影的类型。因此,从.csv文件的头部开始,第一个图像的类型是喜剧和戏剧。


    剩下的25列是独热码列。因此,如果一部电影属于动作类型,它的值将为1,否则为0。每个图像可以属于25种不同的类型。


    我们将构建一个返回给定电影海报类型的模型。但在此之前,你还记得构建图像分类模型的第一步吗?


    没错——就是正确的加载和预处理数据。所以,让我们看看所有的训练图片:


    1. train_image = []  

    2. for i in tqdm(range(train.shape[0])):  

    3.     img = image.load_img('Multi_Label_dataset/Images/'+train['Id'][i]+'.jpg',target_size=(400,400,3))  

    4.     img = image.img_to_array(img)  

    5.     img = img/255  

    6.     train_image.append(img)  

    7. X = np.array(train_image)  


    快速浏览一下数组的形状:


    1. X.shape  

    640?wx_fmt=png


    这里共有7254个海报图像,所有图像都已转换为(400,300,3)的形状。 让我们绘制并可视化其中一个图像:


    1. plt.imshow(X[2])  


    640?wx_fmt=png


    这是电影《交易场所》的海报。让我们输出这部电影的类型:


    1. train['Genre'][2]  


    640?wx_fmt=png


    这部电影仅有一个类型——喜剧。我们的模型所需的下一步是所有图像的真实标签。你能猜出这7254个图像真实标签的形状是什么吗?


    让我们来看看。 我们知道总共有25种可能的类型。对于每个图像,我们将有25个目标,即电影是否属于该类型。 因此,所有这25个目标的值都为0或1。


    我们将从训练文件中删除Id和Genre列,并将剩余的列转换为将成为我们图像目标的数组:


    1. y = np.array(train.drop(['Id', 'Genre'],axis=1))  

    2. y.shape  


    640?wx_fmt=png


    输出数组的形状是(7254,25),正如我们预想的那样。 现在,让我们创建一个验证集,它将帮助我们检查模型在不可见的数据上的性能。 我们将随机分离10%的图像作为我们的验证集:


    1. X_train, X_test, y_train, y_test =   

    2.                  train_test_split(X, y, random_state=42, test_size=0.1)  


    下一步是定义模型结构。输出层将有25个神经元(等于类型的数量),我们将使用sigmoid作为激活函数。


    我将使用某一结构(如下所示)来解决这个问题。 你也可以通过更改隐藏层数,激活函数和其他超参数来修改此架构。


    1. model = Sequential()  

    2. model.add(Conv2D(filters=16, kernel_size=(5, 5), activation="relu", input_shape=(400,400,3)))  

    3. model.add(MaxPooling2D(pool_size=(2, 2)))  

    4. model.add(Dropout(0.25))  

    5. model.add(Conv2D(filters=32, kernel_size=(5, 5), activation='relu'))  

    6. model.add(MaxPooling2D(pool_size=(2, 2)))  

    7. model.add(Dropout(0.25))  

    8. model.add(Conv2D(filters=64, kernel_size=(5, 5), activation="relu"))  

    9. model.add(MaxPooling2D(pool_size=(2, 2)))  

    10. model.add(Dropout(0.25))  

    11. model.add(Conv2D(filters=64, kernel_size=(5, 5), activation='relu'))  

    12. model.add(MaxPooling2D(pool_size=(2, 2)))  

    13. model.add(Dropout(0.25))  

    14. model.add(Flatten())  

    15. model.add(Dense(128, activation='relu'))  

    16. model.add(Dropout(0.5))  

    17. model.add(Dense(64, activation='relu'))  

    18. model.add(Dropout(0.5))  

    19. model.add(Dense(25, activation='sigmoid'))  


    让我们显示我们的模型总结:


    1. model.summary()  

     

    640?wx_fmt=png


    有相当多的参数要学习! 现在,编译模型。 我将使用binary_crossentropy作为损失函数,使用ADAM作为优化器(同样,你也可以使用其他优化器):


    1. model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])  


    最后,我们最有趣的部分——训练模型。我们将训练模型10个循环,并传入我们之前创建的验证数据,以验证模型的性能:


    1. model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test), batch_size=64)  


    640?wx_fmt=png


    我们可以看到训练损失已降至0.24,验证损失也降低了。 下一步是什么? 是时候做预测了!


    所有《权力的游戏(GoT)》和《复仇者联盟(Avengers)》的粉丝——这是给你们的礼物。 让我获取GoT和Avengers的海报,并将它们提供给我们的模型。 在继续之前下载GOT和Avengers的海报。


    GOT

    https://drive.google.com/file/d/1cfIE-42H4_UM-JERoctseLUpKwmd40YE/view

    Avengers

    https://drive.google.com/file/d/1buNOcfo0Im2HmFH778dUwxven8Zzebtu/view


    在进行预测之前,我们需要使用前面看到的相同步骤预处理这些图像。


    1. img = image.load_img('GOT.jpg',target_size=(400,400,3))  

    2. img = image.img_to_array(img)  

    3. img = img/255  


    现在,我们将使用我们训练好的模型预测这些海报的类型。该模型将告诉我们每种类型的概率,我们将从中获得前3个预测结果。


    1. classes = np.array(train.columns[2:])  

    2. proba = model.predict(img.reshape(1,400,400,3))  

    3. top_3 = np.argsort(proba[0])[:-4:-1]  

    4. for i in range(3):  

    5.     print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]]))  

    6. plt.imshow(img)  


    640?wx_fmt=png


    真棒!我们的模型为《权力的游戏》预测了戏剧,惊悚和动作类型。在我看来,这个分类很好。让我们在《复仇者联盟》海报上试试我们的模型。图像预处理:


    1. img = image.load_img('avengers.jpeg',target_size=(400,400,3))  

    2. img = image.img_to_array(img)  

    3. img = img/255  


    然后做预测:


    1. classes = np.array(train.columns[2:])  

    2. proba = model.predict(img.reshape(1,400,400,3))  

    3. top_3 = np.argsort(proba[0])[:-4:-1]  

    4. for i in range(3):  

    5.     print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]]))  

    6. plt.imshow(img)  


    640?wx_fmt=png


    我们的模型给出的类型是戏剧、动作和惊悚。同样,这些都是非常准确的结果。这个模型能在好莱坞电影分类上表现的一样优秀吗?让我们来看看。我们将使用这张Golmal 3的海报。


    640?wx_fmt=png


    你知道在这个阶段该做什么——加载和预处理的图像:


    1. img = image.load_img('golmal.jpeg',target_size=(400,400,3))  

    2. img = image.img_to_array(img)  

    3. img = img/255  


    然后为这个海报预测电影类型:


    1. classes = np.array(train.columns[2:])  

    2. proba = model.predict(img.reshape(1,400,400,3))  

    3. top_3 = np.argsort(proba[0])[:-4:-1]  

    4. for i in range(3):  

    5.     print("{}".format(classes[top_3[i]])+" ({:.3})".format(proba[0][top_3[i]]))  

    6. plt.imshow(img)  


    640?wx_fmt=png


    《Golmaal 3》是一部喜剧,我们的模型预测它为最受欢迎的类型。其他预测类型是剧情片和浪漫片——相对准确的评估。我们可以看到该模型能够仅通过海报预测电影类型。


    6. 接下来的步骤和你自己的实验


    这就是如何解决多标签图像分类问题。尽管我们只有大约7000张图片来训练模型,但我们的模型表现得非常好。


    你可以尝试收集更多的训练海报。我的建议是使所有的流派类别有相对平等的分布的数据集。为什么?


    如果某一类型在大多数训练图像中重复出现,那么我们的模型可能会与该类型过度匹配。对于每一张新图片,该模型都可能预测出相同的类型。为了克服这个问题,你应该尝试均衡的流派类别分布。


    这些是你可以尝试改进模型性能的一些关键点。你还能想到别的吗?告诉我!


    7. 尾记


    除了流派类型预测外,多标签图像分类还有多种应用。例如,你可以使用此技术自动标记图像。假设你想预测图像中服装的类型和颜色。你可以建立一个多标签图像分类模型,这将帮助你预测同时两者!


    希望本文能帮助你理解多标签图像分类的概念。如果你有任何反馈或建议,请在下面的评论部分与我们分享。实验快乐!


    原文链接:

    https://www.analyticsvidhya.com/blog/2019/04/build-first-multi-label-image-classification-model-python/

    原文标题:

    Build your First Multi-Label Image Classification Model in Python

    译者简介:吴金笛,雪城大学计算机科学硕士一年级在读。迎难而上是我最舒服的状态,动心忍性,曾益我所不能。我的目标是做个早睡早起的Cool Girl。

    转自:数据派THU 公众号;

    版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。

    END

    合作请加QQ:365242293  

    数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

    640?wx_fmt=png

    展开全文
  • 不知道你们有没有发现,营销的手段越来越...我记得当初打造1000+标签库的时候,也是觉得太多了,但大数据运营几年后,却有了观念的转变今天就来讲一讲,主要包括五大部分内容:标签库定位、标签体系、产品功能、平台...
  • 互联网大数据中标签的类型

    千次阅读 2019-10-16 10:10:33
    从数据提取维度来看,标签可分为:事实标签模型标签和预测标签。 事实标签 从生产系统获取数据,定性或定量描述用户的自然属性、产品属性、消费属性、资源属性等,以及根据工作人员经验积累的业务规则进行筛选、...
  • 传统的用于执行分类任务的深度学习模型,往往是解决的单分类任务,即为一幅图像只预测一个标签,但现实世界中往往一幅图像中通常是含有多个标签的 。Pytorch中分类任务常用的损失函数CrossEntropyLoss也是处理单标签...
  • HTML5常用四种盒模型标签介绍与区分

    千次阅读 2019-07-15 23:34:12
    今天我们一起来学习一下HTML5中几种常见的盒模型标签,作者尽量用白话的形式阐述,欢迎批评指正 首先,先简单介绍一下盒模型模型模型由1、外边距(margin):通常用于盒子的定位,是透明的,可以显示父...
  • Three.js模型标签

    千次阅读 2019-06-14 15:13:31
    Three.js模型标签 在很多的实际的项目中,你可能需要给一个Three.js的模型添加标签标签可以通过一个包含文字图形信息的HTML元素或者一个three.js的精灵模型来表示。 常见问题 three.js三维模型如何添加注释文字?...
  • 用户标签体系的意义及设计方法

    万次阅读 2019-07-02 14:19:17
    我们这次重点谈一下用户标签。 对于市场层面,用户标签能帮助我们什么? 1.完善数据仓 之前我们讲过,企业或市场要有自己的数据仓来进行线索的存储与培育,用户标签就是存在于此,我们希望用户的标签尽可能完整,...
  • 在本文中,作者将会展示一个名为伪标签的简单的半监督学习方法,它可以通过使用无标签数据来提高机器学习模型的性能。 伪标签 为了训练机器学习模型,在监督学习中,数据必须是有标签的。那这是否意味着无标签的...
  • 异常检测模型

    千次阅读 2018-09-30 09:43:05
    异常的类型:意料之外的峰谷、趋势变动、水平变化等。...异常检测模型: STL分解 CART树 ARIMA 指数平滑 神经网络LSTM https://statsbot.co/blog/time-series-anomaly-detection-algorithms/ https...
  • 本文基于sigmoid做了一个将一段长文本打上多个标签的算法模型,首先声明,我的模型最终的效果不好,因为我的文本很长,而且采用的模型很简单,就一层神经网络,权当练手。 数据集文件的格式为每行一个样本,以制表...
  • 使用Bert模型进行多标签分类

    千次阅读 2019-08-28 10:42:47
    使用Bert模型的run_classifier进行Fine-Tuning https://blog.csdn.net/liu_sir_/article/details/85117239
  • Three.js 模型添加标签

    千次阅读 2020-10-27 22:17:27
    在很多的实际的项目中,你可能需要给一个Three.js的模型添加标签,那么我们可以使用three.js的精灵模型来表示,使用精灵模型表示一个模型对象的标签,那么精灵模型就要位于模型对象的附近。可以获得要标注模型的世界...
  • 数学建模——灰色预测模型及matlab代码实现

    万次阅读 多人点赞 2019-09-02 20:52:58
    灰色预测的主要特点是模型使用的不是原始数据序列,而是生成的数据序列。其核心体系是灰色模型(Grey Model,简称GM),即对原始数据作累加生成(或其他方法生成)得到近似的指数规律再进行建模的方法。 优点是不...
  • 使用BERT模型进行多标签分类

    千次阅读 2019-12-26 11:47:07
    首先,多标签分类就是将单输出改为多输出,最原始的想法是训练多个分类模型,每个模型预测不同的输出,比如,在预测顾客对饭店的评价中,第一个模型预测口感如何,第二模型预测交通是否方便,尽管会浪费时间、存储和...
  • 一、流失预测意义 每个企业都渴望建立和保持一个忠实的客户群...分析模型标签我们知道,这是一个概率型的结论,如果通过一个普通的算术运算来得出的话,不会太靠谱! 那该怎么办呢? 要通过历史既定事实的经验(满足...
  • 使用NLP预测电影类型 - 多标签分类

    千次阅读 2019-04-24 00:29:47
    上周,我对这篇关于构建多标签图像分类模型的精彩文章很感兴趣。 我的数据科学家开始探索将这个想法转化为自然语言处理(NLP)问题的可能性。 那篇文章展示了计算机视觉技术来预测电影的类型。 所以我必须找到一种...
  • 标签文本分类多标签文本分类简介三种神经网络结构网络模型文本分类网络模型标签文本分类网络模型标签文本分类简介 NLP(自然语言处理),即让计算机去理解人类的自然语言(文本、语音等),进而完成各种各样...
  • 精灵图Sprite效果是不管场景如何旋转,标签总是对着屏幕,可以用作对模型打标记,显示模型信息作用 代码如下: <template> <div class="search"> <el-select v-model="input" filterable ...
  • 使用带标签数据进行模型训练,训练架构是pytorch,包括数据读入,模型设计,训练过程,代码。
  • 最简单的示例是使用标签本身训练模型。 在实践中,在数据收集和准备过程中无意中引入了目标变量的间接表示。 触发结果的特征和目标变量的直接结果是在数据挖掘过程中收集的,因此在进行探索性数据分析时应手动识别...
  • html标签的盒子模型

    千次阅读 2018-11-14 21:51:00
    标签被称作盒子模型,也就是说我们把整个网页当做是一个大盒子,在网页里我们放许多小盒子&lt;div&gt;&lt;/div&gt;标签,我们可以用&lt;div&gt;&lt;/div&gt;来搭建整个网页的框架,...
  • 推拉模型push/pull

    千次阅读 2017-05-02 11:09:01
    1.推模型push:由消息中间件主动将消息推送给消费者; 2.拉模型pull:由消费者主动向消息中间件拉取消息; 比较: 采用push方式:可以尽可能快地将消息发送给消费者,但是若消费者的处理消息的能力较弱(一条消息长...
  • 传统的fine-tuning都是在一个固定的数据集上继续训练一个预训练的模型,但是本文的fine-tuning从一个空的带标签数据集开始,然后不断将部分未标注数据进行标注并填充到带标签数据集中并继续训练模型。这种算法主要...
  • 标签多分类及多标签多分类算法

    千次阅读 2020-03-27 15:45:07
    标签二分类算法,单标签多分类算法,多标签多分类算法及多标签多分类在Scikit-learn中的实现方式。
  • 1.语料处理与模型建立 训练语料格式遵循 标签->标题->内容 ,标题可有可无。那么如何将文本作为卷积神经网络的输入呢?我们知道卷积神经网络的输入是一个三维矩阵,如果算上batch,则是四维矩阵。每一个三维...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439,021
精华内容 175,608
关键字:

标签模型