#python #validation #machine-learning #keras #prediction
#python #проверка #машинное обучение #keras #прогнозирование
Вопрос:
Я написал следующую модель в Keras, но при выполнении прогнозов я сталкиваюсь с ошибкой значения. Я просмотрел другие вопросы по StackOverflow, но не смог точно связать их с моим кодом.
Моя обучающая модель выглядит следующим образом:
#building the CNN model
cnn = Sequential()
kernelSize = (3, 3)
ip_activation = 'relu'
ip_conv_0 = Conv2D(filters=32, kernel_size=kernelSize, input_shape=im_shape, activation=ip_activation)
cnn.add(ip_conv_0)
# Add the next Convolutional Activation layer
ip_conv_0_1 = Conv2D(filters=64, kernel_size=kernelSize, activation='relu')
cnn.add(ip_conv_0_1)
# Add the Pooling layer
pool_0 = MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding="same")
cnn.add(pool_0)
ip_conv_1 = Conv2D(filters=64, kernel_size=kernelSize, activation='relu')
cnn.add(ip_conv_1)
ip_conv_1_1 = Conv2D(filters=64, kernel_size=kernelSize, activation='relu')
cnn.add(ip_conv_1_1)
pool_1 = MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding="same")
cnn.add(pool_1)
# Let's deactivate around 20% of neurons randomly for training
drop_layer_0 = Dropout(0.2)
cnn.add(drop_layer_0)
flat_layer_0 = Flatten()
cnn.add(Flatten())
# Now add the Dense layers
h_dense_0 = Dense(units=128, activation='relu', kernel_initializer='uniform')
cnn.add(h_dense_0)
# Let's add one more before proceeding to the output layer
h_dense_1 = Dense(units=64, activation='relu', kernel_initializer='uniform')
cnn.add(h_dense_1)
op_activation = 'softmax'
output_layer = Dense(units=n_classes, activation='softmax', kernel_initializer='uniform')
cnn.add(output_layer)
opt = 'adam'
loss = 'categorical_crossentropy'
metrics = ['accuracy']
# Compile the classifier using the configuration we want
cnn.compile(optimizer=opt, loss=loss, metrics=metrics)
cnn_summary = cnn.summary()
history = cnn.fit(x_train, y_train,
batch_size=40, epochs=20,
validation_data=(x_test, y_test)
)
Я пытаюсь предсказать, используя следующий код в другом файле .py:
import numpy as np
from keras.preprocessing import image
from keras.models import load_model
model=load_model('trained_model.h5')
test_image = image.load_img('131.png', target_size=(32,32))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
pre = model.predict(test_image)
Но проблема в том, что я получаю ошибку значения как:
ValueError: Input 0 of layer sequential_1 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [None, 32, 32, 3]
Итак, кто-нибудь может помочь мне с этой ошибкой?
Ответ №1:
В основном это говорит о том, что ваш первый слой ожидает форму (32, 32, 1)
ip_conv_0 = Conv2D(filters=32, kernel_size=kernelSize, input_shape=im_shape, activation=ip_activation)
итак, im_shape=(32,32,1)
здесь, но вместо этого при прогнозировании он получает 3-канальное изображение с формой (32,32,3)
.
Я думаю, что вы обучили свою сеть изображениям в оттенках серого и пытаетесь делать выводы с цветными изображениями (RGB), что не соответствует построенной вами сетевой модели. Что вы можете сделать, так это либо обучить свою модель изображениям формы (32,32,3)
, что, по моему мнению, не вариант, либо вы можете сделать свое RGB (цветное) изображение в оттенках серого таким образом, чтобы ваше изображение имело форму (32,32,1)
, тогда вы можете сделать вывод с помощью своей модели.