1.首先我们引入并且处理数据集
a.引入框架
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
matplotlib inline的作用是当你调用matplotlib.pyplot的plot或是imshow等函数时可以jupyter notebook会在console里面直接绘制出图片
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data()
这样数据就从加载进来了,无论使用任何一个训练框架,针对一组数据我们都要做的是(1.加载数据并且处理 2.建模 3.训练 4.预测)
查看train_images、train_labels的维度


从图a以及图b我们可以看到train_images的数据结构很简单就是表示有60000张图片,每个图片的大小是28*28,下面我们来看看训练的结构数据情况

这个简单的说就是10个分类,总的概括一下就是说我们有60000张28*28的图片,分类处理一下最终分成10个类
还有一个重要的步骤不要忘记了归一化,所谓的归一化就是把数据都映射到[0,1]范围内,以加快训练时候的效率
train_images = train_images/255
test_images = test_images/255
2.数据准备完了,我们可以开始进行建模了

这个是我做的一个比较简单的模型,所谓的简单就是没有对模型进行过拟合以及欠拟合的一个优化
首先先来看一下次模型的描述

我来一句一句的解释
创建一个模型
model = tf.keras.Sequential()
将输入的数据进行一个处理,也可以说成是降维,就是把(None, 28, 28)的数据处理成计算全连接所需要的(None, 28*28)的数据结构结构,空间上来说就是把一个立体的物体压扁成了一个二维的
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
下面加入两层全连接网络
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(128, activation='relu'))
最后一层的输出其实也是全连接层的最后一层,激活函数用了softmax
model.add(tf.keras.layers.Dense(10, activation='softmax'))
我来概括一下为啥是softmax, 就是把最后的a*w + b 再经过一个函数这个函数叫做softmax

可以看到 所映射出来的结构之间的总的和是1, 为什么是这个函数而不用其他的函数哪,我们可以仔细的来看这个函数,里面有个比较厉害的角色e 指数,不要小看这个指数,这个里面有个两个作用,1.不用考虑负数的问题 2.反向传播的时候求导数比较简单,其实还有其他的作用,目前我还没有想到
至此模型其实创建的也差不多了,如果说是结束了,也可以这么说,但是我们如果只是拿这个预测就太离谱了,因为没有优化函数,就是我们通常所说的损失函数以及预测的得分

其中Adam是学习速率的一个设置,loss就是损失函数的设置, metrics对于得分做了一个设置,当然可以加入其它的,在此不做过多的阐述
我们来看loss,这个设置其实说白了就是一个交叉熵函数,一个概率的处理并且是一组离散型的数据的处理,用

交叉熵刻画的是实际输出概率和期望输出概率的距离,交叉熵的值越小,则两个概率分布越接近,即实际与期望差距越小, 由此函数来作为损失函数无论是梯度下降做参数的优化是非常的合适.
最后一切准备就绪了,开始训练了
history = model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels))
网友评论