文章目录

  • 使用Keras创建CNN用于对象识别
    • 1. 数据集keras.datasets中的 cifar10
      • 1.创建模型
      • 2.训练、评估
      • 3.结果
    • 2.数据集MNIST
      • 1.加载数据
      • **2.绘制前16张图像**
      • 3数据处理
        • **将类标签转换为热编码矩阵**
        • **x扩充维度,shape(60000,28,28)--->(60000,1,28,28)**
      • 4.**创建模型**
      • 5.训练

使用Keras创建CNN用于对象识别

1. 数据集keras.datasets中的 cifar10

from keras.datasets import cifar10

下载数据集链接,迅雷比较快。
下载的文件名为cifar-10-python.tar.gz,将其重命名为:cifar-10-batches-py.tar.gz
放到目录C:\Users\.keras\datasets下。
训练集:50000张图片,33232;标签[0,…9]
验证集:10000张图片。

from keras.datasets import cifar10
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Flatten
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.layers.convolutional import Conv2D
import numpy as np
from keras import backend as K
K.set_image_dim_ordering('th')# Loading the data
(x_train, y_train), (x_test, y_test) = cifar10.load_data()'''
#Lets see some examples from this datafig = plt.figure()
gs = gridspec.GridSpec(4, 4, wspace=0.0)
ax = [plt.subplot(gs[i]) for i in range(4*4)]
for i in range(16):a = x_train[i]a = a[:,:,:,np.newaxis]r, g,b = np.split(a,indices_or_sections=3,axis=0)a = np.concatenate([r,g,b],axis=3)a =a.squeeze()ax[i].imshow(Image.fromarray(a))
plt.show()
'''
# 现在将类转换为一个热编码矩阵 0--0,1--1,...9--9
y_train_onehot = np_utils.to_categorical(y_train)
y_test_onehot = np_utils.to_categorical(y_test)
# 数据归一化
x_train = x_train/255
x_test = x_test/255

1.创建模型

model = Sequential()
卷积层:model.add(Conv2D(filters=, kernel_size=, padding='same', input_shape=, activation='relu')))
池化层model.add(MaxPooling2D(pool_size=(2, 2)))
序列化model.add(Flatten())
全连接层:model.add(Dense(units=512, activation='relu'))

# 选择序列模型来获得一组层。
num_classes = 10
model = Sequential()# 第一卷积层
model.add(Conv2D(filters=32,kernel_size=(3, 3),padding='same',input_shape=(3, 32, 32),activation='relu'))
# 第er卷积层
model.add(Conv2D(filters=32, kernel_size=(3, 3),padding='same', activation='relu', ))# 池化层
model.add(MaxPooling2D(pool_size=(2, 2)))# Flatten()使输出序列化
model.add(Flatten())
model.add(Dense(units=512, activation='relu'))# Output class
model.add(Dense(num_classes, activation='softmax'))
# 编译模型
epochs = 50
lrate = 0.05sgd = SGD(lr=lrate,momentum=0.8,  # 大或等于0的浮点数,动量参数decay=lrate/epochs,  # 每次更新后的学习率衰减值nesterov=False)  # 是否使用Nesterov动量model.compile(loss='categorical_crossentropy',  # 多分类的对数损失,与softmax分类器相对应。需要将标签转化为形如(nb_samples, nb_classes)的二值序列optimizer=sgd,metrics=['accuracy'])# Print summary of CNN
print(model.summary())
  Layer (type)                 Output Shape              Param #   conv2d_1 (Conv2D)            (None, 32, 32, 32)        896       _________________________________________________________________ conv2d_2 (Conv2D)            (None, 32, 32, 32)        9248      _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 32, 16, 16)        0         _________________________________________________________________flatten_1 (Flatten)          (None, 8192)              0         _________________________________________________________________ dense_1 (Dense)              (None, 512)               4194816   _________________________________________________________________ dense_2 (Dense)              (None, 10)                5130      Total params: 4,210,090Trainable params: 4,210,090 Non-trainable  params: 0_________________________________________________________________ None

2.训练、评估

model.fit()
model.evaluate()

# Fitting the model
model.fit(x_train, y_train_onehot, validation_data=(x_test, y_test_onehot), epochs=250, batch_size=100)# Final evaluation of the model
loss, accuracy = model.evaluate(x_test, y_test_onehot, verbose=0)
print("Model Accuracy = {:.4f}".format(accuracy))

3.结果

Epoch 1/50 - loss:1.8169 - acc: 0.3460 - val_loss: 1.5685 - val_acc: 0.4329
Epoch 2/50 -loss: 1.3877 - acc: 0.5058 - val_loss: 1.3792 - val_acc: 0.5129
Epoch 3/50 -loss: 1.1807 - acc: 0.5797 - val_loss: 1.2014 - val_acc: 0.5807
Epoch 4/50 - loss: 0.9950 - acc: 0.6482 - val_loss: 1.0757 - val_acc: 0.6150
Epoch 5/50 - loss: 0.8353 - acc: 0.7069 - val_loss: 1.0268 - val_acc: 0.6452
Epoch 6/50 - loss: 0.6723 - acc: 0.7645 - val_loss: 1.0511 - val_acc: 0.6480
Epoch 7/50 - loss: 0.5094 - acc: 0.8232 - val_loss: 1.2619 - val_acc: 0.6250
Epoch 8/50 - loss: 0.3615 - acc: 0.8765 - val_loss: 1.2374 - val_acc: 0.6513
Epoch 9/50 - loss: 0.2408 - acc: 0.9187 - val_loss: 1.3188 - val_acc: 0.6532
Epoch 10/50 - loss: 0.1522 - acc: 0.9494 - val_loss: 1.6040 - val_acc: 0.6385
Epoch 11/50 - loss: 0.1107 - acc: 0.9644 - val_loss: 1.6339 - val_acc: 0.6591
Epoch 12/50- loss: 0.0600 - acc: 0.9816 - val_loss: 1.8889 - val_acc: 0.6526
Epoch 13/50

2.数据集MNIST

from keras.layers.convolutional import MaxPooling2D
from keras.layers import Flatten
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.layers.convolutional import Conv2D
from PIL import Image
import matplotlib.gridspec as gridspec
from keras import backend as K
K.set_image_dim_ordering('th')
import numpy as np
import struct
import matplotlib.pyplot as plt

1.加载数据


# 训练集文件
train_images_idx3_ubyte_file = './mnist/raw/train-images-idx3-ubyte'
# 训练集标签文件
train_labels_idx1_ubyte_file = './mnist/raw/train-labels-idx1-ubyte'# 测试集文件
test_images_idx3_ubyte_file = './mnist/raw/t10k-images-idx3-ubyte'
# 测试集标签文件
test_labels_idx1_ubyte_file = './mnist/raw/t10k-labels-idx1-ubyte'

解析idx3文件的通用函数

def decode_idx3_ubyte(idx3_ubyte_file):"""解析idx3文件的通用函数"""# 读取二进制数据bin_data = open(idx3_ubyte_file, 'rb').read()# 解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽offset = 0fmt_header = '>iiii' #因为数据结构中前4行的数据类型都是32位整型,所以采用i格式,但我们需要读取前4行数据,所以需要4个i。我们后面会看到标签集中,只使用2个ii。magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, bin_data, offset)print('魔数:%d, 图片数量: %d张, 图片大小: %d*%d' % (magic_number, num_images, num_rows, num_cols))# 解析数据集image_size = num_rows * num_colsoffset += struct.calcsize(fmt_header)  #获得数据在缓存中的指针位置,从前面介绍的数据结构可以看出,读取了前4行之后,指针位置(即偏移位置offset)指向0016。# print(offset)fmt_image = '>' + str(image_size) + 'B'  #图像数据像素值的类型为unsigned char型,对应的format格式为B。这里还有加上图像大小784,是为了读取784个B格式数据,如果没有则只会读取一个值(即一副图像中的一个像素值)# print(fmt_image,offset,struct.calcsize(fmt_image))images = np.empty((num_images, num_rows, num_cols))#plt.figure()for i in range(num_images):# if (i + 1) % 10000 == 0:#     # print('已解析 %d' % (i + 1) + '张')#     print(offset)images[i] = np.array(struct.unpack_from(fmt_image, bin_data, offset)).reshape((num_rows, num_cols))#print(images[i])offset += struct.calcsize(fmt_image)return images

解析idx1文件的通用函数

def decode_idx1_ubyte(idx1_ubyte_file):"""解析idx1文件的通用函数"""# 读取二进制数据bin_data = open(idx1_ubyte_file, 'rb').read()# 解析文件头信息,依次为魔数和标签数offset = 0fmt_header = '>ii'magic_number, num_images = struct.unpack_from(fmt_header, bin_data, offset)print('魔数:%d, 图片数量: %d张' % (magic_number, num_images))# 解析数据集offset += struct.calcsize(fmt_header)fmt_image = '>B'labels = np.empty(num_images)for i in range(num_images):# if (i + 1) % 10000 == 0:#     print ('已解析 %d' % (i + 1) + '张')labels[i] = struct.unpack_from(fmt_image, bin_data, offset)[0]offset += struct.calcsize(fmt_image)return labels

获取数据

train_images = decode_idx3_ubyte(train_images_idx3_ubyte_file)  # (60000, 28, 28)
train_labels = decode_idx1_ubyte(train_labels_idx1_ubyte_file)
test_images = decode_idx3_ubyte(test_images_idx3_ubyte_file)
test_labels = decode_idx1_ubyte(test_labels_idx1_ubyte_file)

2.绘制前16张图像

fig = plt.figure()
gs = gridspec.GridSpec(4, 4, wspace=0.0)
ax = [plt.subplot(gs[i]) for i in range(4*4)]
for i in range(16):a = train_images[i]ax[i].imshow(Image.fromarray(a))
plt.show()

3数据处理

将类标签转换为热编码矩阵

# 现在将类转换为一个热编码矩阵 0--0,1--1,...9--9y_train_onehot = np_utils.to_categorical(train_labels)
y_test_onehot = np_utils.to_categorical(test_labels)

x扩充维度,shape(60000,28,28)—>(60000,1,28,28)

x_train = train_images[:,np.newaxis]x_test = test_images[:,np.newaxis]

4.创建模型

Conv2D需要输入四维数据,将input_shape=(1, 28, 28)


# 选择序列模型来获得一组层。
num_classes = 10
model = Sequential()# 第一卷积层
model.add(Conv2D(filters=32,kernel_size=(3, 3),padding='same',input_shape=(1, 28, 28),activation='relu'))
# 第er卷积层
model.add(Conv2D(filters=32, kernel_size=(3, 3),padding='same', activation='relu', ))# 池化层
model.add(MaxPooling2D(pool_size=(2, 2)))# Flatten()使输出序列化
model.add(Flatten())
model.add(Dense(units=512, activation='relu'))# Output class
model.add(Dense(num_classes, activation='softmax'))
# 编译模型
epochs = 50
lrate = 0.05sgd = SGD(lr=lrate,momentum=0.8,  # 大或等于0的浮点数,动量参数decay=lrate/epochs,  # 每次更新后的学习率衰减值nesterov=False)  # 是否使用Nesterov动量model.compile(loss='mean_squared_error',  # 用categorical_crossentropy的话正确率就会一直在0.01optimizer=sgd,metrics=['accuracy'])# Print summary of CNN
print(model.summary())
   _________________________________________________________________ Layer (type)                 Output Shape              Param #   ================================================================= conv2d_1 (Conv2D)            (None, 32, 28, 28)        320       _________________________________________________________________ conv2d_2 (Conv2D)            (None, 32, 28, 28)        9248      _________________________________________________________________  max_pooling2d_1 (MaxPooling2 (None, 32, 14, 14)        0         _________________________________________________________________ flatten_1 (Flatten)          (None, 6272)              0         _________________________________________________________________ dense_1 (Dense)              (None, 512)               3211776   _________________________________________________________________dense_2 (Dense)              (None, 10)                5130      =================================================================Total params: 3,226,474 Trainable params: 3,226,474 Non-trainable params: 0_________________________________________________________________None

5.训练

# Fitting the model
model.fit(x_train, y_train_onehot, validation_data=(x_test, y_test_onehot),epochs=250, batch_size=100,verbose=2)    # 每轮epoch显示日志# Final evaluation of the model
loss, accuracy = model.evaluate(x_test, y_test_onehot, verbose=0)
print("Model Accuracy = {:.4f}".format(accuracy))

【深度学习学习笔记】4.前馈神经网络之四:卷积神经网络CNN相关推荐

  1. 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究

    吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 2.1 为什么要进行实例探究 2.2 经典网络 LeNet-5 AlexNet VGG- ...

  2. 深度学习入门笔记(七):深层神经网络

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  3. 深度学习PyTorch笔记(12):线性神经网络——softmax回归

    深度学习PyTorch笔记(12):线性神经网络--softmax回归 6 线性神经网络--softmax回归 6.1 softmax回归 6.1.1 概念 6.1.2 softmax运算 6.2 图 ...

  4. 深度学习与计算机视觉系列(10)_细说卷积神经网络

    转载自: 深度学习与计算机视觉系列(10)_细说卷积神经网络 - 龙心尘 - 博客频道 - CSDN.NET http://blog.csdn.net/longxinchen_ml/article/d ...

  5. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  6. 深度学习入门(二十四)卷积神经网络——填充和步幅

    深度学习入门(二十四)卷积神经网络--填充和步幅 前言 卷积神经网络--填充和步幅 课件 填充 步幅 总结 课本 1 填充 2 步幅 3 小结 前言 核心内容来自博客链接1博客连接2希望大家多多支持作 ...

  7. 深度学习入门(三十二)卷积神经网络——BN批量归一化

    深度学习入门(三十二)卷积神经网络--BN批量归一化 前言 批量归一化batch normalization 课件 批量归一化 批量归一化层 批量归一化在做什么? 总结 教材 1 训练深层网络 2 批 ...

  8. 不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络!

    文章转载自订阅号「夕小瑶的卖萌屋」中的文章<不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络>. Hello~你们的小夕终于吐泡泡了-前几天小夕又加班赶project啦, ...

  9. (pytorch-深度学习系列)使用Pytorch实现小型卷积神经网络网络

    卷积层 卷积神经网络中每层卷积层(Convolutional layer)由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的.卷积运算的目的是提取输入的不同特征,第一层卷积层可能只 ...

  10. 智能学习 | MATLAB实现Bee-CNN蜜蜂算法优化卷积神经网络图像分类预测

    智能学习 | MATLAB实现Bee-CNN蜜蜂算法优化卷积神经网络图像分类预测 目录 智能学习 | MATLAB实现Bee-CNN蜜蜂算法优化卷积神经网络图像分类预测 分类效果 基本介绍 模型参数 ...

最新文章

  1. java 画布实验报告_编辑画布图像
  2. Android Studio :1、连接手机调试(超级详细;附带连接测试录像);2、点击Button按钮,显示Toast中的内容
  3. VC编译的除法的一段汇编代码解释
  4. 07向量的点积、数量积、两向量垂直的条件、投影与投影向量、向量的正交分解、几个不等式、用坐标计算数量积
  5. 【工具使用】git使用--将本地代码上传到icode代码库踩坑总结
  6. 三维扫描用于3D打印技术
  7. Matlab计算矩阵的行列式
  8. 修改手机屏幕刷新率_手机屏幕刷新率那点事儿!
  9. 怎样用计算机打出错字,电脑键盘打字错乱的解决方法-电脑打不出字怎么办
  10. 用ElementUI 的布局容器,消除页头距离顶部的间隙
  11. Dell E7440加装硬盘
  12. 什么是interop
  13. AutoCAD .NET: 遍历模型空间
  14. Eclipse Unable to install breakpoint in XXX 解决办法
  15. python语言关键字有哪些_Python之33个关键字是哪些
  16. VC正则表达式的使用(《VC知识库》)
  17. 【2019年05月21日】A股ROE最高排名
  18. Drawio使用介绍(画图工具)
  19. 全国高校地理信息排名
  20. 2018-2019 中国5G产业全景图谱及发展趋势分析

热门文章

  1. UML顺序图和通信图
  2. LLMs模型速览(GPTs、LaMDA、GLM/ChatGLM、PaLM/Flan-PaLM、BLOOM、LLaMA、Alpaca)
  3. LDA文档主题生成模型
  4. 计算机模拟美容效果,计算机辅助美容设计
  5. 解决MAC电脑键盘和触摸板突然没有反应问题
  6. 分享生活中常见的共享上网
  7. Office 2011 2016 2019 For Mac 下载合集
  8. 神器来袭,手把手教你使用 Milvus_cli
  9. 远程服务器如何创建分支,Git 创建分支提交远程分支详解
  10. 股票的基础知识、除权与除息