我编写了以下代码用于识别图像。
# Importing the Keras libraries and packagesfrom keras.models import Sequentialfrom keras.layers import Conv2Dfrom keras.layers import MaxPooling2Dfrom keras.layers import Flattenfrom keras.layers import Dense# Initialising the CNNclassifier = Sequential()# Step 1 - Convolutionclassifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))# Step 2 - Poolingclassifier.add(MaxPooling2D(pool_size = (2, 2)))# Adding a second convolutional layerclassifier.add(Conv2D(32, (3, 3), activation = 'relu'))classifier.add(MaxPooling2D(pool_size = (2, 2)))# Step 3 - Flatteningclassifier.add(Flatten())# Step 4 - Full connectionclassifier.add(Dense(units = 128, activation = 'relu'))classifier.add(Dense(units = 1, activation = 'sigmoid'))# Compiling the CNNclassifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])# Part 2 - Fitting the CNN to the imagesfrom keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,zoom_range = 0.2,horizontal_flip = True)test_datagen = ImageDataGenerator(rescale = 1./255)training_set = train_datagen.flow_from_directory('E:\\ML_R&D\\training_set\\cats1',target_size = (64, 64),batch_size = 32,class_mode = 'binary')test_set = test_datagen.flow_from_directory('E:\\ML_R&D\\test_set\\cats1',target_size = (64, 64),batch_size = 32,class_mode = 'binary')classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs = 25,validation_data = test_set,validation_steps = 2000)# Part 3 - Making new predictionsimport numpy as npfrom keras.preprocessing import imagetest_image = image.load_img('E:\\ML_R&D\\cat.jpg', target_size = (64, 64))test_image = image.img_to_array(test_image)test_image = np.expand_dims(test_image, axis = 0)result = classifier.predict(test_image)training_set.class_indicesif result[0][0] == 1: prediction = 'dog'else: prediction = 'cat'
当我运行这段代码时,它可以成功运行而没有任何错误,但等待了几个小时(2小时)后没有任何结果显示。屏幕上只显示以下内容:
Found 0 images belonging to 0 classes.Found 0 images belonging to 0 classes.Epoch 1/25
回答:
问题出在你提供的目录结构上。
training_set = train_datagen.flow_from_directory('E:\\ML_R&D\\training_set\\cats1',target_size = (64, 64),batch_size = 32,class_mode = 'binary')
这里的路径 E:\\ML_R&D\\training_set\\cats1
必须包含子文件夹(代表每个类别),每个子文件夹内应包含属于该类别的图像。
例如
/home/tlokeshkumar/Documents/image_data
是我的数据集所在的位置。
image_data class_1 class_1_1.jpg class_1_2.jpg ... class_2 class_2_1.jpg class_2_2.jpg class_2_3.jpg ... class_3 class_4 ...
如果遵循这种结构,你必须输入主文件夹的路径(image_data
)。
training_set = train_datagen.flow_from_directory('home/tlokeshkumar/Documents/image_data',target_size = (64, 64),batch_size = 32,class_mode = 'binary')
对于快速图像分类,你可以查看我的代码库,其中我使用了Keras编写了一个图像分类器,该分类器使用瓶颈特征来训练,比正常的训练过程快得多。