Ошибка значения: Фигуры (Нет, 2) и (Нет, 3) несовместимы

#python #keras #deep-learning #neural-network

Вопрос:

Итак, это код, который я пытаюсь запустить

 from sklearn.datasets import make_blobs
from tensorflow.keras.utils import to_categorical
from keras.layers import *
from keras import metrics 
from tensorflow.keras.optimizers import SGD
from keras.models import Sequential
from keras.layers import Dense
import numpy as np


def prepa ():
X, y = make_blobs(n_samples=1000,centers=3, n_features=2,random_state=2)

testX=X[:499]
trainX=X[500:999]
testy=y[:499]
trainy=y[500:999]

return trainX,trainy,testX,testy


trainX, testX, trainy,testy=prepa()


#define the model
model = Sequential()  # Création d'un réseau de neurones vide 
model.add(Dense(50,input_dim=2,activation="relu",kernel_initializer='he_uniform'))
model.add(Dense(3,activation="Softmax"))

#compile the model
opt = SGD(learning_rate=0.001)
model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

fit the model 
history=model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)
 

Но я получаю эту ошибку:

Обратная трассировка ошибки значения (последний последний вызов)

в () 1 #соответствует модели —-> 2 история=модель.подходит(trainX, trainy, validation_data=(TestX, testy), эпохи=200, подробно=0)

9 кадров

/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py в оболочке(*args, **kwargs) 992, за исключением исключения, как e: # pylint:отключить=широко-за исключением 993, если hasattr(e, «ag_error_metadata»): —> 994 поднять e.ag_error_metadata.to_exception(e) 995 еще: 996 поднять

Ошибка значения: в коде пользователя:

 /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:853 train_function  *
    return step_function(self, iterator)
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:842 step_function  **
    outputs = model.distribute_strategy.run(run_step, args=(data,))
/usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1286 run
    return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2849 call_for_each_replica
    return self._call_for_each_replica(fn, args, kwargs)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3632 _call_for_each_replica
    return fn(*args, **kwargs)
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:835 run_step  **
    outputs = model.train_step(data)
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:789 train_step
    y, y_pred, sample_weight, regularization_losses=self.losses)
/usr/local/lib/python3.7/dist-packages/keras/engine/compile_utils.py:201 __call__
    loss_value = loss_obj(y_t, y_p, sample_weight=sw)
/usr/local/lib/python3.7/dist-packages/keras/losses.py:141 __call__
    losses = call_fn(y_true, y_pred)
/usr/local/lib/python3.7/dist-packages/keras/losses.py:245 call  **
    return ag_fn(y_true, y_pred, **self._fn_kwargs)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper
    return target(*args, **kwargs)
/usr/local/lib/python3.7/dist-packages/keras/losses.py:1666 categorical_crossentropy
    y_true, y_pred, from_logits=from_logits, axis=axis)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper
    return target(*args, **kwargs)
/usr/local/lib/python3.7/dist-packages/keras/backend.py:4839 categorical_crossentropy
    target.shape.assert_is_compatible_with(output.shape)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/tensor_shape.py:1161 assert_is_compatible_with
    raise ValueError("Shapes %s and %s are incompatible" % (self, other))

ValueError: Shapes (None, 2) and (None, 3) are incompatible
 

Ответ №1:

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

Итак, когда я проверил, форма testX (501,) -это то, что должно быть (501,2) , и это происходит потому testX , что назначается trainy в вашем коде.

Заменять

 trainX,testX,trainy,testy = prepa()
 

с

 trainX,trainy,testX,testy = prepa()
 

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


Кроме того, вы должны использовать следующую prepa() функцию индексирования в, чтобы получить весь набор данных.

 testX = X[:499]
trainX = X[499:]
testy = y[:499]
trainy = y[499:]