gpt4 book ai didi

keras - Keras 中的 GRU/LSTM 具有不同长度的输入序列

转载 作者:行者123 更新时间:2023-12-04 18:00:44 25 4
gpt4 key购买 nike

我正在做一个较小的项目,以更好地理解 RNN,尤其是 LSTM 和 GRU。我根本不是专家,所以请记住这一点。

我面临的问题以以下形式的数据给出:

>>> import numpy as np
>>> import pandas as pd
>>> pd.DataFrame([[1, 2, 3],[1, 2, 1], [1, 3, 2],[2, 3, 1],[3, 1, 1],[3, 3, 2],[4, 3, 3]], columns=['person', 'interaction', 'group'])
person interaction group
0 1 2 3
1 1 2 1
2 1 3 2
3 2 3 1
4 3 1 1
5 3 3 2
6 4 3 3

这只是为了解释。我们有不同的人以不同的方式与不同的群体互动。我已经对各种功能进行了编码。用户的最后一次交互始终是 3 ,这意味着选择某个组。在上面的简短示例中 person 1选群 2 , person 2选群 1等等。

我的整个数据集要大得多,但我想先了解概念部分,然后再将模型投入其中。我想学习的任务给出了一系列交互,由该人选择哪个组。更具体一点,我想输出一个包含所有组(有 3 个组, 1, 2, 3 )的列表,按最可能的选择排序,然后是第二个和第三个最喜欢的组。因此,损失函数是一个平均倒数秩。

我知道在 Keras Grus/LSTM 中可以处理各种长度的输入。所以我的三个问题是。

输入格式如下:
(samples, timesteps, features)

编写高级代码:
import keras.layers as L
import keras.models as M
model_input = L.Input(shape=(?, None, 2))
timestep=None应该意味着不同的大小和 2用于功能 interactiongroup .但是 sample 呢?如何定义批次?

对于输出,我有点困惑在这个例子中它应该是什么样子?我认为对于一个人的最后一次互动,我想要一个长度列表 3 .假设我已经设置了输出
model_output = L.LSTM(3, return_sequences=False)

然后我想编译它。有没有办法使用平均倒数排名?
model.compile('adam', '?')

我知道这些问题的水平相当高,但我想先了解大局并开始玩。因此,任何帮助将不胜感激。

最佳答案

您在问题中提出的概念已经是一个很好的开始。我将添加一些内容以使其工作,以及下面的代码示例:

  • 您可以指定 LSTM(n_hidden, input_shape=(None, 2))直接,而不是插入额外的 Input层;定义中将省略批次维度。
  • 由于您的模型将执行某种分类(基于时间序列数据),因此最后一层也是我们对“正常”分类的期望,Dense(num_classes, action='softmax') .链接 LSTMDense layer一起将首先通过LSTM传递时间序列输入层,然后将其输出(由隐藏单元的数量决定)输入 Dense层。 activation='softmax'允许计算每个类的类分数(我们将在数据预处理步骤中使用单热编码,请参见下面的代码示例)。这意味着类(class)分数不是按顺序排列的,但您始终可以通过 np.argsort 进行排序。或 np.argmax .
  • 分类交叉熵损失适用于比较分类分数,因此我们将使用该分数:model.compile(loss='categorical_crossentropy', optimizer='adam') .
  • 由于互动次数。即模型输入的长度因样本而异,我们将使用批量大小为 1 并一次输入一个样本。

  • 以下是针对上述注意事项的示例实现。请注意,我稍微修改了您的示例数据,以便在组选择背后提供更多“推理”。此外,每个人在选择组之前至少需要进行一次交互(即输入序列不能为空);如果您的数据不是这种情况,那么引入额外的无操作交互(例如 0 )会有所帮助。
    import pandas as pd
    import tensorflow as tf

    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.LSTM(10, input_shape=(None, 2))) # LSTM for arbitrary length series.
    model.add(tf.keras.layers.Dense(3, activation='softmax')) # Softmax for class probabilities.
    model.compile(loss='categorical_crossentropy', optimizer='adam')

    # Example interactions:
    # * 1: Likes the group,
    # * 2: Dislikes the group,
    # * 3: Chooses the group.
    df = pd.DataFrame([
    [1, 1, 3],
    [1, 1, 3],
    [1, 2, 2],
    [1, 3, 3],
    [2, 2, 1],
    [2, 2, 3],
    [2, 1, 2],
    [2, 3, 2],
    [3, 1, 1],
    [3, 1, 1],
    [3, 1, 1],
    [3, 2, 3],
    [3, 2, 2],
    [3, 3, 1]],
    columns=['person', 'interaction', 'group']
    )
    data = [person[1][['interaction', 'group']].values for person in df.groupby('person')]
    x_train = [x[:-1] for x in data]
    y_train = tf.keras.utils.to_categorical([x[-1, 1]-1 for x in data]) # Expects class labels from 0 to n (-> subtract 1).
    print(x_train)
    print(y_train)

    class TrainGenerator(tf.keras.utils.Sequence):
    def __init__(self, x, y):
    self.x = x
    self.y = y

    def __len__(self):
    return len(self.x)

    def __getitem__(self, index):
    # Need to expand arrays to have batch size 1.
    return self.x[index][None, :, :], self.y[index][None, :]

    model.fit_generator(TrainGenerator(x_train, y_train), epochs=1000)
    pred = [model.predict(x[None, :, :]).ravel() for x in x_train]
    for p, y in zip(pred, y_train):
    print(p, y)

    以及相应的示例输出:
    [...]
    Epoch 1000/1000
    3/3 [==============================] - 0s 40ms/step - loss: 0.0037
    [0.00213619 0.00241093 0.9954529 ] [0. 0. 1.]
    [0.00123938 0.99718493 0.00157572] [0. 1. 0.]
    [9.9632275e-01 7.5039308e-04 2.9268670e-03] [1. 0. 0.]

    使用自定义生成器表达式:根据 the documentation我们可以使用任何生成器来生成数据。生成器预计会生成批量数据并无限循环遍历整个数据集。使用时 tf.keras.utils.Sequence 我们不需要指定参数 steps_per_epoch因为这将默认为 len(train_generator) .因此,当使用自定义生成器时,我们也将提供此参数:
    import itertools as it

    model.fit_generator(((x_train[i % len(x_train)][None, :, :],
    y_train[i % len(y_train)][None, :]) for i in it.count()),
    epochs=1000,
    steps_per_epoch=len(x_train))

    关于keras - Keras 中的 GRU/LSTM 具有不同长度的输入序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55482946/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com