gpt4 book ai didi

python - Keras 中 RNN/LSTM 的 InvalidArgumentError

转载 作者:行者123 更新时间:2023-11-30 09:47:08 26 4
gpt4 key购买 nike

我正在全身心投入机器学习,并希望将 Keras 用于时间紧迫的大学项目。我意识到最好学习单独的概念和构建模块,但重要的是尽快完成。

我正在和一个对机器学习有一定经验和兴趣的人一起工作,但我们似乎无法走得更远。以下代码改编自GitHub code中提到的a guide in Machine Learning Mastery

就上下文而言,我从多个物理传感器(其中每个传感器是一列)获取了数据,这些传感器的每个样本都由一行表示。我希望使用机器学习来确定传感器在任何给定时间跟踪的人。我尝试将大约 80% 的行分配给训练,将 20% 分配给测试,并创建我自己的“y”数据集(前 521,549 行来自一个参与者,其余的来自另一个参与者)。我的数据(训练和测试)总共有 1,019,802 行和 16 列(全部填充),但如果需要,可以减少列数。

我很想知道以下内容:

  1. 此错误对于我想要实现的目标而言意味着什么?如何更改代码以避免出现该错误?
  2. 下面的代码适合我想要实现的目标吗?
  3. 这段代码是否代表了我对机器学习(一般或具体)旨在实现的目标的理解中存在任何具体的基本缺陷?

下面是我尝试运行以利用机器学习的 Python 代码:

x_all = pd.read_csv("(redacted)...csv",
delim_whitespace=True, header=None, low_memory=False).values
y_all = np.append(np.full((521549,1), 0), np.full((498253,1),1))
limit = 815842
x_train = x_all[:limit]
y_train = y_all[:limit]
x_test = x_all[limit:]
y_test = y_all[limit:]

max_features = 16
maxlen = 80
batch_size = 32

model = Sequential()
model.add(Embedding(500, 32, input_length=max_features))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])

model.fit(x_train, y_train,
batch_size=batch_size,
epochs=15,
validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,
batch_size=batch_size)

这是代码中引用的 CSV 的摘录:

6698.486328125  4.28260869565217    4.6304347826087 10.6195652173913    2.4392579293836 2.56134051466188    9.05326152004788    0.0 1.0812  924.898261191267    -1.55725190839695   -0.244274809160305  0.320610687022901   -0.122938530734633  0.490254872563718   0.382308845577211   
6706.298828125 4.28260869565217 4.58695652173913 10.5978260869565 2.4655894673848 2.50867743865949 9.04368641532017 0.0 1.0812 924.898261191267 -1.64885496183206 -0.366412213740458 0.381679389312977 -0.122938530734633 0.490254872563718 0.382308845577211
6714.111328125 4.26086956521739 4.64130434782609 10.5978260869565 2.45601436265709 2.57809694793537 9.03411131059246 0.0 1.0812 924.898261191267 -0.931297709923664 -0.320610687022901 0.320610687022901 -0.125937031484258 0.493253373313343 0.371814092953523

运行时出现以下错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: indices[0,0] = 972190 is not in [0, 500)
[[Node: embedding_1/embedding_lookup = GatherV2[Taxis=DT_INT32, Tindices=DT_INT32, Tparams=DT_FLOAT, _class=["loc:@training/Adam/Assign_2"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](embedding_1/embeddings/read, embedding_1/Cast, training/Adam/gradients/embedding_1/embedding_lookup_grad/concat/axis)]]

作为引用,我使用的是 2017 款 27 英寸 iMac Retina 5K,配备 4.2 GHz i7、32 GB RAM 和 Radeon Pro 580 8 GB。

最佳答案

还有一些关于机器学习掌握的教程可以满足您想要完成的任务 https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/ https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/

我将对您可能想要做的事情给出我自己的快速解释。

现在看起来您正在为模型的 X 和 y 输入使用完全相同的数据。 y 输入是标签,在您的情况下是“传感器正在跟踪的人”。因此,在有 2 个可能的人的二进制情况下,第一个人设置为 0,第二个人设置为 1。

最后一层的 sigmoid 激活将输出 0 到 1 之间的数字。如果该数字低于 0.5,则预测传感器正在跟踪人物 0,如果高于 0.5,则预测传感器正在跟踪人物 1。这将以准确度分数表示。

您可能不想使用嵌入层,您可能会想,但我会先放弃它。在将数据输入网络之前对其进行标准化以改进训练。如果您想要快速解决方案,Scikit-Learn 提供了很好的工具。 http://scikit-learn.org/stable/modules/preprocessing.html

在处理时间序列数据时,您通常希望输入时间点窗口而不是单个点。如果您将时间序列发送到 Keras model.fit(),那么它将使用单个点作为输入。

为了将时间窗口作为输入,您需要将数据集中的每个示例重新组织为整个窗口,或者如果生成器会占用大量内存,则可以使用生成器。我链接的机器学习掌握页面对此进行了描述。Keras 有一个可以使用的生成器,名为 TimeseriesGenerator

from keras.preprocessing.sequence import TimeseriesGenerator
timeseries_generator = TimeseriesGenerator(data, targets, length, sampling_rate)

其中数据是特征的时间序列,目标是标签的时间序列。如果您使用时间序列生成器,那么在拟合时您将必须使用 fit_generator

model.fit_generator(timeseries_generator)

与使用evaluate_generator()进行评估相同

如果您的数据设置正确,那么您的模型应该可以工作

model = Sequential()
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))

您还可以尝试更简单的密集模型

model = Sequential()
model.add(Flatten())
model.add(Dense(64, dropout=0.2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

我看到的另一个问题是,您似乎会分割出一个仅包含一种类型标签的测试集,这不仅是不好的做法,而且还会将您的训练集加权到其他标签,这可能会损害您的结果。

希望这能让您开始。确保您的数据设置正确!

关于python - Keras 中 RNN/LSTM 的 InvalidArgumentError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51152582/

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