首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指定seq2seq自动编码器。RepeatVector是做什么的?批处理学习对预测输出的影响是什么?

指定seq2seq自动编码器。RepeatVector是做什么的?批处理学习对预测输出的影响是什么?
EN

Stack Overflow用户
提问于 2019-10-07 17:03:56
回答 2查看 959关注 0票数 4

我正在构建一个基本的seq2seq自动编码器,但我不确定我做得是否正确。

代码语言:javascript
运行
复制
model = Sequential()
# Encoder       
model.add(LSTM(32, activation='relu', input_shape =(timesteps, n_features ), return_sequences=True))
model.add(LSTM(16, activation='relu', return_sequences=False))
model.add(RepeatVector(timesteps))
# Decoder
model.add(LSTM(16, activation='relu', return_sequences=True))
model.add(LSTM(32, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))'''

然后使用批量大小参数对模型进行拟合

代码语言:javascript
运行
复制
model.fit(data, data,       
          epochs=30, 
          batch_size = 32)

该模型是用mse损失函数编译的,似乎是学习的。

为了获得测试数据的编码器输出,我使用了一个K函数:

代码语言:javascript
运行
复制
get_encoder_output = K.function([model.layers[0].input],
                                  [model.layers[1].output])

encoder_output = get_encoder_output([test_data])[0]

我的第一个问题是模型是否被正确指定。特别是是否需要RepeatVector层。我不确定它在做什么。如果我省略它并使用return_sequences = True指定前面的图层,该怎么办

我的第二个问题是,我是否需要告诉get_encoder_output培训中使用的batch_size

提前感谢您在这两个问题上的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-10 15:48:58

This可能会对您有用:

作为一个玩具问题,我创建了一个seq2seq模型来预测不同正弦波的连续性。

模型是这样的:

代码语言:javascript
运行
复制
def create_seq2seq():
    features_num=5 
    latent_dim=40

    ##
    encoder_inputs = Input(shape=(None, features_num))
    encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoder_inputs)
    encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoded)
    encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoded)
    encoded = LSTM(latent_dim, return_state=True)(encoded)

    encoder = Model (input=encoder_inputs, output=encoded)
    ##

    encoder_outputs, state_h, state_c = encoder(encoder_inputs)
    encoder_states = [state_h, state_c]

    decoder_inputs=Input(shape=(1, features_num))
    decoder_lstm_1 = LSTM(latent_dim, return_sequences=True, return_state=True)
    decoder_lstm_2 = LSTM(latent_dim, return_sequences=True, return_state=True)
    decoder_lstm_3 = LSTM(latent_dim, return_sequences=True, return_state=True)
    decoder_lstm_4 = LSTM(latent_dim, return_sequences=True, return_state=True)

    decoder_dense = Dense(features_num)

    all_outputs = []
    inputs = decoder_inputs


    states_1=encoder_states
    # Placeholder values:
    states_2=states_1; states_3=states_1; states_4=states_1
    ###

    for _ in range(1):
        # Run the decoder on the first timestep
        outputs_1, state_h_1, state_c_1 = decoder_lstm_1(inputs, initial_state=states_1)
        outputs_2, state_h_2, state_c_2 = decoder_lstm_2(outputs_1)
        outputs_3, state_h_3, state_c_3 = decoder_lstm_3(outputs_2)
        outputs_4, state_h_4, state_c_4 = decoder_lstm_4(outputs_3)

        # Store the current prediction (we will concatenate all predictions later)
        outputs = decoder_dense(outputs_4)
        all_outputs.append(outputs)
        # Reinject the outputs as inputs for the next loop iteration
        # as well as update the states
        inputs = outputs
        states_1 = [state_h_1, state_c_1]
        states_2 = [state_h_2, state_c_2]
        states_3 = [state_h_3, state_c_3]
        states_4 = [state_h_4, state_c_4]


    for _ in range(149):
        # Run the decoder on each timestep
        outputs_1, state_h_1, state_c_1 = decoder_lstm_1(inputs, initial_state=states_1)
        outputs_2, state_h_2, state_c_2 = decoder_lstm_2(outputs_1, initial_state=states_2)
        outputs_3, state_h_3, state_c_3 = decoder_lstm_3(outputs_2, initial_state=states_3)
        outputs_4, state_h_4, state_c_4 = decoder_lstm_4(outputs_3, initial_state=states_4)

        # Store the current prediction (we will concatenate all predictions later)
        outputs = decoder_dense(outputs_4)
        all_outputs.append(outputs)
        # Reinject the outputs as inputs for the next loop iteration
        # as well as update the states
        inputs = outputs
        states_1 = [state_h_1, state_c_1]
        states_2 = [state_h_2, state_c_2]
        states_3 = [state_h_3, state_c_3]
        states_4 = [state_h_4, state_c_4]


    # Concatenate all predictions
    decoder_outputs = Lambda(lambda x: K.concatenate(x, axis=1))(all_outputs)   

    model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

    #model = load_model('pre_model.h5')


    print(model.summary()
    return (model)
票数 3
EN

Stack Overflow用户

发布于 2019-10-09 00:45:00

在我看来,在seq2seq中实现LSTM的最好方法是使用2个LSTM模型,并让第一个模型将其状态转换为第二个模型。

编码器中的最后一个LSTM层将需要

return_state=True ,return_sequences=False,所以它将传递它的hc

然后,您需要设置一个LSTM解码器,该解码器将接收这些内容作为initial_state

对于解码器输入,您很可能需要一个"start of sequence“标记作为第一个时间步长输入,然后使用nth时间步长的解码器输出作为(n+1)th时间步长中解码器的输入。

在你掌握了这一点之后,看看老师的强迫。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58266407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档