LSTM 与 keras

LSTM with keras

我有一些训练数据 x_train 和这个 x_train 的一些相应标签 y_train。以下是 x_trainy_train 的构造方式:

train_x = np.array([np.random.rand(1, 1000)[0] for i in range(10000)])
train_y = (np.random.randint(1,150,10000))

train_x 有 10000 行,每行有 1000 列。 train_y 对 train_x 中的每个样本都有一个介于 1 和 150 之间的标签,并代表每个 train_x 样本的代码。

我还有一个名为 sample 的样本,它是 1 行 1000 列,我想用它来对此 LSTM 模型进行预测。此变量定义为

sample = np.random.rand(1,1000)[0]

我正在尝试使用 Keras 训练和预测此数据的 LSTM。我想接受这个特征向量并使用这个 LSTM 来预测 1 到 150 范围内的代码之一。我知道这些是随机数组,但我不能 post 我拥有的数据。我尝试了以下我认为应该有效的方法,但遇到了一些问题

    model = Sequential()
    model.add(LSTM(output_dim = 32, input_length = 10000, input_dim = 1000,return_sequences=True))
    model.add(Dense(150, activation='relu'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    history = model.fit(train_x, train_y,
              batch_size=128, nb_epoch=1,
              verbose = 1)
    model.predict(sample)

对此管道的任何帮助或调整都会很棒。我不确定 output_dim 是否正确。我想在 1000 维数据的每个样本上训练 LSTM,然后重现 1 到 150 范围内的特定代码。谢谢。

我发现您至少需要更改三处:

  1. 更改此行:

    model.add(Dense(150, activation='relu'))
    

    至:

    model.add(Dense(150, activation='softmax'))
    

    因为离开 'relu' 因为激活会使你的输出不受限制,而它需要有一个概率解释(因为你使用 categorical_crossentropy)。

  2. 更改损失或目标:

    当您使用 categorical_crossentropy 时,您需要将目标更改为长度为 150 的 one-hot 编码 向量。另一种方法是离开目标,但是将损失更改为 sparse_categorical_crossentropy.

  3. 更改目标范围:

    Keras 有一个基于 0 的数组索引(如 PythonCC++,因此您的值应该在 [0, 150) 范围内[1, 150].