在许多新手的眼中,深度学习模型构建好了之后,就只能是固定的输入和输出,甚至构建的模型只能是一个输入一个输出。其实深度学习模型很灵活,想有几个输入就有几个输入,想有几个输出就几个输出,想要哪一层的输出,就要哪一层的输出。今天,我们就用keras的几个例子,让大家对深度模型有个更深入的了解。

多输入多输出

什么情况下需要模型多个输入多个输出呢?

•多输入,单输出

比如在做文本分类任务时,我不仅仅通过文本content去预测结果,还想使用标题特征。

content_in = Input(shape=(300,)) #输入文本长度为300title_in = Input(shape=(20,)) #输入标题为20emb_layer = Embedding(4000, 300) #embedding层,4000表示词的总数,300是输出维度# 文本向量和标题向量共享了embedding层content_emb = emb_layer(content_in)title_emb = emb_layer(title_in)lstm_content = LSTM(128)(content_emb)lstm_title = LSTM(128)(title_emb)#将lstm编码之后的两个向量进行相加,然后再经过dense层add = Lambda(lambda x: x[0]+x[1])([lstm_content, lstm_title])out = Dense(1, activation='sigmoid')(add)

上面的例子有两个输入content_in和title_in,经过同一个embedding层之后,得到对应的向量,然后再分别经过LSTM层进行特征提取,将两个输出通过Lambda层直接相加后,经过dense层就直接进行了分类。这是两个输入,一个输出的情况。

•多输入,多输出

还是以文本分类为例,这个时候,我的任务变成要对文本内容和标题分别进行分类,将他们放在一起的目的只是为了共享embedding层,以获取某种关联特征。我们只需要将上面的代码做个简单的修改。

content_in = Input(shape=(300,)) #输入文本长度为300title_in = Input(shape=(20,)) #输入标题为20emb_layer = Embedding(4000, 300) #embedding层,4000表示词的总数,300是输出维度# 文本向量和标题向量共享了embedding层content_emb = emb_layer(content_in)title_emb = emb_layer(title_in)lstm_content = LSTM(128)(content_emb)lstm_title = LSTM(128)(title_emb)out_content = Dense(1, activation='sigmoid', name='out_content')(lstm_content)out_title = Dense(1, activation='sigmoid', name='out_title')(lstm_title)model = Model([content_in, title_in], [out_content, out_title])

最后模型有两个输出。上个丑图,方便理解。


输入和输出因为有两个,需要整成list的形式。喂数据的时候,也要以类似的形式输入进去,比如model.fit([X_content, X_title], [Y_content, Y_content])

在编译模型的时候,有一点点不同,这里详细讲一下。如果你对这两个输出没有什么特别需求,可以使用下面的代码简单编译。

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

模型在训练的时候,对两个输出都采用“binary_crossentropy”计算loss,并都使用“adam”优化器进行优化。那如果我两个输出的类型不同怎么办?能不能使用不同的loss呢?答案是可以,并且还可以对不同的输出的loss,设置不同的权重。

model.compile(loss={"out_content": 'binary_crossentropy', "out_title": 'categorical_crossentropy' #假设title是个多分类},loss_weights = {"out_content": 0.8,"out_title": 0.3},optimizer='adam', metrics=['accuracy'])

注意到,模型是根据输出层的名字(name参数)来区分不同输出的loss。并且也是根据名字来确定权重。那么怎么给不同输出设置不同优化器呢?这个小编也想知道啊,可它不能够啊。一个比较实用的操作是给不同层设置不同的学习率,这个需要改写优化器函数,不在本文的范畴之内,有兴趣的同学,可以绞尽脑汁去网上找找,反正小编是找了好久才找到一个靠谱的。

中间层的输出

还有一种情况啊,我搭建好的模型,只是为了去训练参数,我任务的最终目标并不是模型的output,而是模型当中的某一层。比如我训练好了一个语言模型,但是我想要的是embedding层的词向量,又比如我训练了一个encoder-decoder模型,我只想要其中的中间表示向量,这该咋整呢?还还还以上面的代码为例,超级简单。

content_in = Input(shape=(300,)) #输入文本长度为300emb_layer = Embedding(4000, 300, name='emb') #embedding层,4000表示词的总数,300是输出维度content_emb = emb_layer(content_in)lstm_content = LSTM(128)(content_emb)out = Dense(1, activation='sigmoid')(lstm_content)model = Model(content_in, out)

为了简单说明,我们使用单输入单输出模型进行介绍。假设你已经用自己的数据训练好了上面模型的参数,但是你的真实目标并不是为了进行文本分类,而是想要这个模型的embedding层,用作获取词向量。怎么做呢?简单来讲,就是把你想要的子模型截取出来。

emb_model = Model(inputs=model.input,                   outputs=model.get_layer('emb').output)

输入还是原来模型的输入,但输出是指定名称的层,即”emb“。再来个丑图说明一下


整体框架图是原模型,训练好参数之后,我只取前两层新构建一个模型(参数依旧是原模型的参数)。

总结

好了,一些base骚操作就介绍给大家。当大家明白了深度学习层之间的关系之后,就不觉得它有多么难理解了,理解了这些东西,大家应该就不难用keras去完成一些以前觉得很难实现的操作了。

精选好文推荐:

  • 好险!差点要写一个300行的 if-else!

  • 爱了爱了!有萌妹纸语音陪我写代码,你也可以!

  • 讲清楚这个知识点,我成功拿到了offer!

  • 面了一个工作3年程序员,这些常见面试题竟一个都答不出来!

  • rasa过分简单!来搭建一个智能客服机器人吧!

扫码下图关注我们不会让你失望!好看请点这里~

sigmoid层的输出_keras如何多输入多输出,以及中间层输出相关推荐

  1. 7-4 使用递归输出杨辉三角形 (18 分)输出杨辉三角形,用户输入一个正整数n,输出n行的直角三角形的杨辉三角。要求使用递归函数实现

    输入格式: 输入一个正整数n 输出格式: 输出n行的直角三角形的杨辉三角,两个数之间用空格分隔,末尾无多余的空格. 输入样例: 在这里给出一组输入.例如: 3 输出样例: 在这里给出相应的输出.例如: ...

  2. IO流:输入字节流:InputStream 、 输出字节流:OutputStream 、输入字符流:Reader 、输出字符流:Writer、 BufferedInputStream

    ## 1_ IO流的介绍及其分类          * IO流:          *         I: Input 输入          *         O: Output 输出      ...

  3. java打印语句输出年龄_控制台输入年龄,根据年龄输出不同的提示

    代码: import java.util.Scanner; public class Nianling { public static void main(String[] args) { // TO ...

  4. N的阶乘:输入一个正整数N,输出N的阶乘

    输入描述: 正整数N(0<=N<=1000) 输出描述: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 输入例子: 4 5 15 输出例子: 24 120 13076743680 ...

  5. pytorch中间层输出方法

    大纲 引言 一.钩子截流 附:钩子函数 二.视作输出 参考 引言  本文想要解决的是pytorch中间层的输出问题,有时我们训练神经网络时会设定回归或者分类作为目标,但在测试阶段实际需要的只是用神经网 ...

  6. pytorch获取模型的中间层输出结果

    在inference阶段,整个模型会load到GPU上,进行端到端的计算,通常只会给你输出一个最终结果. 如果想要获取模型的中间层输出,则需要在计算前标定目标层位置(通过forward返回),或者把模 ...

  7. 输入一个数字n,输出一个n层的特定三角形

    题目:输入一个数字n,输出一个n层的特定三角形,三角形内数字增长是有规律的 代码如下,基本能满足要求.抛砖引玉,希望能给小伙伴们点启发 #!/usr/bin/env python3 #-*- codi ...

  8. python语言输入杨辉三角_?新手求教:请问怎样用python 显示杨辉三角,任意输入一个数N,输出一个N 1层的杨辉三角。...

    如何用python输出杨辉三角 iangles里用到了yield,yield 的作用就是把一个函数变成一个 generator 用python语言输出九九乘法表 杨辉三角 求代码 1.九九乘法表def ...

  9. 机器学习入门(12)— 激活函数层 ReLU、Sigmoid 层的实现

    1. ReLU 函数层 激活函数 ReLU(Rectified Linear Unit)由下式(5.7)表示. 通过式(5.7),可以求出 y 关于 x 的导数,如式(5.8)所示. 在式(5.8)中 ...

  10. AI-蛋白质-结构预测-2020:AlphaFold【输入:氨基酸序列】【输出:结构的性质(氨基酸之间两两的距离分布,氨基酸链的夹角分布)】【根据预测的性质构建约束,从而求解出拓扑结构】

    注意:这是关于AlphaFold的算法详细解析,而不是AlphaFold2的 注意:带斜体句子的是个人推测,不确定是否和论文对应. 作为一个计算机专业的算法从业人员,一直对AlphaFold[1]的算 ...

最新文章

  1. cordova编译报错:Execution failed for task ':processDebugResources'
  2. 判断一个点是否在矩形内部_高速公路专用矩形泄水管特点及安装注意事项
  3. 在使用selenium,Chrome无界面浏览模式与自定义插件加载问题
  4. artTemplate的空白输出坑
  5. codevs2171 棋盘覆盖
  6. mysql数据迁移到es_实战ES跨版本数据迁移
  7. 阿里P8架构师分享:如何从0到1设计一个类Dubbo的RPC框架
  8. zoj 3640 Help Me Escape (概率dp 递归求期望)
  9. 面试小题,传入6返回9,传入9返回6
  10. 统信UOS系统怎么下载QQ音乐
  11. axios请求文件流下载文件
  12. 2018第九届蓝桥杯B组决赛题解第四题 调手表(BFS)
  13. 计算机网络和internet选项,internet选项在哪
  14. 概率分布之二项分布与多项分布
  15. 《简约至上:交互式设计四策略》读书感悟
  16. 八字易经算法之用JAVA实现 地藏十神排法
  17. 163,搜狐,新浪哪个邮箱安全?
  18. 《工程伦理》网课第十章课后习题答案
  19. GPRC 和RPC 有什么区别?GPRC和RPC的区别是什么?
  20. SpringBoot+MongoDB实现一个物流订单系统

热门文章

  1. spring data jpa 查询部分字段列名无效问题
  2. [学习笔记]中国剩余定理
  3. 按键弹起数字增加和按下增加
  4. web.xml 加载顺序
  5. Java 中 Comparable 和 Comparator 比较(转)
  6. (源码)群体智能优化算法之社会蜘蛛算法(Social Spider Algorithm ,SSA)
  7. Python弹球游戏(tkinter模块编写)
  8. sentinelsat包介绍
  9. RGB图像转为灰度图像原理
  10. 遥感影像单波段辐射定标处理