文章代码转载自https://zhuanlan.zhihu.com/p/351180890
接上篇安装tensorflow,安装一下tensorflow 2.3.0版本,安装后确认一下version(因为tensorflow1.0和2.0区别还是蛮大的,import mnist数据集的方法不一样)
- 五折交叉
import tensorflow as tf
//载入MINST数据集
mnist = tf.keras.datasets.mnist
//划分训练集和测试集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
//定义模型结构和模型参数
model = tf.keras.models.Sequential([
//输入层28*28维矩阵
tf.keras.layers.Flatten(input_shape=(28, 28)),
//128维隐层,使用relu作为激活函数
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
//输出层采用softmax模型,处理多分类问题
tf.keras.layers.Dense(10, activation='softmax')
])
//定义模型的优化方法(adam),损失函数(sparse_categorical_crossentropy)和评估指标(accuracy)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
//训练模型,进行5轮迭代更新(epochs=5)
model.fit(x_train, y_train, epochs=5)
//评估模型
model.evaluate(x_test, y_test, verbose=2)
- 多层全连接神经网络mlp
import numpy as np
import tensorflow as tf
import datetime
np.random.seed(0)
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()
num_pixels = X_train.shape[1] * X_train.shape[2] # 784
#将二维数组拉成一维向量
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
X_train = X_train / 255
X_test = X_test / 255
y_train = tf.keras.utils.to_categorical(y_train) #转化为独热编码
y_test = tf.keras.utils.to_categorical(y_test)
num_classes = y_test.shape[1] # 10
#多层全连接神经网络模型
# model = tf.keras.Sequential([
# tf.keras.layers.Dense(num_pixels, input_shape=(num_pixels,),
# kernel_initializer='normal', activation='relu'),
# tf.keras.layers.Dense(784, kernel_initializer='normal', activation='relu'),
# tf.keras.layers.Dense(num_classes, kernel_initializer='normal',
# activation='softmax')
# ])
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(num_pixels, input_shape=(num_pixels,), kernel_initializer='normal', activation='relu'))
model.add(tf.keras.layers.Dense(784, kernel_initializer='normal', activation='relu'))
model.add(tf.keras.layers.Dense(num_classes, kernel_initializer='normal', activation='softmax'))
model.summary()
# model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
startdate = datetime.datetime.now() # 获取当前时间
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=200, verbose=2)
enddate = datetime.datetime.now()
print("训练用时:" + str(enddate - startdate))
- 卷积神经网络CNN
import numpy as np
import tensorflow as tf
import datetime
np.random.seed(0)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
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 = x_train/255
x_test = x_test/255
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
num_classes = y_test.shape[1]
#CNN
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(filters=32,kernel_size=(5,5),input_shape=(28,28,1),activation='relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(num_classes,activation='softmax'))
print(model.summary())
print("----------------------------------------------")
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
startDate = datetime.datetime.now()
model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=2,batch_size=200,verbose=2)
endDate = datetime.datetime.now()
print("time:"+str(endDate-startDate))