【问题标题】:how to build LSTM RNN network for binary classification?如何构建用于二进制分类的 LSTM RNN 网络?
【发布时间】:2018-07-06 03:49:29
【问题描述】:

我正在尝试使用基于 LSTM 的 RNN 构建一个用于二进制分类的深度学习网络。

这是我尝试使用 python 的方法

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.layers import Embedding
from keras.layers import LSTM
import numpy as np

train = np.loadtxt("TrainDatasetFinal.txt", delimiter=",")
test = np.loadtxt("testDatasetFinal.txt", delimiter=",")

y_train = train[:,7]
y_test = test[:,7]

train_spec = train[:,6]
test_spec = test[:,6]


model = Sequential()
model.add(Embedding(8, 256, input_length=1))
model.add(LSTM(output_dim=128, activation='sigmoid',
               inner_activation='hard_sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='rmsprop')

model.fit(train_spec, y_train, batch_size=2000, nb_epoch=11)
score = model.evaluate(test_spec, y_test, batch_size=2000)

这是数据集中的一个样本

(患者编号,毫秒时间,加速度计 x 轴,y 轴, z轴,幅度,频谱图,标签(0或1))

1,15,70,39,-970,947321,596768455815000,0
1,31,70,39,-970,947321,612882670787000,0
1,46,60,49,-960,927601,602179976392000,0
1,62,60,49,-960,927601,808020878060000,0
1,78,50,39,-960,925621,726154800929000,0

我相信我的问题在这些行中,但我无法识别错误

model.add(Embedding(8, 256, input_length=1))
model.add(LSTM(output_dim=128, activation='sigmoid',
               inner_activation='hard_sigmoid'))

这是我遇到的错误

InvalidArgumentError (see above for traceback): indices[0,0] = -2147483648 is not in [0, 8)

【问题讨论】:

    标签: python-3.x deep-learning lstm rnn


    【解决方案1】:

    上面提供的数据集中的样本是您尝试输入模型的数据吗?如果是这样,就会出现问题,因为您的数据是二维的,但对于 RNN,您需要一个 3 维输入张量。您需要一个特征维度、一个批量大小维度和一个时间维度。看起来您缺少适当的时间维度。您不应该有一个 15, 31, 46,...(以毫秒为单位的时间)的列,这应该形成自己的维度,因此您的输入数据看起来像一个“立方体”。否则,您根本不需要时间模型。此外,你应该标准化你的输入,因为你的特征有很大不同的数量级。此外,2000 的批大小几乎可以肯定是太大了。你是想表达你的整个训练集有 2000 个样本吗?在这种情况下,您正在构建的模型可能没有足够的训练数据。

    【讨论】:

    • 是的,我正在使用的数据集已输入到模型中,但并非所有数据集,我只是输入了频谱图列和标签
    • 我使用了 2000 个样本,因为火车样本总数为 1,415,684
    • 如何标准化输入
    • 那么,你的输入只有一个输入特征(频谱图)和一个二进制输出特征?但是,您的模型不期望 8 个输入吗?我有一段时间没有使用 Keras,但可能设置了 Embedding(1,256,...),而不是 Embedding(8,256,...)?如果您想将其建模为时间序列,您可能仍需要将其切成时间片,例如长度为 100,因此您的维度是特征 = 1、批量大小 = 2000、时间 = 100。标准化输入意味着您减去均值并除以标准差,因此您的列均具有均值 0 和标准差 1。这提高了学习能力。
    • 是的,输入特征是频谱图,输出标签是(0或1)
    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2016-04-12
    • 2019-01-14
    • 2018-10-01
    • 2017-11-07
    • 2021-05-02
    相关资源
    最近更新 更多