欢迎光临散文网 会员登陆 & 注册

嗨大成带你认识卷积神经网络

2020-06-15 17:51 作者:嗨大成  | 我要投稿

动画

喜欢请关注我

认识卷积神经网络

首先我们先需要先了解全连接网络和部分连接网络的概念。

对于小图像将每个节点和隐藏层的每个节点都是有连接的,小图像例如8X8的图像这样全连接没有问题。

如果是100X100的那么全连接的输入特征维10000个输入单元, 假设我们希望在隐藏层学习100个特征,那么就是10000*100

就是10的6次方的参数,这样无论是前向和后向传播都是难以接受。这种方式我们就叫全连接网络。将这神经元全连接的隐藏层叫做全连接网络(full connect layer),也叫FC层。

为了提升性能,节省时间,神经元之间的连接进行限制,用部分全连接网络概念。

卷积

CNN,为什么要进行卷积首先,我们把图像100X100,进行随机抽取一个小块,来看看学学这小块的特征,假设我们抽取的图像大小为5X5,然后我建立一个更小的3X3的矩阵,3X3的矩阵我们称为卷积核(kernel),矩阵如图表示


5X5 图像

3X3卷积核


我们把3X3的卷积核从5X5的第一个位置开始滑动,比如我们将这个卷积放在(1,1)点,然后计算卷积核和图像的每个像素的值得乘积,并且求和:下面为公式,所以3X3的卷积核在5X5的第一个(1,1)的元素,每个元素的乘积和为4 结果为,按照卷积核继续右移动,乘积的和为3,依次类推所有的卷积核的乘积和的值为4

5X5通过3X3卷积核计算后的结果


公式

通过卷积核的运算,100X100的图像,学习特征维5X5的,假设隐藏层具有100个隐含单元,那么100X100的图像抽取的卷积特征维96X96,那么卷积到底什么意义?比如辨别一个图像是否一个人,我们可以判断人的轮廓,脸,脚身体等,如果都具备这些特征,我们可以确定为一个人,卷积核都是人工事先设定,是经过算法设计人员精心设计的,他们发现这样就可以设计的卷积核突出某个什么样的特征。

池化(Pooling)

我们希望对一个图像100*100进行卷积,如果使用5X5的卷积核进行计算,假设要学习250个特征

(100+5-1)X(100+5-1)的特征,最终特征数量为96X96*250个,这个计算效率不理想。

为此,我们需要优化,可以想到的平时统计分析的时候常用需要一个数值来计算统计。我们可以用求区域内最大值或者平均值,使用统计特征而不是通过原始特征来降低特征维度,最后还可以改善训练结果,防止过拟合,我们把统计聚和的方法叫做‘池化’

卷积神经网络结构图

首先是输入层,接着是卷积层,池化层,全连接层,最后是分类器做输出。卷积神经网络代表就是CNN

cnn卷积神经网络手稿



代码

from __future__ import print_function import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K import matplotlib.pyplot as plt import tensorflow as tf import datetime batch_size = 128 num_classes = 10 epochs = 12 # input image dimensions img_rows, img_cols = 28, 28 #the data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first':    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)    input_shape = (1, img_rows, img_cols) else:    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)    input_shape = (img_rows, img_cols, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3),                 activation='relu',                 input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.summary() model.compile(loss=keras.losses.categorical_crossentropy,              optimizer=keras.optimizers.Adadelta(),              metrics=['accuracy']) history=model.fit(x_train, y_train,          batch_size=batch_size,          epochs=epochs,          verbose=1,          validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs_range = range(epochs) plt.figure(figsize=(8, 8)) plt.subplot(1, 2, 1) plt.plot(epochs_range, acc, label='Training Accuracy') plt.plot(epochs_range, val_acc, label='Validation Accuracy') plt.legend(loc='lower right') plt.title('Training and Validation Accuracy') plt.subplot(1, 2, 2) plt.plot(epochs_range, loss, label='Training Loss') plt.plot(epochs_range, val_loss, label='Validation Loss') plt.legend(loc='upper right') plt.title('Training and Validation Loss') plt.show()

Summary的Model值各个层的参数

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 26, 26, 32)        320          
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 24, 24, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 12, 12, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 9216)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               1179776   
_________________________________________________________________
dropout_2 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                1290      
=================================================================
Total params: 1,199,882
Trainable params: 1,199,882
Non-trainable params: 0

训练和验证图


认识卷积神经网络,训练和验证图


嗨大成带你认识卷积神经网络的评论 (共 条)

分享到微博请遵守国家法律