У меня есть следующий код для проблемы классификации изображений.И я продолжаю сталкиваться с этой ошибкой:
ValueError: Error when checking input: expected flatten_1_input to have shape (4, 4, 512) but got array with shape (128, 128, 3)
Я видел подобную проблему с кем-то, кто убил их процесс загрузки модели, но я не делаю этого.Вот мой код:
def save_bottlebeck_features():`
datagen = ImageDataGenerator(rescale=1. / 255)
# build the VGG16 network
model = applications.VGG16(include_top=False, weights='imagenet')
generator = datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode=None,
shuffle=False)
bottleneck_features_train = model.predict_generator(
generator, nb_train_samples // batch_size)
np.save('bottleneck_features_train.npy', bottleneck_features_train)
generator = datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode=None,
shuffle=False)
bottleneck_features_validation = model.predict_generator(
generator, nb_validation_samples // batch_size)
np.save('bottleneck_features_validation.npy',bottleneck_features_validation)
def train_top_model():
train_data = np.load('bottleneck_features_train.npy',"r+")
train_labels = np.array([0] * (nb_train_samples // 2) + [1] * (nb_train_samples // 2))
validation_data = np.load('bottleneck_features_validation.npy',"r+")
validation_labels = np.array([0] * (nb_validation_samples // 2) + [1] * (nb_validation_samples // 2))
model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_data, train_labels,
epochs=epochs,
batch_size=batch_size,
validation_data=(validation_data, validation_labels))
model.save_weights(top_model_weights_path)
model.save('my_model.model')
save_bottlebeck_features()
train_top_model()
from keras.preprocessing import image
import numpy as np
from keras.models import load_model
import os
resnet_50 = load_model("my_model.model")
TEST_DIR = 'test/'
with open('better_score.csv','w') as f:
f.write('Id,Expected\n')
for x in range(1,7091):
mystr = "test_" + str(x) +".jpg"
path = os.path.join(TEST_DIR, mystr)
if (os.path.exists(path)):
img = image.load_img(path, target_size=(128, 128))
img = image.img_to_array(img)
img = np.expand_dims(img, axis=0)
model_out = resnet_50.predict(img/255)
f.write('{},{}\n'.format(mystr, model_out[0][0]))
Я напечатал форму train_data
, и это (2000, 4, 4, 512)
, а validation_data
- (800, 4, 4, 512)
.Я могу тренировать свою модель и сохранить ее.Проблема возникает, когда я добираюсь до последней строки, когда пытаюсь вывести результаты в файл csv.