我正在尝试构建一个序列到序列模型,以学习跨时间和特征的有用特征。
我的输入数据设置为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)
我在网上找到了一些与此主题相关的主题,但是大多数假设您具有相同的输入/输出长度,或者您的输出是二进制(预定义)。在这种情况下,输入的长度是可变的,而输出的长度取决于输入的大小。这两种方法都涉及了这些概念,但是并没有一个适合此的示例。
我最初的尝试是这样的:
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形状矢量。
我的问题是:
我不介意在tensorflow中解释事物还是在pytorch中进行解释,如果事物需要更多地参与。我提供了Keras示例作为易于阅读的起点。