Как заставить нейронную сеть работать с sklearn CountVectorizer в python?

#python #machine-learning #neural-network #sequential #countvectorizer

#python #машинное обучение #нейронная сеть #последовательный #countvectorizer

Вопрос:

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

 ValueError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:805 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:795 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1259 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:788 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:754 train_step
        y_pred = self(x, training=True)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py:998 __call__
        input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/input_spec.py:259 assert_input_compatibility
        ' but received input with shape '   display_shape(x.shape))

    ValueError: Input 0 of layer sequential_2 is incompatible with the layer: expected axis -1 of input shape to have value 200 but received input with shape (None, 3386)
 

Странно то, что какое-то время он работал с небольшим обучающим набором (видел сводку всех эпох, и выполнение было в порядке), а затем, когда я перешел на фактический больший обучающий набор, я получаю эту ошибку. И я получил это в первый раз, когда попробовал с первым обучающим набором, но потом каким-то образом это сработало.

Сначала я получил эту ошибку:

 
InvalidArgumentError: indices[2] = [0,1540] is out of order. Many sparse ops require sorted indices.
    Use `tf.sparse.reorder` to create a correctly ordered copy.

 [Op:SerializeManySparse]
 

затем я добавил .toarray() к своим входным данным и с тех пор получаю приведенное выше (с axis =-1)

Мой X_train является результатом функции CountVectorizer (возвращает матрицу csr). Я пробовал различные другие подходы, такие как изменение формы или преобразование в SparseTensor, но я все еще получаю эту ошибку.

И результат X_train.shape (200, 3386) — not (None, 3386), как указано в ошибке.

Я оставлю вам некоторый код с тем, как я получаю векторы ввода / вывода и модель

 #prepare training data
X_train_raw = df_train.msg.values
X_train_clean = np.asarray(preprocess(X_train_raw))
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(X_train_clean).toarray()
Y_train = df_train.drop(['id'],axis=1).drop(['msg'],axis=1).values

.........

model = Sequential()
model.add(layers.Dense(16, input_dim=200, activation='relu'))
model.add(layers.Dense(6, activation='relu'))
model.add(layers.Dense(2))

model.compile(loss='mse', 
 optimizer='adam',
 metrics=['mae'])


model.fit(X_train, Y_train, epochs=1000, verbose=2)
predicted_validation = model.predict(X_validation)
mse_value, mae_value = model.evaluate(X_validation, Y_validation, verbose=0)
test_loss, test_metrics= model.evaluate(X_validation, Y_validation, verbose=0)

print('test loss', test_loss)
print('test metrics', test_metrics)

predicted_scores_test = model.predict(X_test)
 

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

Спасибо!

Ответ №1:

В вашем первом слое вы должны указать input_dim=3386 : это количество объектов, которыми обладают ваши данные. Или, что еще лучше, поскольку разные наборы данных в будут содержать разное количество слов в CountVectorizer , используйте input_dim=len(vectorizer.vocabulary_) , чтобы вам не приходилось менять его всякий раз, когда вы меняете свои данные.

И результат X_train.shape (200, 3386) — not (None, 3386), как указано в ошибке.

200 As первое измерение вашего ввода заменяется на None , потому что форма, видимая сетью, будет зависеть от того, как вы пакуете образцы для обучения.