用可变长度输入和不同输出长度对Keras,Pytorch或Tensorflow进行序列排序

时间:2018-12-07 20:38:06

标签: tensorflow keras pytorch recurrent-neural-network sequence-to-sequence

我正在尝试构建一个序列到序列模型,以学习跨时间和特征的有用特征。

我的输入数据设置为Nx250,其中N是要素数,而250是时间步数。在这种情况下,时间保持恒定。我的输出数据理想情况下将为N * N。在这种情况下,N在50-200之间变化。我不介意该模型是否跨N维学习(在Keras中考虑了时间),因为暗淡的特征是某种“时间分量特征”。

输入:

(无,N,250)=

(在Keras中)(batch_size,时间步长,input_dim)=

(对我而言)(batch_size,时间功能,时间窗口)

输出:

(None,N * N)=(batch_size,outputlen)

我在网上找到了一些与此主题相关的主题,但是大多数假设您具有相同的输入/输出长度,或者您的输出是二进制(预定义)。在这种情况下,输入的长度是可变的,而输出的长度取决于输入的大小。这两种方法都涉及了这些概念,但是并没有一个适合此的示例。

  1. Sequence-to-sequence classification with variable sequence lengths in Keras
  2. Varying sequence length in Keras without padding

我最初的尝试是这样的:

timesteps = None
outputsize = None
MAXSTEPS = 200
winsize = 250
hidden_size = 125

#encoder
inputs = Input(batch_shape = (1, MAXSTEPS, winsize))
outputs = Masking(mask_value=0., input_shape=(timesteps, features))(inputs)
outputs = LSTM(units=hidden_size, return_sequences=False)(outputs)
# outputs = LSTM(units=hidden_size//2, return_sequences=False)(outputs)
outputs = Lambda(storeLength)([inputs, outputs])
encoder = Model(inputs,outputs)

#decoder
inputs = Input(batch_shape=(1,hidden_size+1))
outputs = Lambda(expandLength)(inputs)
outputs = LSTM(units=hidden_size, return_sequences=True)(outputs)
outputs = Dense(MAXCHANS**2, activation='softmax')(outputs)
decoder = Model(inputs,outputs)

encoder.summary()
decoder.summary()

输出显示在这里:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_37 (InputLayer)           (1, 200, 250)        0                                            
__________________________________________________________________________________________________
masking_31 (Masking)            (1, 200, 250)        0           input_37[0][0]                   
__________________________________________________________________________________________________
lstm_57 (LSTM)                  (1, 125)             188000      masking_31[0][0]                 
__________________________________________________________________________________________________
lambda_29 (Lambda)              (1, 126)             0           input_37[0][0]                   
                                                                 lstm_57[0][0]                    
==================================================================================================
Total params: 188,000
Trainable params: 188,000
Non-trainable params: 0
__________________________________________________________________________________________________
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_38 (InputLayer)        (1, 126)                  0         
_________________________________________________________________
lambda_30 (Lambda)           (1, None, 125)            0         
_________________________________________________________________
lstm_58 (LSTM)               (1, None, 125)            125500    
_________________________________________________________________
dense_7 (Dense)              (1, None, 40000)          5040000   
=================================================================
Total params: 5,165,500
Trainable params: 5,165,500
Non-trainable params: 0

在这里我将其分为两个设置:“解码”和“编码”步骤,但实际上,这只是一些可变长度序列模型,用于学习一些特征,这些特征输出最终的N * N形状矢量。

我的问题是:

  1. 似乎使用MAXSTEPS = 200意味着我需要在进行训练/测试之前相应地填充数据,对吗?如果是这样,为什么我不能简单地将其定义为“无”,以使输入形状是“可变的”。我尝试了一下,但没有成功,因此我正在研究是否只需要对MAXSTEPS变量进行硬编码。
  2. 如果我对MAXSTEPS进行了硬编码,那么我的输出将始终为200 * 200。如何在网络中继续应用屏蔽,以便仅获得相关的输出?例如。如果输入50x250的序列,则只希望输出50 * 50,而不是200 * 200。
  3. 我最后需要密集层吗?与终端LSTM模型相比,是否建议使用该模型?我在网上找到了各种各样的答案,没有很好的解释。

我不介意在tensorflow中解释事物还是在pytorch中进行解释,如果事物需要更多地参与。我提供了Keras示例作为易于阅读的起点。

0 个答案:

没有答案