#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
, потому что форма, видимая сетью, будет зависеть от того, как вы пакуете образцы для обучения.