您的位置:首页 > 理论基础 > 计算机网络

keras实践(一): multi-label神经网络

2017-08-28 16:29 176 查看

前沿

本篇记录一下自己项目中用到的keras相关的部分。由于本项目既有涉及multi-class(多类分类),也有涉及multi-label(多标记分类)的部分,multi-class分类网上已经很多相关的文章了。这里就说一说multi-label的搭建网络的部分。之后如果有时间的时候,再说一说cross validation(交叉验证)和在epoch的callback函数中处理一些多标签度量metric的问题。

multi-label多标记监督学习

其实我个人比较喜欢把label翻译为标签。那可能学术上翻译multi-label多翻译为多标记。其实和多标签一个意思。

multi-class 和 multi-label的区别

multi-class是相对于binary二分类来说的,意思是需要分类的东西不止有两个类别,可能是3个类别取一个(如iris分类),或者是10个类别取一个(如手写数字识别mnist)。

而multi-label是更加general的一种情况了,它说为什么一个sample的标签只能有1个呢。为什么一张图片不是猫就是狗呢?难道我不能训练一个人工智能,它能告诉我这张图片既有猫又有狗呢?

其实关于多标签学习的研究,已经有很多成果了。

主要解法是

* 不扩展基础分类器的本来算法,只通过转换原始问题来解决多标签问题。如BR, LP等。

* 扩展基础分类器的本来算法来适配多标签问题。如ML-kNN, BP-MLL等。

这里不展开了。有兴趣的同学可以自己去研究一下。

keras的multi-label

废话不多说,直接上代码。这里假设大家是有keras的基础知识的,所以关键代码之外的代码请大家自行脑补。

def __create_model(self):
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
print("create model. feature_dim = %s, label_dim = %s" % (self.feature_dim, self.label_dim))
model.add(Dense(500, activation='relu', input_dim=self.feature_dim))
model.add(Dense(100, activation='relu'))
model.add(Dense(self.label_dim, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
return model


稍微解说一下:

* 整个网络是fully connected全连接网络。

* 网络结构是输入层=你的特征的维度

* 隐藏层是500*100,激励函数都是relu。隐藏层的节点数量和深度请根据自己的数量来自行调整,这里只是举例。

* 输出层是你的label的维度。使用sigmoid作为激励,使输出值介于0-1之间。

* 训练数据的label请用0和1的向量来表示。0代表这条数据没有这个位的label,1代表这条数据有这个位的label。假设3个label的向量[天空,人,大
a2f3
海]的向量值是[1,1,0]的编码的意思是这张图片有天空,有人,但是没有大海。

* 使用binary_crossentropy来进行损失函数的评价,从而在训练过程中不断降低交叉商。实际变相的使1的label的节点的输出值更靠近1,0的label的节点的输出值更靠近0。

结语

有了这个结构,就可以run起来一个multi label的神经网络了。这个只是基础中的基础,关于multi-label的度量代码才是我们研究一个机器学习问题的核心。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: