keras Model 3 共享的层
考虑这样的一个问题:我们要判断连个tweet是否来源于同一个人。
首先我们对两个tweet进行处理,然后将处理的结构拼接在一起,之后跟一个逻辑回归,输出这两条tweet来自同一个人概率。
因为我们对两条tweet的处理是相同的,所以对第一条tweet的处理的模型,可以被重用来处理第二个tweet。我们考虑用LSTM进行处理。
假设我们的输入是两条 280*256的向量
首先定义输入:
import keras
from keras.layers import Input, LSTM, Dense
from keras.models import Model tweet_a = Input(shape=(280, 256))
tweet_b = Input(shape=(280, 256))
然后我们共享LSTM。共享层很简单,只要实例化层一次,然后在你想处理的tensor上调用你想要应用的次数即可(翻译无力,看代码)
# This layer can take as input a matrix
# and will return a vector of size 64
shared_lstm = LSTM(64) # When we reuse the same layer instance
# multiple times, the weights of the layer
# are also being reused
# (it is effectively *the same* layer)
encoded_a = shared_lstm(tweet_a)
encoded_b = shared_lstm(tweet_b) # We can then concatenate the two vectors:
merged_vector = keras.layers.concatenate([encoded_a, encoded_b], axis=-1) # And add a logistic regression on top
predictions = Dense(1, activation='sigmoid')(merged_vector) # We define a trainable model linking the
# tweet inputs to the predictions
model = Model(inputs=[tweet_a, tweet_b], outputs=predictions) model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit([data_a, data_b], labels, epochs=10)
其实,简单点说,对一个层的多次调用,就是在共享这个层。这里有一个层的节点的概念
当你在一个输入tensor上调用一个层时,就会生成一个输出tensor,就会在这个层上添加一个节点,这个节点连接着这两个tensor(输入tensor和输出tensor)。当你多次调用同一个层的时,
这个层生成的节点就会按照0 ,1, 2, 。。以此类推编号。
那么当一个层有多个节点的时候,我们怎么获取它的输出呢?
如果直接通过output获取会出错:
a = Input(shape=(280, 256))
b = Input(shape=(280, 256)) lstm = LSTM(32)
encoded_a = lstm(a)
encoded_b = lstm(b) lstm.output
>> AttributeError: Layer lstm_1 has multiple inbound nodes,
hence the notion of "layer output" is ill-defined.
Use `get_output_at(node_index)` instead.
这时候应该通过索引进行调用:
assert lstm.get_output_at(0) == encoded_a
assert lstm.get_output_at(1) == encoded_b
对于输入,也是同样的
a = Input(shape=(32, 32, 3))
b = Input(shape=(64, 64, 3)) conv = Conv2D(16, (3, 3), padding='same')
conved_a = conv(a) # Only one input so far, the following will work:
assert conv.input_shape == (None, 32, 32, 3) conved_b = conv(b)
# now the `.input_shape` property wouldn't work, but this does:
assert conv.get_input_shape_at(0) == (None, 32, 32, 3)
assert conv.get_input_shape_at(1) == (None, 64, 64, 3)
keras Model 3 共享的层的更多相关文章
- Problem after converting keras model into Tensorflow pb - 将keras模型转换为Tensorflow pb后的问题
I'm using keras 2.1.* with tensorflow 1.13.* backend. I save my model during training with .h5 forma ...
- Deploying Keras model on Tensorflow Serving--
keras训练了个二分类的模型.需求是把keras模型跑到 tensorflow serving上 (TensorFlow Serving 系统用于在生产环境中运行模型) keras模型转 tenso ...
- tensorflow 2.0 技巧 | 自定义tf.keras.Model的坑
自定义tf.keras.Model需要注意的点 model.save() subclass Model 是不能直接save的,save成.h5,但是能够save_weights,或者save_form ...
- keras Model 2 多输入和输出
1 入门 2 多个输入和输出 3 共享层 函数式模型有一个很好用的应用实例是:编写拥有多个输入和输出的模型.函数式模型使得在复杂网络中操作巨大的数据流变的简单. 我们实现下面这样的模型 from ke ...
- keras Model 1 入门篇
1 入门 2 多个输入和输出 3 共享层 最近在学习keras,它有一些实现好的特征提取的模型:resNet.vgg.而且是带权重的.用来做特诊提取比较方便 首先要知道keras有两种定义模型的方式: ...
- Keras Model Sequential模型接口
Sequential 模型 API 在阅读这片文档前,请先阅读 Keras Sequential 模型指引. Sequential 模型方法 compile compile(optimizer, lo ...
- keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy'])
深度学习笔记 目标函数的总结与整理 目标函数,或称损失函数,是网络中的性能函数,也是编译一个模型必须的两个参数之一.由于损失函数种类众多,下面以keras官网手册的为例. 在官方keras.io里 ...
- bootstrapt model 的多罩层,禁用罩层
选项 有一些选项可以用来定制模态窗口(Modal Window)的外观和感观,它们是通过 data 属性或 JavaScript 来传递的.下表列出了这些选项: 选项名称 类型/默认值 Data 属性 ...
- tensorflow2.0编程规范
背景 tensorflow2.0 相比于1.0 有很大变化,1.0版本的placeholder,Session都没有了,2.0版本强推使用keras.keras是一个比较高层的api,确实挺好用的,一 ...
随机推荐
- 华为SDN:解决传统网络3大问题
转:http://mp.ofweek.com/tele/a145613326756 科技潮人 2013-08-05 14:20 传统网络之困 互联网爆炸式增长,除了规模和发展速度远超之前所有曾出现的数 ...
- SpringBoot下,@WebFilter配置获取日志
CREATE TABLE [dbo].[SWEBSERVICELOG]( [WLG_ID] [varchar](100) NOT NULL, [WLG_SESSIONID] [varchar](100 ...
- vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.
默认,webpack无法打包.vue文件,需要安装 相关的loader: cnpm i vue-loader vue-template-compiler -D 提示以下错误信息: Module Err ...
- SpringCloud 学习(5) --- Zuul(一)基本概念、配置
[TOC] Spring Cloud eureka:注册中心 服务端:提供注册 客户端:进行注册 ribbon:负载均衡(集群) Hystrix:熔断器,执行备选方案 Feign:远程调用 Zuul: ...
- Python中日志logging模块
# coding:utf-8 import logging import os import time class Logger(object): def __init__(self): # 创建一个 ...
- Inellij idea创建javaWeb以及Servlet简单实现
版权声明:本文为博主原创文章,未经博主允许不得转载. 准备:1. 安装jdk1.7 2. 安装tomcat1.8 一.创建并设置javaweb工程 1.创建javaweb工程File --> N ...
- SQL:分区拾忆
1.文件组与文件 数据库属性——可以先添加多个文件组(抽象分割) 单个文件组可以有多文件(物理上的分割),可以添加文件然后指定文件组 例如: 2.分区函数 语法: CREATE PARTITION F ...
- loj #2316
最短路 + 记忆化 记忆化搜索更容易实现 #include <iostream> #include <cstdio> #include <algorithm> #i ...
- Codevs 4927 线段树练习5(分块)
4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的 ...
- LibreOJ #6220. sum
二次联通门 : LibreOJ #6220. sum /* LibreOJ #6220. sum 对所有数做一个前缀和 如果某一位模N等于另一位 则他们中间的一段的和一定为N的倍数 自己感悟一下 (M ...