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

#python #numpy #tensorflow #keras #deep-learning

Вопрос:

Я работаю над CNN, но я продолжаю сталкиваться с этой ошибкой:

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

Мои y_train и y_test являются одним горячим закодированным, но это не оказывает никакого влияния.

Есть какие-нибудь советы?

 import numpy as np
from numpy import random
import tensorflow as tf
from tensorflow.keras.models import Sequential
#from tensorflow.keras.utils import to_categorical
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D
import pickle
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.optimizers import RMSprop
import matplotlib.pyplot as plt
import cv2
import os

X_train = pickle.load(open("X_train.pickle","rb"))
y_train = pickle.load(open("y_train.pickle","rb"))
#y_train = np.array(y_train)
y_train = tf.keras.utils.to_categorical(y_train, num_classes=3)

X_test = pickle.load(open("X_test.pickle","rb"))
y_test = pickle.load(open("y_test.pickle","rb"))
#y_test = np.array(y_test)
y_test = tf.keras.utils.to_categorical(y_train, num_classes=3)

model = Sequential()

model.add(Dense(64, activation='relu',input_shape = X_train.shape[1:]))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(loss="categorical_crossentropy", 
              optimizer=sgd,
              metrics=["accuracy"])

model.fit(X_train, y_train,
         epochs=2000,
         batch_size=128,
         validation_split = 0.1)
 

Комментарии:

1. Обратите внимание: у вас y_test = tf.keras.utils.to_categorical(y_train, num_classes=3) вместо y_test = tf.keras.utils.to_categorical(y_test, num_classes=3)

2. Кроме (None, 3) того, это имеет смысл , поскольку ваша сеть имеет Dense(3) последний уровень, поэтому проблема в y_train том, какова ее форма и характер ее содержимого? Другими словами, откуда 30, 30 они берутся?

3. Быстрое решение может заключаться в том, чтобы преобразовать ваш (None, 3) массив в (None, 1, 1, 3) массив.

4. Вероятно, входная форма ( X_train.shape ) не является 2D-массивом, как (n_samples, n_features). И у него ранг > 2, что-то вроде (n_samples, 30,30). Таким образом, вы получаете другое измерение на выходе. Если это так, то модель должна добавить Flatten слой в качестве первого слоя, например: model.add(Flatten(input_shape = X_train.shape[1:]))