一、卷积神经网络
1、与全连接神经网络相比,卷积神经网络的优势体现在两个方面:(1)减少了参数:在全连接的结构下,相邻网络层的两点之间互联,参数非常多,尤其是面对图像输入这样的数据结构;CNN能够大大降低参数的数量级,加快收敛,使训练复杂度大大下降,也减轻了过拟合,提高了模型的泛化能力。(2)更适用于二维结构的数据格式:全连接网络将整个图像“压平”成一个向量,这种操作忽略了图像的“二维空间特性”,图像在x和y轴方向的构成是有意义的,这些特征(局部特征)是需要被提取的,卷积操作就很好的应对了这种局部特征提取。 2、优点:稀疏连接、参数共享、等变表示(输入发生位移时卷积模型依然可以提取到相同的特征。参数共享赋予了卷积网络对平移的容忍性。)。 3、卷积操作是对应元素相乘再相加。
from keras
import Input
from keras
.models
import Sequential
from keras
.layers
import Conv1D
,Conv2D
,Conv3D
model
=Sequential
()
'''
# #序列数据 指定了长度10 如果没有指定seq_length,那么输入的是一个长度不固定的序列
# seq_length=10
# model.add(Conv1D(64,3,activation='relu',input_shape=(seq_length,128)))
# #输入数据为一个三维数组 表示长和宽都为224的彩色图像
#Conv2D 第一个参数64是卷积核filters 必须指定 ,第二个参数(3,3)是卷积核的尺寸 kernel_size=(3,3)或 kernel_size=3 表示3×3的卷积核 必须指定,
#stride 步长 默认为1 和kernel_size表达形式一样,表示卷积核沿宽度和高度方向的步长
#padding 填充 只有两个值 padding=“same”表示会有填充的操作 保持输出图像的尺寸和输入图像的尺寸一致,如果设置为padding=“valid”表示不做填充 默认为valid
#激活函数 activation 默认为线性激活函数 即将卷积层的结果直接输出
#指定卷积层的输入
'''
input_img
=Input
(shape
=(224,224,3))
conv_layer
=Conv2D
(64,(1,1))(input_img
)
model
.add
(Conv2D
(64,(3,3),activation
='relu'))
'''
#池化层 pool_size滑动窗口尺寸 strides通常设置为1 为步长
#接收上一层输出的特征图作为输入,即对输入取最大值MaxPooling和平均值AveragePooling后输出本层的特征图
'''
from keras
.layers
.pooling
import MaxPool2D
from keras
.layers
.pooling
import AveragePooling2D
model
.add
(MaxPool2D
(pool_size
=(2,2),strides
=1))
'''
在卷积网络的最后使用,当卷积层和池化层完成特征的提取和处理后,全连接层整合特征来进行最后的预测
其接收的输入是一维数组,所以从卷积层、池化层到全连接层还需要加入一层Flatten层来将输入“压平” 把多维的输入一维化
Flatten层只作用于图像特征上,不影响批量数据的大小
'''
from keras
.layers
import Dense
,Flatten
model
.add
(Flatten
())
model
.add
(Dense
(10,activation
='softmax'))
from keras
import backend
as K
if K
.image_data_format
()=='channels_last':
bn_axis
=3
else:
bn_axis
=1
print(bn_axis
)
二、使用卷积神经网络处理手写体分类问题
import keras
from keras
.datasets
import mnist
from keras
.models
import Sequential
from keras
.layers
import Dense
,Dropout
,Flatten
from keras
.layers
import Conv2D
,MaxPool2D
from keras
import backend
as K
batch_size
=128
num_classes
=10
epochs
=12
img_rows
,img_cols
=28,28
(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
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
(MaxPool2D
(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'))
print(model
.summary
())
model
.compile(loss
=keras
.losses
.categorical_crossentropy
,optimizer
=keras
.optimizers
.Adadelta
(),metrics
=['accuracy'])
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])
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
conv2d_1 (Conv2D) (None, 24, 24, 64) 18496
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 12, 12, 64) 0
_________________________________________________________________
dropout (Dropout) (None, 12, 12, 64) 0
_________________________________________________________________
flatten (Flatten) (None, 9216) 0
_________________________________________________________________
dense (Dense) (None, 128) 1179776
_________________________________________________________________
dropout_1 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 1,199,882
Trainable params: 1,199,882
Non-trainable params: 0
_________________________________________________________________
None
Epoch 1/12
469/469 [==============================] - 78s 167ms/step - loss: 2.2852 - accuracy: 0.1757 - val_loss: 2.2475 - val_accuracy: 0.3065
Epoch 2/12
469/469 [==============================] - 79s 168ms/step - loss: 2.2207 - accuracy: 0.2906 - val_loss: 2.1707 - val_accuracy: 0.4844
Epoch 3/12
469/469 [==============================] - 80s 170ms/step - loss: 2.1409 - accuracy: 0.3968 - val_loss: 2.0703 - val_accuracy: 0.5835
Epoch 4/12
469/469 [==============================] - 78s 165ms/step - loss: 2.0348 - accuracy: 0.4717 - val_loss: 1.9353 - val_accuracy: 0.6532
Epoch 5/12
469/469 [==============================] - 76s 162ms/step - loss: 1.8967 - accuracy: 0.5258 - val_loss: 1.7613 - val_accuracy: 0.7023
Epoch 6/12
469/469 [==============================] - 76s 162ms/step - loss: 1.7293 - accuracy: 0.5703 - val_loss: 1.5583 - val_accuracy: 0.7390
Epoch 7/12
469/469 [==============================] - 76s 162ms/step - loss: 1.5520 - accuracy: 0.6059 - val_loss: 1.3491 - val_accuracy: 0.7705
Epoch 8/12
469/469 [==============================] - 76s 163ms/step - loss: 1.3812 - accuracy: 0.6368 - val_loss: 1.1568 - val_accuracy: 0.7939
Epoch 9/12
469/469 [==============================] - 79s 169ms/step - loss: 1.2330 - accuracy: 0.6641 - val_loss: 0.9980 - val_accuracy: 0.8077
Epoch 10/12
469/469 [==============================] - 77s 165ms/step - loss: 1.1182 - accuracy: 0.6842 - val_loss: 0.8751 - val_accuracy: 0.8202
Epoch 11/12
469/469 [==============================] - 77s 164ms/step - loss: 1.0237 - accuracy: 0.7052 - val_loss: 0.7818 - val_accuracy: 0.8301
Epoch 12/12
469/469 [==============================] - 78s 166ms/step - loss: 0.9473 - accuracy: 0.7223 - val_loss: 0.7095 - val_accuracy: 0.8389
test loss: 0.709541916847229
test accuracy: 0.8389000296592712