端到端的MNIST训练数字识别 # -*- coding:utf-8 -*- import numpy as np from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense,Dropout,Flatten from keras.layers.convolutional import Conv2D,MaxPooling2D #读入数据 (X_train,y_train),(X_test,y_test) = mnist.load_data() # print(X_train[0].shape) # print(y_train[0]) X_train =X_train.reshape(X_train.shape[0],28,28,1).astype('float32') X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32') X_train/=255 X_test/=255 #输入层需要10个节点,最好把最好的目标数字0-9做成OneHot编码 def tran_y(y): y_ohe = np.zeros(10) y_ohe[y] = 1 return y_ohe #标签用onehot编码重新表示一下 y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))]) y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))]) #搭建卷积神经网络 model = Sequential() #添加一层卷积层,构建64个过滤器,每个过滤器覆盖范围是3*3*1.过滤器步长为1, # padding为0,并用relu进行非线性变换 model.add(Conv2D(filters=64,kernel_size=(3,3),strides=(1,1), padding = 'same',input_shape=(28,28,1),activation='relu')) #添加一层最大池化Max Pooling,在2*2格子中取最大值 model.add(MaxPooling2D(pool_size=(2,2))) #设立Dropout层,将dropout的概率设为0.5, model.add(Dropout(0.5)) #重复构造,搭建深度网络 model.add(Conv2D(128,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.5)) model.add(Conv2D(256,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.5)) #把当前节点展平 model.add(Flatten()) #构造全连接神经网络层 model.add(Dense(128,activation='relu')) model.add(Dense(64,activation='relu')) model.add(Dense(32,activation='relu')) model.add(Dense(10,activation='softmax')) #定义损失函数,一般分类问题的损失函数都选择采用交叉熵 model.compile(loss='categorical_crossentropy',optimizer='adagrad',metrics=['accuracy']) #批量放入样本,进行训练 model.fit(X_train,y_train_ohe,validation_data=(X_test,y_test_ohe),epochs=20,batch_size=128) #在测试集上评价模型的准确度 scroes = model.evaluate(X_test,y_test_ohe,verbose=0) print(scroes)
MNIST训练数字识别-Keras
最新推荐文章于 2021-05-10 21:19:38 发布