美文网首页
关于不同Batch_Size在LSTM训练与预测中使用(Kera

关于不同Batch_Size在LSTM训练与预测中使用(Kera

作者: AresAnt | 来源:发表于2018-05-19 22:55 被阅读0次

    博文内容借鉴: How to use Different Batch Sizes when Training and Predicting with LSTMs
    链接:https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/

    首先,我们会有一些问题才会产生这样子的疑问。比如我在keras,框架中搭建时候设置了batch_size后(即在训练过程中,保持着batch_size),那么我在预测的时候也必须将test设置成batch_size的大小,否则程序会报错,例如如下:

    ValueError: Cannot feed value of shape (1, 1, 1) for Tensor 'lstm_1_input:0', which has shape '(9, 1, 1)'
    

    会报错的以上代码可能会是如下情况:

    model = Sequential()
    model.add(LSTM(batch_input_shape=(BATCH_SIZE, TIME_STEPS, INPUT_SIZE), output_dim=CELL_SIZE))
    model.add(Dense(OUTPUT_SIZE))
    # 如果其他 activation 就进行添加
    model.add(Activation('softmax'))
    
    # 如果这里的 X_TEST 和 Y_TEST 的 shape , 即 【Batch_Size, Time_Step , Input_Sizes】中的 Batch_Size 大小不同于删除 LSTM 中的 Batch_Size,即会报错。
    cost, accuracy = model.evaluate(X_TEST, Y_TEST, verbose=False)
    

    如果这里的 X_TEST 和 Y_TEST 的 shape , 即 【Batch_Size, Time_Step , Input_Sizes】中的 Batch_Size 大小不同于删除 LSTM 中的 Batch_Size,即会报错。

    解决办法:

    代码角度

    首先,我们知道在Keras框架中,有那么几种代码的写法:
    (1)

    model = Sequential()
    model.add(LSTM(100, input_shape=(train_x.shape[1], train_x.shape[2]),activation='hard_sigmoid',recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform',recurrent_initializer='orthogonal', bias_initializer='zeros'))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    history = model.fit(train_x, train_y, epochs=30, batch_size=20, verbose=2,
                            shuffle=False)
    

    以上的代码是使用,input_shape={ time_step, input_sizes 【一般来说都是 features 的数量】 }
    这种方式下,model.fit 中的 batch_size 大小即为迭代次数的大小,对于这种方式的写法有个好处就是方便快捷,但是有一个坏处就是,对于这种方式,无法使用 train_on_batch 的函数,它需要模型在之前的操作中就设定好了 Batch_Size 的大小。【另外这种模式下,LSTM的Stateful 是否在每次迭代中都会重置,或者会延续,笔者暂时还未考究】

    (2)

    model = Sequential()
    model.add(LSTM(batch_input_shape=(None, TIME_STEPS, INPUT_SIZE), output_dim=CELL_SIZE))
    model.add(Dense(OUTPUT_SIZE))
    # 如果其他 activation 就进行添加
    model.add(Activation('softmax'))
    
    # 如果这里的 X_TEST 和 Y_TEST 的 shape , 即 【Batch_Size, Time_Step , Input_Sizes】中的 Batch_Size 大小不同于删除 LSTM 中的 Batch_Size,即会报错。
    cost, accuracy = model.evaluate(X_TEST, Y_TEST, verbose=False)
    

    把上述 batch_input_shape 中的 Batch_Size 变为None, 这种写法的方式与(1)类似,但是方便在它可以调用 train_on_batch 函数,且可以再model.add(LSTM) 中添加 stateful 参数,保证下一次的 LSTM 的 State 延续到下一次batch中。

    其他角度

    (1)Online Learning (Batch Size = 1)
    把 Batch_Size 的大小设置为1,变为一个 online learning 的方式去学习。
    (2)Batch Forecasting (Batch Size = N)
    把 测试集(验证集)的预测大小做成相同的Batch_Size 进行预测,这种方式一般对于已经集成好的测试集与验证集会方便有效。【但对于股票预测等等,只希望预测下一步的值,会报错误,跟上述描述问题相同】
    (3)Copy Weights
    把之前训练好的网络权重系数保留,重新去初始化一个新的网络结构,然后用新的网络来进行逐步的预测。
    例如:

    # re-define the batch size
    n_batch = 1
    # re-define model
    new_model = Sequential()
    new_model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True))
    new_model.add(Dense(1))
    # copy weights
    old_weights = model.get_weights()
    new_model.set_weights(old_weights)
    

    相关文章

      网友评论

          本文标题:关于不同Batch_Size在LSTM训练与预测中使用(Kera

          本文链接:https://www.haomeiwen.com/subject/xcaadftx.html