首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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

复制
相关文章
iOS:关于WWDC2020-Objective-C运行时的改进
在 WWDC2020 中 Objective-C 运行时的改进这个视频提到关于类的的数据结构的一些变化,本文是对这个视频提到的部分变化进行翻译。
CC老师
2022/01/14
5100
iOS:关于WWDC2020-Objective-C运行时的改进
Project Euler Problem 1
用python解决  Project Euler 问题 记录 由于比较擅长java  对python相对陌生,就用python来解答 源码: sumAll =0 for index in range(1,1000): if index%3==0 or index%5 ==0: sumAll += index print(sumAll)
明明如月学长
2021/08/27
2810
HDUOJ-----2824The Euler function
The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3284    Accepted Submission(s): 1350 Problem Description The Euler function phi is an important kind of function in number theory
Gxjun
2018/03/22
6300
Adams-Bashforth-Euler格式的稳定域。
Adams_Bashforth_2.m figure(1), clf, hold on % Plot of stability domain theta = 0:0.01:1; theta = theta*pi; z = exp(2*i*theta) - exp(i*theta); z = z./(1.5*exp(i*theta) - 0.5); plot(z) % Plot of oval b = 0.5^0.25; a = 0.5; z = - a*(1-cos(theta))
裴来凡
2022/05/28
3870
Adams-Bashforth-Euler格式的稳定域。
YOLO V2的10个改进技巧(上篇)
YOLO V2的原始论文是,《YOLO9000: Better, Faster, Stronger 》,新的YOLO版本论文全名叫“YOLO9000: Better, Faster, Stronger”,主要有两个大方面的改进:
小草AI
2019/05/30
2.6K0
数学——Euler方法求解微分方程详解
用Euler算法求解初值问题 \[ \frac{dy}{dx}=y+\frac{2x}{y^2}\] 初始条件\(y(0)=1\),自变量的取值范围\(x \in [0, 2]\)
py3study
2020/01/22
2.4K0
CVPR 2020 | 10篇改进GAN的论文(网络、训练、正则等)
引入新的局部稀疏注意力层,保留二维几何形状和局部性,用这种结构替换SAGAN的密集注意力层即可获得显着的FID、Inception score和视觉效果。https://github.com/giannisdaras/ylg
公众号机器学习与AI生成创作
2020/06/19
1.3K0
CVPR 2020 | 10篇改进GAN的论文(网络、训练、正则等)
CVPR 2020 | 10篇改进GAN的论文(网络、训练、正则等)
引入新的局部稀疏注意力层,保留二维几何形状和局部性,用这种结构替换SAGAN的密集注意力层即可获得显着的FID、Inception score和视觉效果。https://github.com/giannisdaras/ylg
OpenCV学堂
2020/06/19
1.1K0
CVPR 2020 | 10篇改进GAN的论文(网络、训练、正则等)
一维Euler方程的AUSM(Liou-Steffen)格式等。
AUSM_scheme.m clear all global PRL CRL MACHLEFT gamma pleft pright rholeft rhoright uleft... uright tend lambda % lambda = dt/dx % .....................Input............................ gamma = 1.4; % Ratio of specific heats J = 48;
裴来凡
2022/05/28
2220
一维Euler方程的AUSM(Liou-Steffen)格式等。
iOS16 和 Xcode14 如何改进 App 大小和运行时性能
本文主要介绍苹果在 Xcode14 和 iOS 16 上,如何从编译层面和运行时层面,优化 Swift 和 Objective-C runtime, 来让 app 二进制体积更小,运行更快,启动更快。当你使用 Xcode 14 构建应用程序时,你将会了解到如何访问高效的协议检查,更小消耗的消息发送调用,以及优化后的 ARC。下面我们深入探讨这几个方面的优化。
DerekYuYi
2022/06/26
4K1
iOS16 和 Xcode14 如何改进 App 大小和运行时性能
数学--数论--HDU - 6124 Euler theorem (打表找规律)
HazelFan is given two positive integers a,b, and he wants to calculate amodb. But now he forgets the value of b and only remember the value of a, please tell him the number of different possible results. Input The first line contains a positive integer T(1≤T≤5), denoting the number of test cases. For each test case: A single line contains a positive integer a(1≤a≤109). Output For each test case: A single line contains a nonnegative integer, denoting the answer. Sample Input 2 1 3 Sample Output 2 3 这个题比较水,用了map还是不如线性递推快,但是线性递推就超时了,于是打表找规律,然后发现规律如下。
风骨散人Chiam
2020/11/05
2920
五分钟了解Java10针对垃圾收集的改进
Java10 已经发布了大概有一个多月了。我们在之前的文中介绍过10为我们带来的一些新特性:JDK10要来了:下一代 Java 有哪些新特性?。其中就提到了10 关于G1垃圾收集器的一些改进。G1在Java 9的时候已经是被作为默认的垃圾收集器了。如果你了解G1的话,应该知道它是一个更注重低停顿的收集器。有关G1的内容你可以移步一步步图解G1。 那么在10中针对垃圾回收都有哪些改进和改变呢? 严格的来说有两处是与垃圾回收有关的: 分别是JEP304和JEP307。 JEP 304: 垃圾回收器接口(Garb
ImportSource
2018/04/18
1.1K0
【Rust日报】2023-10-02 改进 Rust 宏中的自动完成功能
自动完成是 IDE 提供的一种功能,可以帮助开发者在编写代码时快速找到正确的关键字和参数。在 Rust 宏中,自动完成功能可能会出现不准确或不完整的情况。
MikeLoveRust
2023/10/04
2810
【Rust日报】2023-10-02 改进 Rust 宏中的自动完成功能
java运行时异常和非运行时异常区别_常用的运行时异常
Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构如下图所示:
全栈程序员站长
2022/11/11
1.1K0
改进GPT的底层技术
code:通过进化、可塑性和 元 元学习 获得认知能力(4个时间维度的学习迭代)
CreateAMind
2023/09/01
1630
改进GPT的底层技术
故障改进
当你解决故障的时候,一定要防止对方对问题提前下结论,如果对方局部的证明是能证明结论是正确的,那从全局来看呢?不要在二手信息上深入讨论,不要用二手信息作为重要依据。
只喝牛奶的杀手
2022/11/14
6090
故障改进
运行时异常与非运行时异常的区别
java提供了两种异常机制。一种是运行时异常(RuntimeExepction),一种是检查式异常(checked execption)(非运行时异常)。
全栈程序员站长
2022/06/30
9560
PSO算法的改进策略
PSO(PSO——Particle Swarm Optimization)(基于种群的随机优化技术算法) 粒子群算法模仿昆虫、兽群、鸟群和鱼群等的群集行为,这些群体按照一种合作的方式寻找食物,群体中的每个成员通过学习它自身的经验和其他成员的经验来不断改变其搜索模式。
里克贝斯
2021/05/21
1K0
PSO算法的改进策略
文献——Mantel test的改进
Link:http://sci-hub.tw/https://besjournals.onlinelibrary.wiley.com/doi/pdf/10.1111/2041-210X.13141
Listenlii-生物信息知识分享
2020/05/29
1.3K0
文献——Mantel test的改进
【Rust 日报】2021-11-10 好文推荐:如何改进限制过多的 Rust 库 API
这个 crate 原理仍然是将rust编译成 cdylib,然后在 c# 里面调用。不过将这个过程变得更容易了一点。
MikeLoveRust
2021/11/12
4990

相似问题

使用Twitter流API获取最新的tweet

12

使用流API twitter使用1.1获取tweet

14

Twitter流API:可以只过滤有坐标的tweet吗?

13

Twitter流api -限制tweet的数量

12

使用Twitter流API,是否可以只显示特定用户的tweet?

46
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档