python - 使用 Keras 进行多类图像识别
问题描述
我正在尝试建立一个识别 21 个类的网络。
数据位于 Uc-merced.zip
这是代码:
# import
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential, Model
from keras.layers import Conv2D, MaxPooling2D, Activation, Dropout, Flatten, Dense, GlobalAveragePooling2D
from keras import backend as K
from keras import applications
from keras import optimizers
from keras import utils
我正在使用 Google Colab
%cd /content/drive/My Drive/
! unzip -q -n UCMerced_LandUse.zip
! echo 'Training folder content'
! ls -l ./UCMerced_LandUse/train/
! echo 'Validation folder content'
! ls -l ./UCMerced_LandUse/validation/
train_data_dir = 'UCMerced_LandUse/train/'
val_data_dir = 'UCMerced_LandUse/validation/'
### DATA GENERATOR
# get data from the folder, perform the preprocessing and the data augmentation,
# and arranges them in batches
# dimensions of our images
img_width, img_height = 256, 256
batch_size = 5
nb_train_samples = 1493
nb_val_samples = 622
# this is the preprocessing configuration we will use for training
train_datagen = ImageDataGenerator(
rescale=1. / 255, # rescale
shear_range=0.2, # on-th-fly data augmentation
zoom_range=0.2, # on-th-fly data augmentation
horizontal_flip=True) # on-th-fly data augmentation
# this is the preprocessing configuration we will use for validation:
# rescaling only
val_datagen = ImageDataGenerator(rescale=1. / 255)
print('Training set generator:')
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical'
)
print('Validation set generator:')
val_generator = val_datagen.flow_from_directory(
val_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical')
这是输出:
Training set generator:
Found 1493 images belonging to 21 classes.
Validation set generator:
Found 622 images belonging to 21 classes.
# Inception V3 with pre-trained weights
base_model = applications.InceptionV3(weights='imagenet', include_top=False,input_shape=(256,256,3),classes=21)
train_after_layer =50 #
### CHANGE THE TOP MODEL BLOCK
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(21, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=x)
# set the first K layers (up to the last conv block)
# to non-trainable (weights will not change during training)
for layer in model.layers[:train_after_layer]:
layer.trainable = False
# compile the model with a SGD/momentum optimizer
# and a very slow learning rate.
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
metrics=['accuracy'])
epochs_fine = 50
history=model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs_fine,
validation_data=val_generator,
validation_steps=nb_val_samples // batch_size)
model.save_weights('prova.h5')
结果似乎很神,在 50epoch 结束时,结果如下:
损失:0.0866 - 准确度:0.9845 - val_loss:0.6575 - val_accuracy:0.9028
from keras.preprocessing import image
import os
model.load_weights('prova.h5')
path = '/content/drive/My Drive/UCMerced_LandUse/validation/airplane'
dirs = os.listdir( path )
print(train_generator.class_indices)
for file in dirs:
print(file)
string=os.path.join(path,file)
img_pred=image.load_img(string,target_size=(256,256,3))
img_pred=image.img_to_array(img_pred)
img_pred=np.expand_dims(img_pred,axis=0)
array=model.predict(img_pred)
y_classes = array.argmax(axis=-1)
print(y_classes)
这是输出:
{'agricultural': 0, 'airplane': 1, 'baseballdiamond': 2, 'beach': 3, 'buildings': 4, 'chaparral': 5, 'denseresidential': 6, 'forest': 7, 'freeway': 8, 'golfcourse': 9, 'harbor': 10, 'intersection': 11, 'mediumresidential': 12, 'mobilehomepark': 13, 'overpass': 14, 'parkinglot': 15, 'river': 16, 'runway': 17, 'sparseresidential': 18, 'storagetanks': 19, 'tenniscourt': 20}
airplane71.tif
[3]
airplane72.tif
[16]
airplane73.tif
[2]
airplane74.tif
[16]
airplane75.tif
[2]
airplane76.tif
[2]
airplane77.tif
[16]
airplane78.tif
[2]
airplane79.tif
[2]
airplane80.tif
val_accuracy 是 90%,但没有人预测是正确的。这对每个班级都是一样的。
解决方案
[0,1]
您忘记在预测时将图像重新缩放到范围内。255
在测试时将图像除以。您必须这样做,因为您rescale=1. / 255,
在ImageDataGenerator
.
推荐阅读
- python - 具有默认值但没有类型注释的函数参数的推断类型是什么?初始化为“无”的变量怎么样?
- android - Android - 将我的图标添加到顶部的系统区域(不是通知)
- xamarin - 在 Visual Studio 2019 上运行 Android 模拟器时出错
- delphi - 在 wan 中移动目录的最佳方法是什么?
- linux - linux查找文件绝对路径问题
- google-cloud-platform - GCP 问题 GKE HPA 无法读取指标值
- symfony - 如何在任何类中注入 EntityManagerInterface(特别是命令助手)
- python - 从列表理解中的列表中仅删除一次
- javascript - Javascript;删除 HTML 中没有对应的特定图像
- python-3.x - 如何在 Bokeh 1.1.0 的次要代码中显示值