from keras.models import Sequential
from keras.layers import Input, Dense, Dropout, Activation
from keras.models import Model
from keras.optimizers import SGD
from keras.datasets import mnist
from keras.layers import Conv2D, MaxPooling2D, Flatten
import numpy as np
tBatchSize = 100
'''第一步:选择模型'''
nn = Sequential() # 采用贯序模型
'''第二步:构建网络层'''
nn.add(Conv2D(32,(3,3), activation='relu', input_shape=(28,28,1)))
nn.add(MaxPooling2D(pool_size=(2, 2),strides=1))
nn.add(Conv2D(64,(3,3), activation='relu'))
nn.add(MaxPooling2D(pool_size=(2, 2)))
nn.add(Conv2D(128,(3,3), activation='relu'))
nn.add(MaxPooling2D(pool_size=(2, 2)))
nn.add(Conv2D(256,(3,3), activation='relu'))
nn.add(MaxPooling2D(pool_size=(2, 2)))
nn.add(Flatten())
nn.add(Dense(500))
nn.add(Activation('relu'))
nn.add(Dropout(0.5))
nn.add(Dense(500))
nn.add(Activation('relu'))
nn.add(Dropout(0.5))
nn.add(Dense(500))
nn.add(Activation('relu'))
nn.add(Dense(10))
nn.add(Activation('softmax'))
nn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
'''第四步:训练'''
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] , X_train.shape[2],1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] , X_test.shape[2],1)
Y_train = (np.arange(10) == y_train[:, None]).astype(int)
Y_test = (np.arange(10) == y_test[:, None]).astype(int)
X_train = X_train/256.0
X_test = X_test / 256.0
nn.fit(X_train, Y_train, batch_size=tBatchSize, epochs=100,
shuffle=True, verbose=2, validation_split=0.3)