1

我对神经网络很陌生,对它没有太多经验。我的问题如下:我有一个数组,877 个不同的数据点,每个数据点有 200 个特征。它是一个 PCA 简化的 TfIdf 矩阵,其中每一行对应于我的数据集中的一个文本块(例如一个段落本身)。我正在尝试为此数据(1 类或 0 类)创建一个二元分类器。我已经成功地使用线性 SVM 获得了 80% 的中低准确度,使用简单的 Dense NN 获得了大约 80% 的准确度,如下所示:

model = Sequential()
    len = np.shape(X_train)[0]
    dim = np.shape(X_train)[1]
    model.add(Dense(100, input_dim=dim, activation='relu'))
    model.add(Dense(25, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
    #set up stopping
    early_stopping = EarlyStopping(monitor='val_loss', patience=4, mode='auto')
    #fit the model to the data
    model.fit(X_train, y_train,epochs=500, batch_size=64,verbose = 1, validation_data =(X_test,y_test),callbacks = [early_stopping])

所以我发现 RNN 在自然语言处理中非常受欢迎。我尝试以大致相同的方式设置一个。但是,我知道我的数据应该有第三维。我很困惑这是如何工作的。我根据这个问题编写了代码:LSTM with keras this asker does not have 3 dimension in his data。他的作品究竟如何​​仅使用 2 个维度?我的代码如下:

model = Sequential()
    len = np.shape(X_train)[0]
    dim = np.shape(X_train)[1]
    model.add(LSTM(output_dim = 100, input_length=len, input_dim = dim, return_sequences=True))
    model.add(Dense(25, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
    #set up stopping
    early_stopping = EarlyStopping(monitor='val_loss', patience=4, mode='auto')
    #fit the model to the data
    model.fit(X_train, y_train,epochs=500, batch_size=64,verbose = 1, validation_data =(X_test,y_test),callbacks = [early_stopping])

有人可以解释一下这有何不同以及为什么我不断收到此错误:ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (877, 200)

我真的需要第三维吗?如果是这样,我应该如何将我的 2D(数据点,特征)数组转换为 3D?谢谢你的时间。

- - - - - - - - - - - - - - 编辑 - - - - - - - - - - - -------------

所以现在我已经将我的代码更改为:

 X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
    t_steps = np.shape(X_train)[1]
    dim = np.shape(X_train)[2]
    print(length,',',dim)
    model.add(LSTM(output_dim = 100, input_shape = (t_steps,dim), return_sequences=True))

并收到以下错误(t_steps == 1 和 dim == 200)

ValueError: Error when checking target: expected dense_2 to have 3 dimensions, but got array with shape (877, 1)

不知道从这里去哪里。

----------------------------------------编辑#2-------------------- ---------------

事实证明,如果我设置return_sequences = False它有效。现在我的准确率是可怕的,47%。

4

1 回答 1

0

RNN 的三个维度通常是[num_samples, max_timesteps, num_features][max_timesteps, num_samples, num_features](例如,参见tf.nn.dynamic_rnn)。

你的代码中可能有X[num_data_points, num_features]。这不是 LSTM 层所期望的,因为没有时间轴。

我建议你在使用 Keras 的 IMDB 情感分类任务上查看 LSTM,了解如何使用 LSTM 处理句子。

于 2017-08-02T17:06:03.247 回答