gpt4 book ai didi

tensorflow - Keras TimeDistributed Not Masking CNN模型

转载 作者:行者123 更新时间:2023-12-04 08:31:42 26 4
gpt4 key购买 nike

举例来说,我有一个输入,其中包含2张图像,总形状为(2,299,299,3)。我正在尝试在每个图像上应用inceptionv3,然后随后使用LSTM处理输出。我正在使用 mask 层将空白图像排除在处理范围之外(在下面指定)。

代码是:

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部分,但应从初始开始处理(给出非零输出)。详细信息如下:

layer_out [-1],LSTM输出很好:
[array([[-0.15324114, -0.09620268, -0.01668587, 0.07938149, -0.00757846]], dtype=float32)]
layer_out [-2]和layer_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)]

layer_out [-4],则正确屏蔽了CNN的输入:
[[ 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.]],

请注意,该代码似乎可以使用更简单的base_model正确工作 ,例如:

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上询问了这个问题的排列,例如 hereherehere,但是我似乎找不到任何具体的解决方案。

这些链接表明问题似乎是由于将TimeDistributed应用于BatchNormalization的结合,并且Lambda身份层或Reshape层的hacky修复程序消除了错误,但似乎没有输出正确的模型。

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

base_model.__setattr__('supports_masking',True)

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

TimeDistributed(Lambda(lambda x: base_model(x), output_shape=lambda s:s))(final_model)

但这些似乎都不起作用。请注意,我希望最终模型是可训练的,尤其是其中的CNN部分应保持可训练的状态。

最佳答案

不能完全确定这是否可行,但是基于comment made here,它应该可以使用较新版本的tensorflow + keras进行工作:

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)
我看了一下 mask 的源代码,发现Keras创建了只减少最后一个轴的 mask 张量。只要使用5D张量,它就不会造成任何问题,但是当您减小LSTM的尺寸时,此掩盖张量变得不兼容。
进行掩盖之前,执行第一步展平步骤将确保掩盖张量对于3D张量正常工作。然后,将图像再次扩展到其原始大小。

我可能会尽快尝试安装较新的版本以对其进行测试,但是这些安装过程造成了太多麻烦,我在这里很重要。
在我的机器上,该代码可以编译,但是在预测时间内会出现该奇怪的错误(请参见此答案第一行的链接)。

创建用于预测中间层的模型
根据所看到的代码,我不确定掩蔽函数是否在张量内部保留。我不确切知道它是如何工作的,但是它似乎是与各层内部功能的构建分开管理的。
因此,尝试使用keras标准模型进行预测:
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])

关于tensorflow - Keras TimeDistributed Not Masking CNN模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50094633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com