目录
Fashion MNIST数据集
输入的每个值经过每一个神经元。
一、获取Mnist数据集
# 1、获取Fashion Mnist数据集
mnist = tf.keras.datasets.fashion_mnist
print(mnist)
二、加载数据集
# 2、加载数据集
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 查看数据集
import matplotlib.pyplot as plt
print(training_images)
print(training_labels)
print(test_images)
print(test_labels)
plt.imshow(training_images[0])
三、数据归一化
数据归一化,把数据区间定位到[0,1]。
# 3、数据归一化
training_images = training_images / 255.0
test_images = test_images / 255.0
# print(training_images)
# print(test_images)
四、设计神经网络模型
设计神经网络模型(输入层、隐藏层、输出层)。
# 4、设计神经网络模型(分类)
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),
#输入层
tf.keras.layers.Dense(128, activation=tf.nn.relu),
#隐藏层 神经元数量 激活函数
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
#输出层 输出特征数量 激活函数
每一层神经元都需要一个激活函数 activation:告诉它们输出什么。有很多选项,但目前只用这些(relu和softmax)。
Relu激活函数: "如果X>0返回X,否则返回0"--所以它的作用是它只把大于0的值传递给网络中的下一层,小于0的也当作0。
Softmax激活函数:接收到一组值后,选择其中最大的一个输出。例如,上一层的输出为[0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05],Softmax就省去了你在其中寻找最大的值,并把它变成[0,0,0,0,0,1,0,0,0,0,0] **Softmax**的意思是 "如果X>0,则返回X,否则返回0" -- 所以它的作用是只把0或更大的值传给下一层的网络。--其目的是节省大量的编码!
得到的模型:
五、模型编译&&训练
5-1、编译
# 5-1、编译
model.compile(optimizer = tf.optimizers.Adam(), loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])
# 编译 优化器 损失函数 交叉熵损失函数 监控
# 优化器:Adam优化算法(寻找全局最优点)
# 损失函数:交叉熵损失函数(用来评估当前训练得到的概率分布与真实分布的差异情况)
5-2、训练
# 5-2、训练
model.fit(training_images, training_labels, epochs=5)
# 训练特征集 训练目标集 执行5次
六、模型评估
# 6、模型评估
model.evaluate(test_images, test_labels)
对没有训练过的数据测试时,可以发现,准确率有所降低,模型对于未见过的数据,可能不会像见过的数据那样处理的那么好。
七、模型预测
1、 对全部测试集分类
# 1、得到全部分类预测
classification = model.predict(test_images)
2、获取某一个分类的结果
# 2、获取某一个分类的结果(最大概率值即为预测结果)
print('单图各标签的概率:', classification[0])
result = np.argmax(classification[0])
3、显示预测结果
# 显示结果
print('预测结果:', result)
print('真实结果:', test_labels[0])
plt.imshow(test_images[0])
八、防止过拟合
在训练的过程中,不希望出现过拟合的情况。
设置误差小于0.4的时候停止训练。
# 定义终止训练的函数,myCallback这个类继承了tf.keras.callbacks.Callback
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs={}):
if(logs.get('loss')<0.4): #损失小于0.4时终止训练
print('\loss is low so cancelling training!')
self.model.stop_training = True
# 5-2、训练
model.fit(training_images, training_labels, epochs=5, callbacks=[myCallback()])
# 训练特征集 训练目标集 执行5次 回调函数
防止过拟合。
总代码
import tensorflow as tf
print(tf.__version__)
# 1、获取Fashion Mnist数据集
mnist = tf.keras.datasets.fashion_mnist
# print(mnist)
# 2、加载数据集
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 查看数据集
# import matplotlib.pyplot as plt
# print(training_images)
# print(training_labels)
# print(test_images)
# print(test_labels)
# plt.imshow(training_images[0])
# 3、数据归一化
training_images = training_images / 255.0
test_images = test_images / 255.0
# print(training_images)
# print(test_images)
# 4、设计神经网络模型(分类)
# 定义终止训练的函数,myCallback这个类继承了tf.keras.callbacks.Callback
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs={}):
if(logs.get('loss')<0.4): #损失小于0.4时终止训练
print('\loss is low so cancelling training!')
self.model.stop_training = True
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28,28)),
#输入层
tf.keras.layers.Dense(128, activation=tf.nn.relu),
#隐藏层 神经元数量 激活函数
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
#输出层 输出特征数量 激活函数
model.build((None,90, 7))
model.summary()
# 5、编译&&训练
# 5-1、编译
model.compile(optimizer = tf.optimizers.Adam(), loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])
# 编译 优化器 损失函数 交叉熵损失函数 监控
# 优化器:Adam优化算法(寻找全局最优点)
# 损失函数:交叉熵损失函数(用来评估当前训练得到的概率分布与真实分布的差异情况)
# 5-2、训练
model.fit(training_images, training_labels, epochs=5, callbacks=[myCallback()])
# 训练特征集 训练目标集 执行5次 回调函数
# 6、模型评估
model.evaluate(test_images, test_labels)
# 7、模型预测
import numpy as np
import matplotlib.pyplot as plt
# 预测单图片
# 1、得到全部分类预测
classification = model.predict(test_images)
# 2、获取某一个分类的结果(最大概率值即为预测结果)
print('单图各标签的概率:', classification[0])
result = np.argmax(classification[0])
# 显示结果
print('预测结果:', result)
print('真实结果:', test_labels[0])
plt.imshow(test_images[0])