我使用countvector来获取评论中每个单词的向量,并将其作为神经网络的输入数据。然而,总是会出现一些问题。以下是代码和错误信息:
train_X = vectorizer.transform(train_dataframe['comment'])valid_X = vectorizer.transform(valid_dataframe['comment'])test_X = vectorizer.transform(test_dataframe['comment'])print (train_X.shape)print (valid_X.shape)print (test_X.shape)train_Y = train_dataframe['label'].to_numpy()valid_Y = valid_dataframe['label'].to_numpy()train_inputs=train_Xtrain_targets=train_Yvalidation_inputs=valid_Xvalidation_targets=valid_Y# 设置输入和输出大小input_size = 31124output_size = 1# 两个隐藏层使用相同的大小。这不是必须的。hidden_layer_size = 50# 定义模型结构model = tf.keras.Sequential([ # tf.keras.layers.Dense 基本上实现了:output = activation(dot(input, weight) + bias) # 它接受多个参数,但对我们来说最重要的参数是hidden_layer_size和激活函数 tf.keras.layers.Dense(hidden_layer_size, activation='relu'), # 第一个隐藏层 tf.keras.layers.Dense(hidden_layer_size, activation='relu'), # 第二个隐藏层 # 最后一层没有区别,我们只需要确保使用softmax激活 tf.keras.layers.Dense(output_size, activation='sigmoid') # 输出层])model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])### 训练# 这是我们训练构建的模型的地方。# 设置批次大小batch_size = 100# 设置最大训练轮数max_epochs = 100# 拟合模型# 请注意,这次训练、验证和测试数据不是可迭代的model.fit(train_inputs, # 训练输入 train_targets, # 训练目标 batch_size=batch_size, # 批次大小 epochs=max_epochs, # 我们将训练的轮数(假设提前停止不会生效) validation_data=(validation_inputs, validation_targets), # 验证数据 verbose = 2 # 确保我们得到足够的训练过程信息 ) test_loss, test_accuracy = model.evaluate(test_inputs, test_targets)print('\n测试损失: {0:.2f}. 测试准确率: {1:.2f}%'.format(test_loss, test_accuracy*100.))
错误信息如下:
请提供一个单一数组或数组列表作为模型输入。你传递了:x= (0, 1404) 1 (0, 4453) 2 (0, 6653) 1 (0, 8151) 1 (0, 11070) 1 (0, 14557) 1 (1, 817) 1 (1, 1134) 1 (1, 1813) 1 (1, 1827) 1 (1, 2151) 1 (1, 4505) 1 (1, 4647) 1 (1, 8244) 2 (1, 8296) 1 (1, 8332) 1 (1, 9109) 1 (1, 9611) 1 (1, 10080) 1 (1, 10791) 1 (1, 11821) 1 (1, 12714) 1 (1, 12760) 1 (1, 13665) 1 (1, 14349) 1 : : (42423, 16238) 1 (42423, 17253) 1 (42423, 18627) 1 (42423, 19322) 1 (42423, 19811) 1 (42423, 21232) 1 (42423, 23128) 1 (42423, 25572) 1 (42423, 25681) 1 (42423, 27132) 1 (42423, 27568) 2 (42423, 27580) 1 (42423, 27933) 1 (42423, 30921) 2 (42424, 932) 1 (42424, 4078) 1 (42424, 10791) 1 (42424, 10835) 1 (42424, 27628) 1 (42424, 27933) 1 (42424, 30220) 1 (42425, 1813) 1 (42425, 13868) 1 (42425, 27580) 1 (42425, 28749) 1
回答:
train_inputs
是调用 sklearn.feature_extraction.text.CountVectorizer.transform
后生成的 scipy.sparse.csr.csr_matrix
类型的稀疏矩阵,具体文档见此处:
https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html#sklearn.feature_extraction.text.CountVectorizer.transform
你可以尝试将稀疏矩阵转换为密集矩阵,并使用它作为训练的输入:
model.fit(train_inputs.toarray().astype(float), ...)
不过,这种方法在大数据集上可能会导致内存问题。如果你需要更复杂的方法,可以在这里找到如何在Keras中正确处理稀疏矩阵的更多信息:在Keras和TensorFlow中使用稀疏矩阵