Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Keras TimeDistributed不掩蔽CNN模型

Keras TimeDistributed不掩蔽CNN模型
EN

Stack Overflow用户
提问于 2018-04-29 21:49:09
回答 3查看 2.9K关注 0票数 9

为了举例说明,我有一个输入,包含2个图像,总形状(2,299,299,3)。我试图在每个映像上应用inceptionv3,然后使用LSTM处理输出。我使用掩蔽层来排除正在处理的空白图像(如下所示)。

守则是:

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
from keras import backend as K
from keras.models import Sequential,Model
from keras.layers import Convolution2D, MaxPooling2D, ZeroPadding2D, BatchNormalization, \
Input, GlobalAveragePooling2D, Masking,TimeDistributed, LSTM,Dense,Flatten,Reshape,Lambda, Concatenate
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.applications import inception_v3

IMG_SIZE=(299,299,3)
def create_base():
    base_model = inception_v3.InceptionV3(weights='imagenet', include_top=False)
    x = GlobalAveragePooling2D()(base_model.output)
    base_model=Model(base_model.input,x)
    return base_model


base_model=create_base()

#Image mask to ignore images with pixel values of -1
IMAGE_MASK = -2*np.expand_dims(np.ones(IMG_SIZE),0)

final_input=Input((2,IMG_SIZE[0],IMG_SIZE[1],IMG_SIZE[2]))

final_model = Masking(mask_value = -2.)(final_input)
final_model = TimeDistributed(base_model)(final_model)
final_model = Lambda(lambda x: x, output_shape=lambda s:s)(final_model)
#final_model = Reshape(target_shape=(2, 2048))(final_model)
#final_model = Masking(mask_value = 0.)(final_model)
final_model = LSTM(5,return_sequences=False)(final_model)
final_model = Model(final_input,final_model)


#Create a sample test image
TEST_IMAGE = np.ones(IMG_SIZE)

#Create a test sample input, consisting of a normal image and a masked image
TEST_SAMPLE = np.concatenate((np.expand_dims(TEST_IMAGE,axis=0),IMAGE_MASK))



inp = final_model.input                                           # input placeholder
outputs = [layer.output for layer in final_model.layers]          # all layer outputs
functors = [K.function([inp]+ [K.learning_phase()], [out]) for out in outputs]
layer_outs = [func([np.expand_dims(TEST_SAMPLE,0), 1.]) for func in functors]

这是不正确的。具体来说,模型应该掩盖输入的IMAGE_MASK部分,但是它用开始(提供非零输出)来处理它。详情如下:

1,LSTM输出很好:

[array([[-0.15324114, -0.09620268, -0.01668587, 0.07938149, -0.00757846]], dtype=float32)]

层_out-2和层_out-3,LSTM输入错误,它应该在第二个数组中有所有的零:

[array([[[ 0.37713543, 0.36381325, 0.36197218, ..., 0.23298527, 0.43247852, 0.34844452], [ 0.24972123, 0.2378867 , 0.11810347, ..., 0.51930511, 0.33289322, 0.33403745]]], dtype=float32)]

图层-4,CNN的输入被正确地屏蔽:

代码语言:javascript
运行
AI代码解释
复制
[[ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           ..., 
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.]]],


         [[[-0., -0., -0.],
           [-0., -0., -0.],
           [-0., -0., -0.],
           ..., 
           [-0., -0., -0.],
           [-0., -0., -0.],
           [-0., -0., -0.]],

请注意,代码似乎正确地使用了一个简单的,如:

代码语言:javascript
运行
AI代码解释
复制
def create_base():
    input_layer=Input(IMG_SIZE)
    base_model=Flatten()(input_layer)
    base_model=Dense(2048)(base_model)
    base_model=Model(input_layer,base_model)
    return base_model

在这方面,我已经用尽了大部分在线资源。这个问题的排列已经在Keras的github上被问到了,比如这里这里这里,但是我似乎找不到任何具体的解决方案。

链接表明,这些问题似乎源于将TimeDistributed应用于BatchNormalization的组合,而Lambda标识层或重塑层的黑客修复则消除了错误,但似乎没有输出正确的模型。

我试图通过以下方式强制基本模型支持掩蔽:

代码语言:javascript
运行
AI代码解释
复制
base_model.__setattr__('supports_masking',True)

我还尝试通过以下方式应用身份层:

代码语言:javascript
运行
AI代码解释
复制
TimeDistributed(Lambda(lambda x: base_model(x), output_shape=lambda s:s))(final_model)

但这些似乎都不起作用。请注意,我希望最后的模式是可培训的,特别是CNN部分应该保持可培训。

EN

回答 3

Stack Overflow用户

发布于 2018-05-07 04:29:22

不完全确定这是否有效,但基于在此发表的评论,使用较新版本的tensorflow + keras,它应该可以工作:

代码语言:javascript
运行
AI代码解释
复制
final_model = TimeDistributed(Flatten())(final_input)
final_model = Masking(mask_value = -2.)(final_model)
final_model = TimeDistributed(Reshape(IMG_SIZE))(final_model)
final_model = TimeDistributed(base_model)(final_model)
final_model = Model(final_input,final_model)

我看了一下掩蔽的源代码,我注意到Keras创建了一个只缩小最后一个轴的掩码张量。只要你处理的是5D张量,它就不会引起任何问题,但是当你减少LSTM的尺寸时,这个掩蔽张量就变得不相容了。

在掩蔽之前,做第一个扁平步骤,将确保掩蔽张量对三维张量正常工作。然后再将图像扩展到原来的大小。

我可能很快就会尝试安装新版本来亲自测试它,但是这些安装过程已经造成了太多的麻烦,我在这里遇到了一些重要的问题。

在我的机器上,这段代码会编译,但是这个奇怪的错误会出现在预测时间(参见这个答案第一行的链接)。

建立预测中间层的模型

根据我看到的代码,我不确定掩蔽函数是否在内部保持在张量中。我不知道它到底是如何工作的,但它似乎与层内函数的构建是分开管理的。

因此,尝试使用keras标准模型来进行预测:

代码语言:javascript
运行
AI代码解释
复制
inp = final_model.input                                           # input placeholder
outputs = [layer.output for layer in final_model.layers]          # all layer outputs

fullModel = Model(inp,outputs)
layerPredictions = fullModel.predict(np.expand_dims(TEST_SAMPLE,0))

print(layerPredictions[-2])
票数 3
EN

Stack Overflow用户

发布于 2018-05-09 11:42:56

它似乎是按预期运作的。Keras中的掩蔽不会像您预期的那样产生零,而是跳过上游层(如LSTM和损失计算)中屏蔽的时间步骤。在RNN的情况下,Keras (至少是tensorflow)被实现,从而将前一步的状态传递给backend.py。这在一定程度上是为了在动态输入时保持张量的形状。

如果您真的想要零,那么您必须使用与掩蔽和返回零类似的逻辑来实现自己的层。为了解决您的问题,您需要在使用final_input的最终LSTM层之前使用一个掩码。

代码语言:javascript
运行
AI代码解释
复制
class MyMask(Masking):
   """Layer that adds a mask based on initial input."""
   def compute_mask(self, inputs, mask=None):
      # Might need to adjust shapes
      return K.any(K.not_equal(inputs[0], self.mask_value), axis=-1)

   def call(self, inputs):
      # We just return input back
      return inputs[1]

   def compute_output_shape(self, input_shape):
     return input_shape[1]
final_model = MyMask(mask_value=-2.)([final_input, final_model])

您可能可以以更简单的方式附加掩码,但是这个自定义类实际上是根据初始输入添加了一个掩码,并输出了现在有掩码的Keras张量。

在您的示例中,LSTM将忽略第二个图像。要确认您可以return_sequences=True,并检查两个图像的输出是否相同。

票数 3
EN

Stack Overflow用户

发布于 2018-08-21 11:37:51

我正在尝试实现同样的东西,我希望我的LSTM序列有可变的大小。然而,我甚至不能实现你的原始模型。我得到以下错误: TypeError: input_1不支持掩蔽,但是传递了一个input_mask:张量(“time_distributed_1/repe1:0”,shape=(?,100,100),dtype=bool) --我使用的是tensorflow 1.10和keras 2.2.2。

我通过添加第二个输入,一个掩码来指定LSTM需要考虑的时间步骤来解决这个问题。这样,图像序列总是具有相同的时间步数,CNN总是生成一个输出,但是对于LSTM输入,其中一些步骤被忽略。但是,需要仔细选择丢失的图像,这样才不会影响批处理规范化。

代码语言:javascript
运行
AI代码解释
复制
def LSTM_CNN(params):
resnet = ResNet50(include_top=False, weights='imagenet', pooling = 'avg')
input_layer = Input(shape=(params.numFrames, params.height, params.width, 3))
input_mask = Input(shape=(params.numFrames,1))
curr_layer = TimeDistributed(resnet)(input_layer)    
resnetOutput = Dropout(0.5)(curr_layer)
curr_layer = multiply([resnetOutput,input_mask])
cnn_output = curr_layer
curr_layer = Masking(mask_value=0.0)(curr_layer)
lstm_out = LSTM(256, dropout=0.5)(curr_layer)
output = Dense(output_dim=params.numClasses, activation='sigmoid')(lstm_out)
model = Model([input_layer, input_mask], output)
return model
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50094633

复制
相关文章
lstm的keras实现_LSTM算法
LSTM 01:理解LSTM网络及训练方法 LSTM 02:如何为LSTMs准备数据 LSTM 03:如何使用Keras编写LSTMs LSTM 04:4种序列预测模型及Keras实现 LSTM 05:Keras实现多层LSTM进行序列预测 LSTM 06:如何用Keras开发CNN-LSTM LSTM 07:如何用Keras开发 Encoder-Decoder LSTM LSTM 08:超详细LSTM调参指南
全栈程序员站长
2022/10/02
2.4K0
lstm的keras实现_LSTM算法
Python搭建Keras CNN模型破解网站验证码
在本项目中,将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的验证码。验证码如下:
不脱发的程序猿
2021/01/20
5510
【小白学习Keras教程】四、Keras基于数字数据集建立基础的CNN模型
-CNN的基本结构:CNN与MLP相似,因为它们只向前传送信号(前馈网络),但有CNN特有的不同类型的层
润森
2022/08/18
5850
【小白学习Keras教程】四、Keras基于数字数据集建立基础的CNN模型
Keras模型
文件下载:https://download.csdn.net/download/sxf1061700625/19229828
小锋学长生活大爆炸
2021/06/11
5330
基于keras平台CNN神经网络模型的服装识别分析
在许多介绍图像识别任务的介绍中,通常使用着名的MNIST数据集。但是,这些数据存在一些问题:
拓端
2020/09/26
6660
Keras系列(一):介绍
上次铁柱分享了一个使用深度学习库Keras预测风功率的案例,有小伙伴表示一脸懵逼,没关系,其实Keras上手很快,毕竟外卖小哥都可以上手深度学习,化身TF BOY了(TensorFlow BOY)。下面有请铁柱介绍Keras:
MeteoAI
2019/07/22
1.1K0
Keras学习(一)—— Keras 模型(keras.model): Sequential 顺序模型 和 Model 模型
首先了解Keras的一个很好的途径就是通过 文档 Keras 中文文档地址: https://keras.io/zh/models/about-keras-models/
全栈程序员站长
2022/11/15
1.7K0
keras doc 8 BatchNormalization
该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接近0,其标准差接近1
CreateAMind
2018/07/25
1.3K0
keras doc 8 BatchNormalization
深度学习文本分类实战报告:CNN, RNN & HAN
本文为 AI 研习社编译的技术博客,原标题 : Report on Text Classification using CNN, RNN & HAN 翻译 | 小猪咪、莫尔•约瑟夫、M.Y. Li
AI研习社
2018/12/05
1.3K0
使用CNN,RNN和HAN进行文本分类的对比报告
你好,世界!!我最近加入Jatana.ai 担任NLP研究员(实习生and),并被要求使用深度学习模型研究文本分类用例。在本文中,我将分享我的经验和学习,同时尝试各种神经网络架构。我将介绍3种主要算法,例如:
银河1号
2019/04/12
1.3K0
使用CNN,RNN和HAN进行文本分类的对比报告
教你用Keras和CNN建立模型识别神奇宝贝!(附代码)
在今天博客的最后,你将会了解如何在你自己的数据库中建立、训练并评估一个卷积神经网络。
数据派THU
2018/09/17
2.7K0
教你用Keras和CNN建立模型识别神奇宝贝!(附代码)
keras中文文档之:CNN眼中的世界:利用Keras解释CNN的滤波器
本文有代码; 本文作者:Francois Chollet 使用Keras探索卷积网络的滤波器 本文中我们将利用Keras观察CNN到底在学些什么,它是如何理解我们送入的训练图片的。我们将使用Keras
CreateAMind
2018/07/20
8120
如何在Python中将TimeDistributed层用于Long Short-Term Memory Networks
原文地址:https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/
Steve Wang
2018/02/06
3.9K0
How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文
How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 如何在Python中将TimeDistributed层用于Long Short-Term Memory Networks Long Short-Term Memory Networks或LSTM是一种流行的强大的循环神经网络(即RNN)。 对于任意的序列预测(sequence prediction )问题,配置和应用起来可能会相当困难,即使在P
Steve Wang
2018/03/29
1.6K0
How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文
小白学CNN以及Keras的速成
为何要用Keras 如今在深度学习大火的时候,第三方工具也层出不穷,比较出名的有Tensorflow,Caffe,Theano,MXNet,在如此多的第三方框架中频繁的更换无疑是很低效的,只要你能够好好掌握其中一个框架,熟悉其原理,那么之后因为各种要求你想要更换框架也是很容易的。 那么sherlock用的是哪个框架呢?sherlock使用的是Google的开源框架Tensorflow,因为Google开源了tensorflow之后其社区非常活跃,而且版本更新也非常稳定,所以我就选择了这个框架。对于框架之
AI研习社
2018/03/19
7580
小白学CNN以及Keras的速成
Keras保存模型
一、不保存模型只显示大概结构 model.summary() 这个函数会打印模型结构,但是仅仅是打印到控制台。
润森
2019/11/04
1.1K0
入门项目数字手写体识别:使用Keras完成CNN模型搭建
对于图像分类任务而言,卷积神经网络(CNN)是目前最优的网络结构,没有之一。在面部识别、自动驾驶、物体检测等领域,CNN被广泛使用,并都取得了最优性能。对于绝大多数深度学习新手而言,数字手写体识别任务可能是第一个上手的项目,网络上也充斥着各种各样的成熟工具箱的相关代码,新手在利用相关工具箱跑一遍程序后就能立刻得到很好的结果,这时候获得的感受只有一个——深度学习真神奇,却没能真正了解整个算法的具体流程。本文将利用Keras和TensorFlow设计一个简单的二维卷积神经网络(CNN)模型,手把手教你用代码完成MNIST数字识别任务,便于理解深度学习的整个流程。
用户3578099
2019/08/16
8900
seq2seq 的 keras 实现
上一篇 seq2seq 入门 提到了 cho 和 Sutskever 的两篇论文,今天来看一下如何用 keras 建立 seq2seq。 第一个 LSTM 为 Encoder,只在序列结束时输出一个语
杨熹
2018/04/03
2.2K0
seq2seq 的 keras 实现
点击加载更多

相似问题

基于CNN+LSTM模型和TimeDistributed层包装的Keras时间序列预测

11

如何在Keras中将掩蔽层应用于序列CNN模型?

11

Keras: ValueError TimeDistributed()

110

Keras - CNN模型综述

11

TimeDistributed与TimeDistributedDense Keras

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档