关于不同Batch_Size在LSTM训练与预测中使用(Keras框架)

博文内容借鉴: 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训练与预测中使用(Keras框架))