Ошибка при проверке ввода: ожидалось, что conv2d_4_input будет иметь форму (100, 100, 1), но получил массив с формой (100, 100, 3)

#python #arrays #image #tensorflow #np

Вопрос:

Я получаю следующую ошибку, когда пытаюсь запустить свою модель обнаружения рака кожи. У меня есть набор изображений, хранящихся в папке train, которые я использовал для обучения своей модели.

 import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout,Activation,Flatten,Conv2D,MaxPooling2D
from tensorflow.keras.constraints import max_norm
from tensorflow.keras.callbacks import ReduceLROnPlateau
from tensorflow.keras.layers import LeakyReLU
from tensorflow.keras.optimizers import Adam
opt=Adam(learning_rate=0.0005)

epochs = 40
batch_size = 128
X=np.asarray(X)
y=np.asarray(y)
cvscores = []
for train, test in kfold.split(X, y):
print(train)

model = Sequential()
model.add(Conv2D(256, (3, 3), input_shape=(100,100,1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(tf.keras.layers.Dropout(0.1))

model.add(Conv2D(256, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(tf.keras.layers.Dropout(0.1))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors

model.add(Dense(128,kernel_initializer='normal'))
model.add(Activation('relu'))
model.add(tf.keras.layers.Dropout(0.1))

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])






model.fit(X, y, validation_split=0.3,epochs= epochs, batch_size= batch_size, verbose=0)

scores = model.evaluate(X[test], y[test], verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
cvscores.append(scores[1] * 100)
tf.keras.backend.clear_session()

del model

print("%.2f%% ( /- %.2f%%)" % (np.mean(cvscores), np.std(cvscores)))
 

введите описание изображения здесь

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

1. Похоже, вы ожидаете изображение в оттенках серого (1-канальное), но ваш набор данных содержит цветные (3-канальные) изображения. Посмотрите на tf.image.rgb_to_grayscale

Ответ №1:

Изображение, которое у вас есть в наборах данных, имеет 3 канала (размер 100x100x3), но ваша модель принимает в качестве входных данных изображения размером 100x100x1. Измените форму ввода на 100,100,3, чтобы избежать ошибки:

 model.add(Conv2D(256, (3, 3), input_shape=(100,100,3)))
 

вместо:

 model.add(Conv2D(256, (3, 3), input_shape=(100,100,1)))
 

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

1. я изменил код для model.add(Conv2D(256, (3, 3), input_shape=(100,100,3))) и теперь я получаю следующую ошибку: Ошибка значения: Тензор(«Pow:0», форма=(), dtype=float32) должен быть из того же графика, что и тензор(«conv2d/ядро:0», форма= (), dtype=ресурс) (графики <объект tensorflow.python.framework.ops.Graph в 0x7f7bf9e4f750> и <объект tensorflow.python.framework.ops.Graph в 0x7f7bf9e4f750><объект tensorflow.python.framework.ops.Graph в 0x7f7b9b9c7390>).