длина разреженной матрицы неоднозначна - PullRequest
1 голос
/ 11 марта 2019

Я очень плохо знаком с машинным обучением, поэтому этот вопрос может показаться глупым. Я следую учебнику по классификации текста , но я сталкиваюсь с ошибкой, которую не имею понятия о том, как ее решить.

Это код, который у меня есть (в основном это то, что находится в учебнике)

import pandas as pd

filepath_dict = {'yelp':   'data/yelp_labelled.txt',
              'amazon': 'data/amazon_cells_labelled.txt',
              'imdb':   'data/imdb_labelled.txt'}

df_list = []
for source, filepath in filepath_dict.items():
df = pd.read_csv(filepath, names=['sentence', 'label'], sep='\t')
df['source'] = source  
df_list.append(df)

df = pd.concat(df_list)
print(df.iloc[0:4])


from sklearn.feature_extraction.text import CountVectorizer

df_yelp = df[df['source'] == 'yelp']

sentences = df_yelp['sentence'].values
y = df_yelp['label'].values

from sklearn.model_selection import train_test_split
sentences_train, sentences_test, y_train, y_test = train_test_split(sentences, y, test_size=0.25, random_state=1000)


from sklearn.feature_extraction.text import CountVectorizer


vectorizer = CountVectorizer()
vectorizer.fit(sentences_train)

X_train = vectorizer.transform(sentences_train)
X_test  = vectorizer.transform(sentences_test)

from keras.models import Sequential
from keras import layers

input_dim = X_train.shape[1] 

model = Sequential()
model.add(layers.Dense(10, input_dim=input_dim, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

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

history = model.fit(X_train, y_train,
nb_epoch=100,
verbose=False,
validation_data=(X_test, y_test),
batch_size=10)

Когда я достигаю последней строки, я получаю сообщение об ошибке

"Ошибка типа: разреженная длина матрицы неоднозначна; используйте getnnz () или shape [0]"

Полагаю, мне придется выполнить какое-то преобразование данных, которые я использую, или попытаться загрузить эти данные другим способом. Я уже пытался искать в Stackoverflow, но, будучи новичком во всем этом, я не смог найти ничего полезного.

Как мне сделать эту работу? В идеале я хотел бы получить не только решение, но и краткое объяснение того, почему произошла ошибка и что решение делает для ее устранения.

спасибо!

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Причина, по которой вы сталкиваетесь с этой трудностью, заключается в том, что ваши X_train и X_test относятся к типу <class scipy.sparse.csr.csr_matrix>, тогда как ваша модель ожидает, что это будет пустой массив.

Попробуйте привести их к плотному иты в порядке, чтобы пойти:

X_train = X_train.todense()
X_test = X_test.todense()
1 голос
/ 11 марта 2019

Не уверен, почему вы получаете ошибку для этого скрипта.

Следующий скрипт работает нормально;даже с разреженной матрицей.Может быть, попробовать в вашей машине.

sentences = ['i want to test this','let us try this',
             'would this work','how about this',
             'even this','this should not work']
y= [0,0,0,0,0,1]
from sklearn.model_selection import train_test_split
sentences_train, sentences_test, y_train, y_test = train_test_split(sentences, y, test_size=0.25, random_state=1000)


from sklearn.feature_extraction.text import CountVectorizer


vectorizer = CountVectorizer()
vectorizer.fit(sentences_train)

X_train = vectorizer.transform(sentences_train)
X_test  = vectorizer.transform(sentences_test)

from keras.models import Sequential
from keras import layers

input_dim = X_train.shape[1] 

model = Sequential()
model.add(layers.Dense(10, input_dim=input_dim, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

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

model.fit(X_train, y_train,
                        epochs=2,
                        verbose=True,
                        validation_data=(X_test, y_test),
                        batch_size=2)

#
Layer (type)                 Output Shape              Param #   
=================================================================
dense_5 (Dense)              (None, 10)                110       
_________________________________________________________________
dense_6 (Dense)              (None, 1)                 11        
=================================================================
Total params: 121
Trainable params: 121
Non-trainable params: 0
_________________________________________________________________
Train on 4 samples, validate on 2 samples
Epoch 1/2
4/4 [==============================] - 1s 169ms/step - loss: 0.7570 - acc: 0.2500 - val_loss: 0.6358 - val_acc: 1.0000
Epoch 2/2
4/4 [==============================] - 0s 3ms/step - loss: 0.7509 - acc: 0.2500 - val_loss: 0.6328 - val_acc: 1.0000
...