Keras【Deep Learning With Python】CNN卷积神经网络(看不懂你打我系列)

文章目录

  • 前言
  • 1 CNN概述
  • 2 我的分析
  • 3 代码实现
  • 4 代码分析
  • 6 结果

前言

本文分为CNN讲解和keras实现CNN(mnist数据集)两部分。

1 CNN概述

Keras【Deep Learning With Python】CNN卷积神经网络(看不懂你打我系列)_第1张图片
卷积神经网络(Convolutional Neural Networks / CNNs / ConvNets)与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。
具有三维体积的神经元(3D volumes of neurons)
卷积神经网络利用输入是图片的特点,把神经元设计成三个维度 : width, height, depth(注意这个depth不是神经网络的深度,而是用来描述神经元的) 。比如输入的图片大小是 32 × 32 × 3 (rgb),那么输入神经元就也具有 32×32×3 的维度。下面是图解:
Keras【Deep Learning With Python】CNN卷积神经网络(看不懂你打我系列)_第2张图片

2 我的分析

Keras【Deep Learning With Python】CNN卷积神经网络(看不懂你打我系列)_第3张图片
总的来说就是卷积层增大图片高度同时改变图片大小,但是在卷积的过程中会丢失一些信息,所以我们引入池化层。
也就是说,在卷积层不改变图片大小,在池化层改变图片大小。

3 代码实现

import numpy as np
np.random.seed(1337)
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Activation,Convolution2D,MaxPooling2D,Flatten
from keras.optimizers import Adam

(X_train,y_train),(X_test,y_test)=mnist.load_data()

X_train=X_train.reshape(-1,1,28,28)
X_test=X_test.reshape(-1,1,28,28)
y_train=np_utils.to_categorical(y_train)
y_test=np_utils.to_categorical(y_test)


model=Sequential()

#Conv layer 1 output shape(32,28,28)
model.add(Convolution2D(
    nb_filter=32,
    nb_row=5,
    nb_col=5,
    border_mode='same',       # padding method 如果卷积的方式选择为same,那么卷积操作的输入和输出尺寸会保持一致。如果选择valid,那卷积过后,尺寸会变小。
    input_shape=(1,           # channels
                 28,28)
))
model.add(Activation('relu'))

# Pooling layer 1 (max pooling) output shape (32,14,14)
model.add(MaxPooling2D(
    pool_size=(2,2),
    strides=(2,2),         # 跳跃2取样
    border_mode='same',    # Padding method
))


# Conv layer 2 output shape (64,14,14)
model.add(Convolution2D(64,5,5,border_mode='same'))
model.add(Activation('relu'))


# Pooling layer2 (maxp ooling) output shapr (64,7,7)
model.add(MaxPooling2D(pool_size=(2,2),border_mode='same'))

# Fully connected layer 1 input shape(64,7,7)=(3136),output shape(1024)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))


# Fully connected layer 2 to shape (10) for 10 classed
model.add(Dense(10))
model.add(Activation('softmax'))



adam=Adam(lr=1e-4)

model.compile(optimizer=adam,
              loss="categorical_crossentropy",
              metrics=['accuracy']
)


print("------------------------Training------------------------")
model.fit(X_train,y_train,nb_epoch=1,batch_size=32)

print("\n------------------------Testing------------------------")
loss,accuracy=model.evaluate(X_test,y_test)

print("\ntest loss:",loss)
print("\ntest accuracy",accuracy)

4 代码分析

这次我们主要讲CNN(Convolutional Neural Networks)卷积神经网络在 keras 上的代码实现。 用到的数据集还是MNIST。不同的是这次用到的层比较多,导入的模块也相应增加了一些。

from keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten
首先是数据预处理和model的设置。 然后添加第一个卷积层,滤波器数量为32,大小是5*5,Padding方法是same即不改变数据的长度和宽带。 因为是第一层所以需要说明输入数据的 shape ,激励选择 relu 函数。代码如下

model.add(Convolution2D(
batch_input_shape=(64, 1, 28, 28),
filters=32,
kernel_size=5,
strides=1,
padding=‘same’, # Padding method
data_format=‘channels_first’,
))
model.add(Activation(‘relu’))
第一层 pooling(池化,下采样),分辨率长宽各降低一半,输出数据shape为(32,14,14)

model.add(MaxPooling2D(
pool_size=2,
strides=2,
padding=‘same’, # Padding method
data_format=‘channels_first’,
))
再添加第二卷积层和池化层

model.add(Convolution2D(64, 5, strides=1, padding=‘same’, data_format=‘channels_first’))
model.add(Activation(‘relu’))
model.add(MaxPooling2D(2, 2, ‘same’, data_format=‘channels_first’))
经过以上处理之后数据shape为(64,7,7),需要将数据抹平成一维,再添加全连接层1

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation(‘relu’))
添加全连接层2(即输出层)

model.add(Dense(10))
model.add(Activation(‘softmax’))
设置adam优化方法,loss函数, metrics方法来观察输出结果

model.compile(optimizer=adam,
loss=‘categorical_crossentropy’,
metrics=[‘accuracy’])

6 结果

Keras【Deep Learning With Python】CNN卷积神经网络(看不懂你打我系列)_第4张图片
Keras【Deep Learning With Python】CNN卷积神经网络(看不懂你打我系列)_第5张图片

你可能感兴趣的:(#,Keras)