cnn实现minist数据集分类

对于minist数据集分类,相较于普通的全连接神经网络,CNN可以得到更高的准确率于更低的loss。在涉及图片的机器学习领域,CNN是目前最佳的解决方案。

CNN对minist数据集分类的代码:

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_class=10
epochs=2

img_rows,img_cols=28,28

(x_train,y_train),(x_test,y_test)=mnist.load_data()

if K.image_data_format=='channel_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')

y_train=keras.utils.to_categorical(y_train,num_class)
y_test=keras.utils.to_categorical(y_test,num_class)

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_class,activation='softmax'))

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(score)

网络结构使用常规的序贯模型

Conv2D是2维卷积层,kernel_size是卷积核的大小

MaxPool2D是池化层,用于数据量的缩减,MaxPool2D(pool_size=(2,2))意思为在2*2的卷积核中取最大值保留

Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。

后面即为常规的全连接神经网络的过程

你可能感兴趣的:(Python科学计算,ML)