【054】Keras 垃圾分类图片识别项目

整个项目使用tensorflow-GPU跑的

1、数据集下载

      链接:https://pan.baidu.com/s/1ywEV3_CXEIgxvPh6g3BX5Q

      提取码:39zm

2、随机展示6张图片

import time
start = time.time()
import numpy as np
import matplotlib.pyplot as plt
import keras
import os,glob,random
from keras.models import Sequential
from keras.layers import Conv2D,Flatten,MaxPooling2D,Dense,AveragePooling2D
from keras.preprocessing.image import ImageDataGenerator,load_img,img_to_array,array_to_img

#1、数据位置
base_path = 'D:\A\AI-master\garbage_class\dataset-resized'
#glob.glob获取指定目录下的所有图片
img_list = glob.glob(os.path.join(base_path,'*/*.jpg')) #加上r让字符串不转义

print(len(img_list))#2527

#2、随机展示六张图片

for i ,img_path in enumerate(random.sample(img_list,6)):
    img = load_img(img_path)
    plt.subplot(2,3,i+1)

    plt.imshow(img)
    plt.show()

【054】Keras 垃圾分类图片识别项目_第1张图片

3、对数据进行分组

train_datagen = ImageDataGenerator(rescale=1./255,shear_range=0.1,zoom_range=0.1,
                                   width_shift_range=0.1,height_shift_range=0.1,horizontal_flip=True,
                                   vertical_flip=True,validation_split=0.1)

test_datagen = ImageDataGenerator(rescale=1. / 255, validation_split=0.1)

train_generator = train_datagen.flow_from_directory(
    base_path, target_size=(300, 300), batch_size=16,
    class_mode='categorical', subset='training', seed=0)

validation_generator = test_datagen.flow_from_directory(
    base_path, target_size=(300, 300), batch_size=16,
    class_mode='categorical', subset='validation', seed=0)

print(train_generator.labels.shape)  #(2276,)
print(validation_generator.labels.shape)  #(251,)

labels = train_generator.class_indices

lables = dict((v, k) for k, v in labels.items())
print(labels)

#{'cardboard': 0, 'glass': 1, 'metal': 2, 'paper': 3, 'plastic': 4, 'trash': 5}

4、MaxPooling2D,epoch=50

model = Sequential([
    Conv2D(filters=32, kernel_size=3, padding='same', activation='relu',
           input_shape=(300, 300, 3)),
    MaxPooling2D(pool_size=2),

    Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),
    MaxPooling2D(pool_size=2),
    # MaxPooling2D
    Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'),
    MaxPooling2D(pool_size=2),

    Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'),
    MaxPooling2D(pool_size=2),

    Flatten(),
    #Flatten层用来将输入“压平”,即把多维的输入一维化,
    # 常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。

    Dense(64, activation='relu'),#units=64是正整数,输出空间维度。
    #Dense 实现以下操作:output = activation(dot(input, kernel) + bias)
    # 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,
    # 以及 bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。
    #如果该层的输入的秩大于2,那么它首先被展平然后再计算与 kernel 的点乘。

    Dense(6, activation='softmax')#units=6,,是正整数,输出空间维度。
])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
#categorical_crossentropy输出张量与目标张量之间的分类交叉熵-∑p(x)logq(x)。
# p代表正确答案,q代表的是预测值。交叉熵值越小,两个概率分布越接近。
model.fit_generator(train_generator, epochs=50, steps_per_epoch=2276//32,validation_data=validation_generator,
                    validation_steps=251//32)
#fit_generator使用 Python 生成器(或 Sequence 实例)逐批生成的数据,按批次训练模型。2276//32=71
#仅当 validation_data 是一个生成器时才可用。 在停止前 generator 生成的总步数(样本批数)。
# 对于 Sequence,它是可选的:如果未指定,将使用 len(generator) 作为步数。

'''Adam:(adaptive moment estimation)自适应矩估计
是RMSProp优化器的更新.利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率.

优点:每一次迭代学习率都有一个明确的范围,不会因为梯度很大而导致学习率(步长)也变得很大,
使得参数变化很平稳.Adam 算法利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

概率论中矩的含义是:如果一个随机变量 X 服从某个分布,X 的一阶矩是 E(X),也就是样本平均值,
X 的二阶矩就是 E(X^2),也就是样本平方的平均值。
'''

结果
最后一轮:
loss: 0.6158  
acc: 0.7764  
val_loss: 0.9993  
val_acc: 0.7321
运行时间:22min
model.evaluate(test_x,test_y):
loss = 0.4489794075489044
accuracy = 0.9375

5、AveragePooling2D,epoch=50

model = Sequential([
    Conv2D(filters=32, kernel_size=3, padding='same', activation='relu',
           input_shape=(300, 300, 3)),
    AveragePooling2D(pool_size=2),

    Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),
    AveragePooling2D(pool_size=2),
    # MaxPooling2D
    Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'),
    AveragePooling2D(pool_size=2),

    Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'),
    AveragePooling2D(pool_size=2),

    Flatten(),
    #Flatten层用来将输入“压平”,即把多维的输入一维化,
    # 常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。

    Dense(64, activation='relu'),#units=64是正整数,输出空间维度。
    #Dense 实现以下操作:output = activation(dot(input, kernel) + bias)
    # 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,
    # 以及 bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。
    #如果该层的输入的秩大于2,那么它首先被展平然后再计算与 kernel 的点乘。

    Dense(6, activation='softmax')#units=6,,是正整数,输出空间维度。
])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
#categorical_crossentropy输出张量与目标张量之间的分类交叉熵-∑p(x)logq(x)。
# p代表正确答案,q代表的是预测值。交叉熵值越小,两个概率分布越接近。
model.fit_generator(train_generator, epochs=50, steps_per_epoch=2276//32,validation_data=validation_generator,
                    validation_steps=251//32)
#fit_generator使用 Python 生成器(或 Sequence 实例)逐批生成的数据,按批次训练模型。2276//32=71
#仅当 validation_data 是一个生成器时才可用。 在停止前 generator 生成的总步数(样本批数)。
# 对于 Sequence,它是可选的:如果未指定,将使用 len(generator) 作为步数。

'''Adam:(adaptive moment estimation)自适应矩估计
是RMSProp优化器的更新.利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率.

优点:每一次迭代学习率都有一个明确的范围,不会因为梯度很大而导致学习率(步长)也变得很大,
使得参数变化很平稳.Adam 算法利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

概率论中矩的含义是:如果一个随机变量 X 服从某个分布,X 的一阶矩是 E(X),也就是样本平均值,
X 的二阶矩就是 E(X^2),也就是样本平方的平均值。
'''

结果
最后一轮:
loss: 0.6995
acc: 0.7403
val_loss: 0.5392
val_acc: 0.6339
运行时间:22min
model.evaluate(test_x,test_y):
loss = 0.6733614206314087
accuracy = 0.8125

6、MaxPooling2D,epoch=100

结果
最后一轮:
loss: 0.4408
acc: 0.8399
val_loss: 0.6909
val_acc: 0.6964
运行时间:46min
model.evaluate(test_x,test_y):
loss = 0.8694185018539429
accuracy = 0.8125

7、AveragePooling2D,epoch=100

结果
最后一轮:
loss:0.4482
acc: 0.8380
val_loss: 0.6498
val_acc: 0.6607
运行时间:46min
model.evaluate(test_x,test_y):
loss = 1.396782398223877
accuracy = 0.5625

About Me:小婷儿

 本文作者:小婷儿,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 微信:tinghai87605025 联系我加微信群

 QQ:87605025

 QQ交流群py_data 483766429

 公众号:python宝 或 DB宝

 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

如果你觉得到文章对您有帮助,欢迎赞赏哦!有您的支持,小婷儿一定会越来越好!

你可能感兴趣的:(【054】Keras 垃圾分类图片识别项目)