22、CNN(卷积神经网络)

一、CNN

参考文章https://www.cnblogs.com/kongweisi/p/10987870.html

卷积运算结构.png

  • 层与层之间的连除了矩阵运算,还有CNN。
  • convolution neural network 卷积神经网络
  • convolution 卷积是一种数学的运算
  • 运算法则:

input image* kernel = feature map

第一步.png

第二步.png
  • 行乘以行相加再求和(对应的位置相乘)。
  • 每次都是移动一列(这个扫描移动的距离是可以控的)
  • kernel(卷积核多大,每次扫描就是多大)
  • 卷积扫描后与原数据相比,数据就变少了。


    CNN.png
  • input layer 数据
  • convolvtional layter 1
  • pooling layer 1 池化操作
    *池化操作:--数据变少了


    池化.png
  • 池化提取大的特征,过滤小的特征。
  • 上面图片中的池化的操作,就是四个中选中最大的值,得到数据就行了。
  • 池化的大小--一般统一都是2*2操作。


    CNN计算过程.png

    参数对应.png

    多层参数.png
  • bias ---偏差
  • 相当于方程中的截距

二、卷积神经网络代码实现及作用

import warnings
warnings.filterwarnings('ignore')
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
import tensorflow as tf
(X_train,y_train),(X_test,y_test) = mnist.load_data()
X_train = tf.cast(X_train/255.0,tf.float32)
y_train = tf.one_hot(y_train,depth=10)#10分类问题
X_test = tf.cast(X_test/255,tf.float32)
y_test = tf.one_hot(y_test,depth=10)
# X_train 60000个,重复了100次,每次取512
data_train = tf.data.Dataset.from_tensor_slices((X_train,y_train)).repeat(100).shuffle(2000).batch(512).prefetch(1)
# X_test 10000个,可以取5次,重复50次,250次
data_test = tf.data.Dataset.from_tensor_slices((X_test,y_test)).repeat(50).shuffle(2000).batch(2000).prefetch(1)

repeat(100)重复多少次,shuffle(2000)打乱,batch(512)一批取出的数量,prefetch(1)预先取出数据加快速度。

image

声明变量

# w系数,卷积核,输入数据是28,28,颜色通道是1,黑白图片
w = {'kernel1':tf.Variable(tf.random.normal(shape = [3,3,1,64],stddev=0.01)),
        #tf.random.normal--tf中随机生成数据的方法      
     'kernel2':tf.Variable(tf.random.normal(shape = [3,3,64,128],stddev=0.01)),#第二层卷积核,以第一层卷积核的结果作为输入
     'kernel3':tf.Variable(tf.random.normal(shape = [3,3,128,256],stddev = 0.01)),
     'fc':tf.Variable(tf.random.normal(shape = [4*4*256,1024],stddev = 0.01)),
     # fc ---定义全连接层
  
     'out':tf.Variable(tf.random.normal(shape = [1024,10],stddev = 0.01))}
    # out--输出层
b = {'bias1':tf.Variable(tf.random.normal(shape = [64],stddev=0.01)),
     'bias2':tf.Variable(tf.random.normal(shape = [128],stddev=0.01)),
     'bias3':tf.Variable(tf.random.normal(shape = [256],stddev=0.01)),
     'fc':tf.Variable(tf.random.normal(shape = [1024],stddev=0.01)),
     'out':tf.Variable(tf.random.normal(shape = [10],stddev = 0.01))}
# w定义卷积核(filter),定义b,计算结果后加上这个b
# 457万系数,变量!
3*3*64 + 3*3*64*128 +3*3*128*256 + 4*4*256*1024 + 10240
4573760

构造神经网络的模型、损失、准确率、优化算法

def cnn(X):
    X = tf.reshape(X,shape = [-1,28,28,1])
#     第一层卷积运算
    conv1 = tf.nn.conv2d(input=X,filters=w['kernel1'],strides=[1,1,1,1],padding='SAME') + b['bias1']#卷积
    conv1 = tf.nn.max_pool(conv1,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME')#池化
    conv1 = tf.nn.relu(conv1)#激活 conv1.shape = [-1,14,14,64]
    
#     第二层卷积运算,计算的是,第一层,运算的结果
    conv2 = tf.nn.conv2d(input=conv1,filters=w['kernel2'],strides=[1,1,1,1],padding='SAME') + b['bias2']#卷积
    conv2 = tf.nn.max_pool(conv2,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME')#池化
    conv2 = tf.nn.relu(conv2)#激活 conv1.shape = [-1,7,7,128]
    
#     第三层卷积运算,计算的是,第二层,运算的结果
    conv3 = tf.nn.conv2d(input=conv2,filters=w['kernel3'],strides=[1,1,1,1],padding='SAME') + b['bias3']#卷积
    conv3 = tf.nn.max_pool(conv3,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME')#池化
    conv3 = tf.nn.relu(conv3)#激活 conv1.shape = [-1,4,4,256] 数据形状是4维
    
#     全连接层,矩阵操作
    fc = tf.reshape(conv3,shape = [-1,4*4*256])
    fc = tf.matmul(fc,w['fc']) + b['fc'] #昨天所讲的深度神经网络呢
    fc = tf.nn.relu(fc)# 输出的形状 [-1,1024]
    
#     输出层,真实值,进行对比
    y_pred = tf.matmul(fc,w['out']) + b['out']
    y_pred = tf.nn.softmax(y_pred)#转变成概率
    return y_pred # 输出的形状[-1,10]
# 构建损失,交叉熵
def cross_entropy(y_true,y_pred):
    y_pred = tf.clip_by_value(y_pred,1e-9,1.0)
    loss = tf.reduce_mean(tf.reduce_sum(tf.multiply(y_true,tf.math.log(1/y_pred)),axis = -1))
    return loss

# 构建计算准确率方法
def accuracy(y_true,y_pred):
    y_true = tf.argmax(y_true,axis = -1)
    y_pred = tf.argmax(y_pred,axis = -1)
    acc = tf.reduce_mean(tf.cast(tf.equal(y_true,y_pred),dtype=tf.float16)).numpy()
    return acc

# 声明优化算法
sgd = tf.optimizers.Adam(0.001)

全连接层中的每个神经元与其前一层的所有神经元进行全连接.全连接层可以整合卷积层或者池化层中具有类别区分性的局部信息.为了提升 CNN网络性能,全连接层每个神经元的激励函数一般采用ReLU函数。

定义优化方法(定义损失函数)

def run_optimizer(X_train,y_train):
    with tf.GradientTape() as g:
        y_pred = cnn(X_train)
        loss = cross_entropy(y_train,y_pred)
    gradients = g.gradient(loss,list(w.values()) + list(b.values()))# 计算梯度,偏导数
    sgd.apply_gradients(zip(gradients,list(w.values()) + list(b.values())))

for循环进行训练

for i,(X_train,y_train) in enumerate(data_train.take(100),1):
    run_optimizer(X_train,y_train)
    if i %10 == 0:
        for (X_test,y_test) in data_test.take(1):
            y_pred = cnn(X_test)
            acc = accuracy(y_test,y_pred)
            print('执行次数是:%d。准确率是:%0.4f'%(i,acc))
执行次数是:10。准确率是:0.1190
执行次数是:20。准确率是:0.5630
执行次数是:30。准确率是:0.7002
执行次数是:40。准确率是:0.8047
执行次数是:50。准确率是:0.8711
执行次数是:60。准确率是:0.9004
执行次数是:70。准确率是:0.8755
执行次数是:80。准确率是:0.9199
执行次数是:90。准确率是:0.9238
执行次数是:100。准确率是:0.9380
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356