基于CNN算法自定义模型的动物识别项目1

资源文件

15种常见动物识别数据集


一、数据集介绍

(1)数据集分为训练集train、测试集test两部分
(2)动物类别:bird、cat、cattle、chicken、dog、dolphin、duck、elephant、giraffe、monkey、pig、rabbit、rat、sheep、tiger。
(3)train数据集中每类动物有200张图片
(4)test数据集中每类动物有20张图片

二、开发步骤

1.引入库

from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Dropout,Flatten,Dense
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
from keras_preprocessing.image import img_to_array,load_img
from keras.models import load_model
from keras import models
from keras.preprocessing import image
import numpy as np

2.定义模型

#定义模型
model = Sequential()
# 150*150*3的彩色图片 32个卷积核 卷积核大小3*3 RELU激活函数
model.add(Conv2D(input_shape=(150,150,3),filters=32,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=32,kernel_size=3,padding='same',activation='relu'))
# 池化大小2  池化步长2
model.add(MaxPool2D(pool_size=2,strides=2))

model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2,strides=2))

model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2,strides=2))
# 得到二维特征图
# 转换变成一维
model.add(Flatten())
model.add(Dense(64,activation='relu')) # 全连接层
model.add(Dropout(0.5))  #抵抗过拟合
model.add(Dense(15,activation='softmax'))  #1515分类,一般用在分类任务的输出层
model.summary()

在这里插入图片描述
在这里插入图片描述

3.定义优化器

#定义优化器,交叉熵计算准确率,optimizer梯度下降的优化方法
adam = Adam(lr=1e-4)
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])

4.训练数据增强

train_datagen = ImageDataGenerator(
    rotation_range=40,
    width_shift_range=0.2, #随机旋转度数
    height_shift_range=0.2, #随机水平位移
    rescale=1/255, #数据归一化
    shear_range=0.2, #随机裁剪
    zoom_range=0.2, #随机放大
    horizontal_flip=True, #水平翻转
    fill_mode='nearest', #填充方式
)

5.测试数据归一化

test_data = ImageDataGenerator(
    rescale=1/255, #数据归一化
)

6.数据生成

# 定义数据生成
batch_size = 32  #每次传32张照片

#生成训练数据
train_generator = train_datagen.flow_from_directory(
    '/BASICCNN/image/train',
    target_size=(150,150),
    batch_size=batch_size,
)

#生成测试数据
test_generator = test_data.flow_from_directory(
    '/BASICCNN/image/test',
    target_size=(150,150),
    batch_size=batch_size,
)

7.查看类别定义

print(train_generator.class_indices)

在这里插入图片描述
在这里插入图片描述

8.训练模型

#训练模型 20个周期 测试集数据
history=model.fit_generator(train_generator,epochs=20,validation_data=test_generator)
model.save('/BASICCNN/TrainModel_h5/model_CNNTrain.h5')

在这里插入图片描述
在这里插入图片描述

9.模型可视化

#训练模型可视化
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model_Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(['Train_Accuracy','Valid_Accuracy'],loc='upper left')
plt.savefig('/BASICCNN/TrainImage/CNNTrain_accuracy.png')
plt.show()

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model_Loss')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['Train_Loss','Valid_Loss'],loc='upper left')
plt.savefig('/BASICCNN/TrainImage/CNNTrain_loss.png')
plt.show()

在这里插入图片描述
在这里插入图片描述

10.显示指定层

#通过model的属性layers查询模型中的各层
model.layers
print(len(model.layers))
#通过各层的属性output获取各层输出张量
layer_outputs = [layer.output for layer in model.layers[:9]]
#创建新的模型,一个输入,多个输出
new_model = models.Model(inputs=model.input,outputs=layer_outputs)

11.预测每一层输出

#加载测试图片
img_path = '/BASICCNN/image/test/duck/duck.1010.jpg'
img = image.load_img(img_path,target_size=(150,150))
plt.imshow(img)
#图片预处理
#(1)将image转化为数组
img_tensor_3D = image.img_to_array(img)
#(2)由3D扩展为4D
img_tensor_4D = np.expand_dims(img_tensor_3D,axis=0)
#(3)归一化处理
img_tensor_4D = img_tensor_4D/255.
print(img_tensor_4D.shape)
img_tensor_4D
#将第二部分处理后的图片张量作为输入,得到各层实际输出张量值,使用model.predict()
activations = new_model.predict(img_tensor_4D)
#(1)查看第1层输出的张量值,输出张量空间大小可与model.summary()比对
first_layer_activation = activations[0]
print(first_layer_activation.shape)
print(first_layer_activation[0][0][0][0])
print(activations[2].shape)

在这里插入图片描述

12.可视化单层网络输出

plt.imshow(first_layer_activation[0,:,:,0],cmap='viridis')
plt.matshow(first_layer_activation[0,:,:,3],cmap='viridis')

13.增强可视化效果

characters = activations[0][0,:,:,0]
characters -= characters.mean() #平均值
characters /= characters.std()  #标准差
characters *=64
characters +=128
characters = np.clip(characters,0,255).astype('uint8')

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
ax1 = plt.subplot(121)
ax1.set_title('原始数据可视化效果')
ax1.imshow(activations[0][0,:,:,0],cmap='viridis')
ax2 = plt.subplot(122)
ax2.set_title('处理后数据可视化效果')
ax2.imshow(characters,cmap='viridis')
plt.savefig('/BASICCNN/TrainImage/CNN_TestGen_layer1.png')
characters

在这里插入图片描述
在这里插入图片描述

14.可视化所有中间网络层

layer_name = []
for i in model.layers[:9]:
    layer_name.append(i.name)
print(layer_name)

images_per_row = 16
for name,act in zip(layer_name,activations):
    n_features = act.shape[-1]
    rows = n_features//images_per_row
    size = act.shape[1]
    display_grid = np.zeros((size*rows,size*images_per_row))
    for r in range(rows):
        for k in range(images_per_row):
            channel_img = act[0,:,:,r*images_per_row+k]
            channel_img -= channel_img.mean() #平均值
            # channel_img /= channel_img.std()
            channel_img *=64
            channel_img +=128
            channel_img = np.clip(channel_img,0,255).astype('uint8')
            display_grid[r*size:(r+1)*size,k*size:(k+1)*size] = channel_img
            scale = 1./size
        scale = 1./size
        fig = plt.figure(figsize=(scale*display_grid.shape[1],scale*display_grid.shape[0]))
        plt.title(name)
        plt.grid(False)
        plt.imshow(display_grid,aspect='auto',cmap='viridis')
        plt.axis('off')
        fig.savefig('/BASICCNN/TrainImage/CNNintlayer' + str(k) + '.png')
        plt.show()
        plt.cla()
        plt.close('all')

在这里插入图片描述

15.验证模型预测结果

label = np.array(['bird', 'cat', 'cattle', 'chicken', 'dog', 'dolphin', 'duck', 'elephant',
                  'giraffe', 'monkey', 'pig', 'rabbit', 'rat', 'sheep', 'tiger'])
# 载入模型
model = load_model('/BASICCNN/TrainModel_h5/model_CNNTrain.h5')
# 导入图片
image = load_img('image/test/bird/bird.1010.jpg')
image = image.resize((150,150))
image = img_to_array(image)
image = image/255
image = np.expand_dims(image,0)
image.shape

print(label[model.predict_classes(image)])

在这里插入图片描述

  • 3
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于CNN(卷积神经网络)模型的CIFAR-10数据集图像分类是指使用CNN模型对CIFAR-10数据集中的图像进行分类和识别任务。 CIFAR-10数据集是一个常用的计算机视觉数据集,包含10个不同类别的60000个彩色图像,每个类别有6000个图像。这些图像的尺寸为32x32像素,分为训练集和测试集,其中训练集包含50000个图像,测试集包含10000个图像。 使用CNN模型对CIFAR-10数据集进行图像分类,可以通过多个卷积层、池化层、全连接层和softmax层来实现。首先,我们可以使用卷积层对图像进行特征提取,提取图像的边缘、纹理和其他局部特征。接下来,使用池化层可以降低图像的空间尺寸,减少参数数量,并且保留重要的特征。然后,将池化层的输出连接到全连接层,以学习图像的高级特征和模式。最后,使用softmax层对图像进行分类,将它们分到10个不同的类别中。 训练CNN模型的过程通常包括数据预处理、模型构建、模型训练和模型评估等步骤。在数据预处理阶段,可以对图像进行归一化、增强和数据扩充等操作,以提高模型的性能和鲁棒性。然后,在模型构建阶段,可以选择不同的CNN架构和超参数设置,例如卷积核的大小、滤波器的个数和网络的层数等。训练过程通常采用随机梯度下降(SGD)等优化算法来最小化损失函数,并使用训练集上的图像来更新模型参数。最后,在模型评估阶段,可以使用测试集上的图像来评估模型的分类性能,例如准确率、精确率和召回率等指标。 基于CNN模型的CIFAR-10数据集图像分类任务是计算机视觉深度学习领域的经典问题,它不仅可以提供图像分类技术的基础研究和应用,还可以促进相关领域的进一步发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值