1)手写数据集
手写数据集是深度学习中,最基础应用最广泛的数据集。
手写数据集内置在keras中
import keras
from keras import layers
import matplotlib. pyplot as plt
import numpy as np
import keras.datasets.mnist as mnist
# 1)加载数据集
(train_image, train_label),(test_image,test_label) = mnist.load_data()
# 2)验证数据集的性质
train_image.shape,train_label.shape
test_image.shape, test_label.shape
plt.imshow(train_image[0])
# 3)初始化一个模型
model = keras.Sequential()
model.add(layers.Flatten()) #(60000, 28, 28) ----> (600000, 28*28)
# 建立全链接层, 使用relu激活
model.add(layers.Dense(64, activation='relu'))
# 添加一个分类层,使用softmax激活。输出0-9是个数字,所以单元数为10
model.add(layers.Dense(10, activation='softmax'))
# 4)编译模型
# 当label是顺序编码的时候,计算交叉熵是 sparse_categorical_crossentropy
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
# 5)训练模型
model.fit(train_image, train_label, epochs=50, batch_size=512)
# batch_size = 512, 一个batch一个batch的去训练,不是将所有数据拿进去训练
# 原因:计算机的性能或者说计算机的内存容量在处理大型数据的时候,比如说图片数据的时候,
# 将全部数据加载进去,可能会引起内存爆炸。
model.evaluate(train_image,train_label)
model.evaluate(test_image,test_label)
# 预测test数据集的前10张图片
model.predict(test_image[:10])
# 预测的
np.argmax(model.predict(test_image[:10]),axis=1)
# 实际的
test_label[:10]
# 模型的优化 ----- 进行过拟合
model = keras.Sequential()
model.add(layers.Flatten()) #(60000, 28, 28) ----> (600000, 28*28)
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
model.fit(train_image,train_label,epochs=50,batch_size=512, validation_data=(test_image,test_label))
# 模型的再优化 ---- 增加过拟合
model = keras.Sequential()
model.add(layers.Flatten()) #(60000, 28, 28) ----> (600000, 28*28)
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
model.fit(train_image,train_label,epochs=200,batch_size=512, validation_data=(test_image,test_label))
2)代码分析:
1、验证数据集特性:
train_image.shape, train_label.shape
、
test_image.shape,test_label.shape
plt.imshow(train_image[0])
2、初始化模型
model = keras.Sequential()
model.add(layers.Flatten()) #(60000, 28, 28) ----> (600000, 28*28)
# 建立全链接层, 使用relu激活
model.add(layers.Dense(64, activation='relu'))
# 添加一个分类层,使用softmax激活。输出0-9是个数字,所以单元数为10
model.add(layers.Dense(10, activation='softmax'))
3、编译模型
# 当label是顺序编码的时候,计算交叉熵是 sparse_categorical_crossentropy
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
4、训练模型
model.fit(train_image, train_label, epochs=50, batch_size=512)
batch_size = 512, 一个batch(批次)一个batch(批次)的去训练,不是将所有数据拿进去训练
原因:计算机的性能或者说计算机的内存容量在处理大型数据的时候,比如说图片数据的时候,
将全部数据加载进去,可能会引起内存爆炸。
5、预测模型
# 预测test数据集的前10张图片
model.predict(test_image[:10])
# 预测的
np.argmax(model.predict(test_image[:10]),axis=1)
# 实际的
test_label[:10]
预测的
实际的
发现,倒数第三位预测错误了。7 和9长得比较像
3)模型的优化
1、初始化模型
添加多个隐藏层 --- 增加网络容量直到过拟合
# 模型的优化 ----- 进行过拟合
model = keras.Sequential()
model.add(layers.Flatten()) #(60000, 28, 28) ----> (600000, 28*28)
model.add(layers.Dense(64, activation='relu'))
# 多添加的两个隐藏层
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
2、编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
3、训练模型
model.fit(train_image,train_label,epochs=50,batch_size=512, validation_data=(test_image,test_label))
参数 “ validation_data ” 在训练过程中观察其 在测试数据集上的表现
4)模型的再优化与抑制过拟合
添加DropOut层抑制过拟合
# 模型的再优化 ---- 增加过拟合
model = keras.Sequential()
model.add(layers.Flatten()) #(60000, 28, 28) ----> (600000, 28*28)
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
model.fit(train_image,train_label,epochs=200,batch_size=512, validation_data=(test_image,test_label))
# 后续工作:继续增大网络容量,直到过拟合
参考《3.8 网络参数选择的总原则》