加载数据
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
training_set = train_datagen.flow_from_directory("E:\\PycharmProjects\\Learning\\dataset\\train",target_size=(50,50),batch_size=32,class_mode="binary")
建立CNN模型
from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Flatten,Dense
model = Sequential()
#卷积层 32个 大小3x3 输入大小 50X50 3通道 激活函数 relu
model.add(Conv2D(32,(3,3),input_shape=(50,50,3),activation="relu"))
#池化层
model.add(MaxPool2D(pool_size=(2,2) ) )
#卷积层
model.add(Conv2D(32,(3,3),activation="relu"))
#池化层
model.add(MaxPool2D(pool_size=(2,2) ) )
#flattening layer
model.add(Flatten())
#FC layer 全连接层
#128个神经元
model.add(Dense(units=128,activation="relu" ) )
model.add(Dense(units=1,activation="sigmoid"))#0/1二分类 用sigmoid
model.compile(optimizer="adam",loss="binary_crossentropy",metrics=['accuracy'])#最后是看训练效果的
model.summary()
训练模型
model.fit_generator(training_set,epochs=25)
训练效果
#模型 训练数据准确率
accuracy = model.evaluate_generator(training_set)
print(accuracy)
[0.011205723509192467, 1.0]
分别为 损失函数值,准确率
# 测试数据准确率
test_set = train_datagen.flow_from_directory("E:\\PycharmProjects\\Learning\\dataset\\validation",target_size=(50,50),batch_size=32,class_mode="binary")
accuracy_test = model.evaluate_generator(test_set)
print(accuracy_test)
[0.8898767232894897, 0.7170000076293945]
CNN训练图像需要很大的数据集
预测单张图片
#查看标签
print(type(training_set),training_set.class_indices)
<class ‘keras.preprocessing.image.DirectoryIterator’> {‘cats’: 0, ‘dogs’: 1}
标签 0是猫 1是狗
from keras.preprocessing.image import load_img,img_to_array
pic_dog = load_img("E:\\PycharmProjects\\Learning\\dataset\\dog_test.jpg",target_size=(50,50))
pic_dog = img_to_array(pic_dog)
pic_dog = pic_dog/255 #维度转换
pic_dog = pic_dog.reshape(1,50,50,3)
result = model.predict_classes(pic_dog)
print(result)
结果 [[1]]
预测 猫的图片
结果 [[0]]
批量预测
import matplotlib as mlp
font2 = {'family':"SimHei",
'weight':'normal',
'size':20}
mlp.rcParams['font.family']='SimHei'
mlp.rcParams['axes.unicode_minus']=False
from matplotlib import pyplot as plt
from keras.preprocessing.image import load_img,img_to_array
a = [ i for i in range(1,10)]
fig = plt.figure(figsize=(10,10))
for i in a:
img_name = "E:\\PycharmProjects\\Learning\\dataset\\validation\\cats\\cat.20"+str(i).zfill(2)+".jpg"
img_ori = load_img(img_name,target_size=(50,50))
img = img_to_array(img_ori)
img = img.astype('float32')/255
img = img.reshape(1,50,50,3)
result = model.predict_classes(img)
img_ori = load_img(img_name,target_size=(250,250))
plt.subplot(3,3,i)
if(result[0][0] == 1):
img_show = img_ori.convert('1')
#img_ori.convert('L')#错误的显示灰色#img_ori.convert('1')#错误的显示黑白
plt.imshow(img_show)
if(result[0][0] == 0):
plt.imshow(img_ori)
plt.title("预测为 狗" if result[0][0] == 1 else "预测为 猫")
plt.show()
效果一般般…