Keras LSTM 训练数据格式

Posted

技术标签:

【中文标题】Keras LSTM 训练数据格式【英文标题】:Keras LSTM training data format 【发布时间】:2017-06-27 17:05:10 【问题描述】:

我正在尝试使用 LSTM 神经网络(使用 Keras)来预测对手在 Rock-Paper-Scissor 游戏中的下一步行动。

我将输入编码为 Rock:[1 0 0],Paper:[0 1 0],Scissor:[0 0 1]。现在我想训练神经网络,但我对训练数据的数据结构有点困惑。

我已将对手的游戏历史存储在具有以下结构的 .csv 文件中:

1,0,0
0,1,0
0,1,0
0,0,1
1,0,0
0,1,0
0,1,0
0,0,1
1,0,0
0,0,1

我尝试使用每 5 个数据作为我的训练标签,并将前 4 个数据作为训练输入。换句话说,在每个时间步,一个维度为 3 的向量被发送到网络,我们有 4 个时间步。

例如下面是输入数据

1,0,0
0,1,0
0,1,0
0,0,1

第五个是训练标签

1,0,0

我的问题是 Keras 的 LSTM 网络接受什么类型的数据格式?为此目的重新排列我的数据的最佳方法是什么?如果有帮助,我的不完整代码如下:

#usr/bin/python
from __future__ import print_function

from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.optimizers import Adam

output_dim = 3
input_dim = 3
input_length = 4
batch_size = 20   #use all the data to train in one iteration


#each input has such strcture
#Rock: [1 0 0], Paper: [0 1 0], Scissor: [0 0 1]
#4 inputs (vectors) are sent to the LSTM net and output 1 vector as the prediction

#incomplete function
def read_data():
    raw_training = np.genfromtxt('training_data.csv',delimiter=',')




    print(raw_training)

def createNet(summary=False):
    print("Start Initialzing Neural Network!")
    model = Sequential()
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length,
            return_sequences=True,activation='softmax'))
    model.add(Dropout(0.1))
    model.add(LSTM(4,
            return_sequences=True,activation='softmax'))
    model.add(Dropout(0.1))
    model.add(Dense(3,activation='softmax'))
    model.add(Dropout(0.1))
    model.add(Dense(3,activation='softmax'))
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
    if summary:
        print(model.summary())
    return model

if __name__=='__main__':
    createNet(True)

【问题讨论】:

【参考方案1】:

LSTM 的输入格式应该有一个形状(sequence_length,input_dim)。 因此,在您的情况下,形状为 (4,3) 的 numpy 数组应该这样做。

您将提供给模型的内容将是一个形状为 numpy 的数组(number_of_train_examples、sequence_length、input_dim)。 换句话说,您将提供 number_of_train_examples 形状 (4,3) 的表格。 建立一个列表:

1,0,0
0,1,0
0,1,0
0,0,1

然后执行 np.array(list_of_train_example)。

但是,我不明白您为什么要为第二个 LSTM 返回整个序列?它会输出一些形状为 (4,4) 的东西,密集层可能会失败。返回序列意味着您将返回整个序列,因此 LSTM 每一步的每个隐藏输出。对于第二个 LSTM,我将其设置为 False 以仅获得 Dense 层可以读取的形状为 (4,) 的“摘要”向量。 无论如何,即使对于第一个 LSTM,这意味着使用形状 (4,3) 的输入,您会输出具有形状 (4,4) 的东西,因此您将拥有比该层的输入数据更多的参数...可以不是很好。

关于激活,我也会使用 softmax,但仅在最后一层,softmax 用于获取概率作为该层的输出。在最后一个之前使用 LSTM 和 Dense 之外的 softmax 并没有真正的意义。寻找其他一些非线性,例如“sigmoid”或“tanh”。

这就是我会在模型方面做的事情

def createNet(summary=False):
    print("Start Initialzing Neural Network!")
    model = Sequential()
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length,
            return_sequences=True,activation='tanh'))
    model.add(Dropout(0.1))
    # output shape : (4,4)
    model.add(LSTM(4,
            return_sequences=False,activation='tanh'))
    model.add(Dropout(0.1))
    # output shape : (4,)
    model.add(Dense(3,activation='tanh'))
    model.add(Dropout(0.1))
    # output shape : (3,)
    model.add(Dense(3,activation='softmax'))
    # output shape : (3,)
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
    if summary:
        print(model.summary())
    return model

【讨论】:

以上是关于Keras LSTM 训练数据格式的主要内容,如果未能解决你的问题,请参考以下文章

将存储在 tfrecord 格式的数据转换为 Tensorflow 中 lstm Keras 模型的输入,并用该数据拟合模型

如何格式化从keras转换的coreml中conv1d/lstm nn的输入数据

Keras LSTM:如何预测超越验证与预测?

Keras:将MDN层添加到LSTM网络

Keras LSTM 模型过拟合

如何使用 LSTM Keras 预测未来库存