代码参考书籍《深度学习实战:基于Tensorflow2和Keras(原书第2版)》
分别尝试了简单神经网络搭建、增加网络深度(层数)、使用dropout方式训练三种方法。
1、不使用隐藏层的简单神经网络
# -*- coding: utf-8 -*-
"""
不使用隐藏层的简单神经网络
@Time : 2022/3/22 23:10
@Auth : Eve
@File :01.py
@IDE :PyCharm
"""
import tensorflow as tf
import numpy as np
from tensorflow import keras
# 10个类别
NB_CLASSES = 10
# 28*28=784个神经元
RESHAPED = 784
EPOCHS = 200
BATCH_SIZE = 128
# 日志显示 0 为不在标准输出流输出日志信息
# 1 为输出进度条记录
# 2 为每个epoch输出一行记录
VERBOSE = 1
N_HIDDEN = 128
VALIDATION_SPLIT = 0.2
# load data
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(60000, RESHAPED)
X_test = X_test.reshape(10000, RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print(X_train.shape[0])
print(X_test.shape[0])
# 对标签进行one-hot编码处理
Y_train = tf.keras.utils.to_categorical(Y_train, NB_CLASSES)
Y_test = tf.keras.utils.to_categorical(Y_test, NB_CLASSES)
# build the model 创建模型
model = tf.keras.models.Sequential()
model.add(keras.layers.Dense(
NB_CLASSES,
input_shape=(RESHAPED,)
, kernel_initializer='zeros'
, name='dense_layer'
, activation='softmax'
))
# compiling the model 编译模型
model.compile(
optimizer='SGD'
, loss='categorical_crossentropy'
, metrics=['accuracy']
)
# training the model
model.fit(
X_train
, Y_train
, batch_size=BATCH_SIZE
, epochs=EPOCHS
, verbose=VERBOSE
, validation_split=VALIDATION_SPLIT
)
# evaluate the model
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy:{}'.format(test_acc))
# 关于输出的准确率
"""
accuracy: 0.9229 训练集准确率
val_accuracy: 0.9237 验证集准确率
Test accuracy:0.922399 测试集准确率
"""
tf.keras.utils.plot_model(model, to_file='model.png')
2、添加两层中间层的神经网络
# -*- coding: utf-8 -*-
"""
添加两层中间层的神经网络
@Time : 2022/3/23 22:14
@Auth : Eve
@File :01_add_dense.py
@IDE :PyCharm
"""
import tensorflow as tf
import numpy as np
from tensorflow import keras
# 10个类别
NB_CLASSES = 10
# 28*28=784个神经元
RESHAPED = 784
EPOCHS = 50
BATCH_SIZE = 128 # 这个参数可以修改,不一定是2的指数
# 日志显示 0 为不在标准输出流输出日志信息
# 1 为输出进度条记录
# 2 为每个epoch输出一行记录
VERBOSE = 1
N_HIDDEN = 120 # 这个参数可以修改,不一定是2的指数
VALIDATION_SPLIT = 0.2
# load data
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(60000, RESHAPED)
X_test = X_test.reshape(10000, RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print(X_train.shape[0])
print(X_test.shape[0])
# 对标签进行one-hot编码处理
Y_train = tf.keras.utils.to_categorical(Y_train, NB_CLASSES)
Y_test = tf.keras.utils.to_categorical(Y_test, NB_CLASSES)
# build the model 创建模型
model = tf.keras.models.Sequential()
# 加入两个隐藏层
model.add(
keras.layers.Dense(N_HIDDEN
, input_shape=(RESHAPED,)
, name='dense_layer_1'
, activation = 'relu'))
model.add(
keras.layers.Dense(N_HIDDEN
, name='dense_layer_2'
, activation = 'relu')
)
model.add(keras.layers.Dense(
NB_CLASSES
, name='dense_layer'
, activation='softmax'
))
model.summary()
# compiling the model 编译模型
model.compile(
optimizer='SGD'
, loss='categorical_crossentropy'
, metrics=['accuracy']
)
# training the model
model.fit(
X_train
, Y_train
, batch_size=BATCH_SIZE
, epochs=EPOCHS
, verbose=VERBOSE
, validation_split=VALIDATION_SPLIT
)
# evaluate the model
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy:{}'.format(test_acc))
"""
accuracy: 0.9721
val_accuracy: 0.9639
Test accuracy:0.964999
"""
3、添加dropout的神经网络
# -*- coding: utf-8 -*-
"""
添加dropout的神经网络
@Time : 2022/3/23 22:32
@Auth : Eve
@File :01_dropout.py
@IDE :PyCharm
"""
import tensorflow as tf
import numpy as np
from tensorflow import keras
# 10个类别
NB_CLASSES = 10
# 28*28=784个神经元
RESHAPED = 784
EPOCHS = 50
BATCH_SIZE = 128
# 日志显示 0 为不在标准输出流输出日志信息
# 1 为输出进度条记录
# 2 为每个epoch输出一行记录
VERBOSE = 1
N_HIDDEN = 128
VALIDATION_SPLIT = 0.2
DROPOUT=0.3
# load data
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(60000, RESHAPED)
X_test = X_test.reshape(10000, RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print(X_train.shape[0])
print(X_test.shape[0])
# 对标签进行one-hot编码处理
Y_train = tf.keras.utils.to_categorical(Y_train, NB_CLASSES)
Y_test = tf.keras.utils.to_categorical(Y_test, NB_CLASSES)
# build the model 创建模型
model = tf.keras.models.Sequential()
# 加入两个隐藏层
model.add(
keras.layers.Dense(N_HIDDEN
, input_shape=(RESHAPED,)
, name='dense_layer_1'
, activation = 'relu'))
# 添加丢弃
model.add(keras.layers.Dropout(DROPOUT))
model.add(
keras.layers.Dense(N_HIDDEN
, name='dense_layer_2'
, activation = 'relu')
)
# 添加丢弃
model.add(keras.layers.Dropout(DROPOUT))
model.add(keras.layers.Dense(
NB_CLASSES
, name='dense_layer'
, activation='softmax'
))
model.summary()
# compiling the model 编译模型
model.compile(
optimizer='SGD'
, loss='categorical_crossentropy'
, metrics=['accuracy']
)
# training the model
model.fit(
X_train
, Y_train
, batch_size=BATCH_SIZE
, epochs=EPOCHS
, verbose=VERBOSE
, validation_split=VALIDATION_SPLIT
)
# evaluate the model
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy:{}'.format(test_acc))
"""
accuracy: 0.9480
val_accuracy: 0.9651
Test accuracy:0.96280
"""
tf.keras.utils.plot_model(model, to_file='model_dropout.png')