Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 时间分布层keras_Tensorflow_Keras - Fatal编程技术网

Tensorflow 时间分布层keras

Tensorflow 时间分布层keras,tensorflow,keras,Tensorflow,Keras,我试图理解keras/tensorflow中的时间分布层。 据我所知,它是一种包装器,可以在示例中处理一系列图像 现在我想知道如果不使用时间分布层,如何设计一个时间分布网络 在示例中,如果我有一个由3幅图像组成的序列,每幅图像有一个通道,像素尺寸为256x256px,首先由CNN处理,然后由LSTM单元处理。 然后,我对时间分布层的输入是(N,3256256,1),其中N是批量大小 然后,CNN将有3个输出,这些输出被馈送到LSTM单元 现在,如果不使用时间分布层,是否可以通过建立一个具有3个不

我试图理解keras/tensorflow中的时间分布层。 据我所知,它是一种包装器,可以在示例中处理一系列图像

现在我想知道如果不使用时间分布层,如何设计一个时间分布网络

在示例中,如果我有一个由3幅图像组成的序列,每幅图像有一个通道,像素尺寸为256x256px,首先由CNN处理,然后由LSTM单元处理。 然后,我对时间分布层的输入是(N,3256256,1),其中N是批量大小

然后,CNN将有3个输出,这些输出被馈送到LSTM单元

现在,如果不使用时间分布层,是否可以通过建立一个具有3个不同输入和3个类似CNN的网络来实现同样的功能?然后,3个CNN的输出可以被展平和串联

这与时间分布的方法有什么不同吗

提前感谢,


我为你创建了一个原型。我使用了最少的层和任意单位/内核/过滤器,可以随意更改。它首先创建一个cnn模型,该模型接受大小为(256256,1)的输入。它使用相同的cnn模型3次(对于序列中的三幅图像)来提取特征。它使用Lambda层堆叠所有特征,以将其按顺序放回。然后,序列穿过LSTM层。我已经为LSTM选择了每个示例返回单个特征向量,但是如果您希望输出也是一个序列,可以将其更改为
return\u sequences=True
。您还可以添加最后的附加层以使其适应您的需要

from tensorflow.keras.layers import Input, LSTM, Conv2D, Flatten, Lambda
from tensorflow.keras import Model
import tensorflow.keras.backend as K

def create_cnn_model():
  inp = Input(shape=(256,256,1))
  x = Conv2D(filters=16, kernel_size=5, strides=2)(inp)
  x = Flatten()(x)
  model = Model(inputs=inp, outputs=x, name='cnn_Model')
  return model


def combined_model():
  cnn_model = create_cnn_model()
  inp_1 = Input(shape=(256,256,1))
  inp_2 = Input(shape=(256,256,1))
  inp_3 = Input(shape=(256,256,1))

  out_1 = cnn_model(inp_1)
  out_2 = cnn_model(inp_2)
  out_3 = cnn_model(inp_3)

  lstm_inp = [out_1, out_2, out_3]
  lstm_inp = Lambda(lambda x: K.stack(x, axis=-2))(lstm_inp)
  x = LSTM(units=32, return_sequences=False)(lstm_inp)

  model = Model(inputs=[inp_1, inp_2, inp_3], outputs=x)
  return model
现在创建模型,如下所示:

model = combined_model()
查看摘要:

model.summary()
将打印:

Model: "model_14"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_53 (InputLayer)           [(None, 256, 256, 1) 0                                            
__________________________________________________________________________________________________
input_54 (InputLayer)           [(None, 256, 256, 1) 0                                            
__________________________________________________________________________________________________
input_55 (InputLayer)           [(None, 256, 256, 1) 0                                            
__________________________________________________________________________________________________
cnn_Model (Model)               (None, 254016)       416         input_53[0][0]                   
                                                                 input_54[0][0]                   
                                                                 input_55[0][0]                   
__________________________________________________________________________________________________
lambda_3 (Lambda)               (None, 3, 254016)    0           cnn_Model[1][0]                  
                                                                 cnn_Model[2][0]                  
                                                                 cnn_Model[3][0]                  
__________________________________________________________________________________________________
lstm_13 (LSTM)                  (None, 32)           32518272    lambda_3[0][0]                   
==================================================================================================
Total params: 32,518,688
Trainable params: 32,518,688
Non-trainable params: 0
可以打印内部cnn模型摘要:

model.get_layer('cnn_Model').summary()
目前正在打印:

Model: "cnn_Model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_52 (InputLayer)        [(None, 256, 256, 1)]     0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 126, 126, 16)      416       
_________________________________________________________________
flatten_6 (Flatten)          (None, 254016)            0         
=================================================================
Total params: 416
Trainable params: 416
Non-trainable params: 0
_________________________
您的模型需要一个列表作为输入。列表的长度应为
3
(因为一个序列中有3个图像)。列表中的每个元素都应该是一个形状的numpy数组(batch_size,256,256,1)。我在下面使用了一个批量为1的虚拟示例:

import numpy as np

a = np.zeros((256,256,1)) # first image filled with zeros
b = np.zeros((256,256,1)) # second image filled with zeros
c = np.zeros((256,256,1)) # third image filled with zeros

a = np.expand_dims(a, 0) # adding batch dimension to make it (1, 256, 256, 1)
b = np.expand_dims(b, 0) # same here
c = np.expand_dims(c, 0) # same here


model.compile(loss='mse', optimizer='adam')
# train your model with model.fit(....)

e = model.predict([a,b,c]) # a,b and c have shape of (1, 256, 256, 1) where the first 1 is the batch size

您好,谢谢这个伟大而详细的例子!因此,在你的模型中,你使用三个输入,三次相同的CNN模型。然后将输出叠加在一起并馈入LSTM层。这就是keras中时间分布层的基本功能吗?嗨,是的。这是我的理解。keras的官方文件也这么说:你好!太好了,谢谢你的澄清:-)干杯,M