#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:]))