python深度学习笔记3—— 卷积神经网络简介

  1. 卷积运算
    密集连接层和卷积层的根本区别
    Dense 层从输入特征空间中学到的是全局模式(比如对于 MNIST 数字,全局模式就是涉及所有像素的模式)
    卷积层学到的是局部模式,对于图像来说,学到的就是在输入图像的二维小窗口中发现的模式。在上面的例子中,这些窗口的大小都是 3×3。
    卷积神经网络学到的模式具有平移不变性
    卷积神经网络可以学到模式的空间层次结构:第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推。这使得卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念
    卷积作用于三维张量(特征图)其具有两个空间轴(高度和宽度)以及一个深度轴(也称为通道轴)。
    卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换,生成输出特征图。把滤镜从左向右移动再向下,再经过非线性转换这个输出特征图仍然是一个3D张量:它有一个宽度和一个高度。它的深度可以是任意的,因为输出深度是层的一个参数(用了多少个滤镜),并且深度轴中的当前通道不再代表RGB输入中的特定颜色;相反,它们代表滤镜。
    在 MNIST 示例中,第一个卷积层接收一个大小为 (28, 28, 1) 的特征图,并输出一个大小为 (26, 26, 32) 的特征图,
    即它在输入上计算 32 个过滤器。对于这 32 个输出通道,每个通道都包含一个 26×26 的数值网格,它是过滤器对输入的响应图,表示滤镜在输入中不同位置的响应。这也是特征图这一术语的含义:深度轴的每个维度都是一个特征(或过滤器),
    卷积关键参数
    从输入中提取的图块尺寸:这些图块的大小通常是 3×3 或 5×5。
    输出特征图的深卷积核在原图上运动扫描 每一个原图上的值都会都会和卷积核进行乘 加和 把新值放在一个矩阵里 也就是特征响应图,相当于卷积把原图上的特征提取出来 反应在特征图上 原图包含卷积核的特征被卷积核提取出来了
    池化
    把原图的特征进行缩小(但是依旧保留了主要的特征)
    用最大的制代替 或者用平均值代替
    模型结构 输入层 卷积层(压缩提纯,权值共享) 池化层、输出层(全连接层+softmax layer)图像会保留一些特征
    识别图像特征把特征提取出来叫做卷积核(特征提取器)

2代码理解

import keras
import tensorflow as tf
keras.__version__
from keras import layers
from keras import models

model = models.Sequential()

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))

model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.MaxPooling2D((2, 2)))
# 最后一层卷积需要的参数大小为:(3*3*64+1)*64
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# 将图片摊平,变为一维3*3*64
model.add(layers.Flatten())
# 该层是fully connect 全连接层
# 参数计算为:(1*1*576+1)*64=36928,可以认为全连接层的卷积核大小为1*1。不卷了
model.add(layers.Dense(64, activation='relu'))
# 该层也是fully connect,最后输出
# 参数计算为:(1*1*64+1)*10=650
model.add(layers.Dense(10, activation='softmax'))
rom keras.datasets import mnist
from keras.utils import to_categorical

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
#若无法运行 
#昨天遇到的问题cannot import name 'to_categorical' from 'keras.utils' (/usr/local/lib/python3.7/dist-packages/keras/utils/__init__.py)
解决方案
#import tensorflow as tf
#to_categorical = tf.keras.utils.to_categorical
# 图片需要变为4维张量
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

# one-hot encoding to_categorical相当于one-hot encoding.
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',#多元交叉熵损失函数
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
#测试集放入模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
#正确率
test_acc

过程中需要计算的参数python深度学习笔记3—— 卷积神经网络简介

上一篇:GUP Keras 例子Image classification from scratch


下一篇:Mini440之uboot移植流程之linux内核启动分析(六)