目录
1 概念
2 代码实现
2.1 导入库
2.2 加载数据
2.3 归一化
2.4 建立模型
2.5 编译模型
2.6 训练模型
2.7 评估模型
2.8 预测模型
3 使用独热编码完成fashion_mnist训练
3.1 导入库
3.2 读数据
3.3 转换独热编码
3.4 归一化
3.5 构建模型并编译
3.6 训练模型
3.7 评估模型
3.8 预测模型
上一章我们做的是softmax二分类,这次我们做softmax多分类
上面这是两个损失函数,当我们使用0,1,2,3这种数字做标签时,我们使用sparse_categorical_crossentropy,如果label使用独热编码我们使用categorical_crossentropy
下面这种编码方式就是独热编码
我们下面代码中用的是Fashion_MNIST,这个是包含衣服,鞋子,包这种图像的数据集
这个数据集包含了7w张图片,共有10个类别,大概是下面这个样子的
fashion_mnist是tensorflow中自带的数据集,它分为四个部分,分别为train_image(训练图像),train_label(训练标签),test_image(测试图像),test_label(测试标签)
第一次运行代码时会自动下载数据集,再一次使用则会直接使用
它自动下载会下载到这里,我当前的路径是这个,根据用户名不同会有所改变
C:\Users\MSI.keras\datasets
里面有四个压缩包,前两个是测试的图片与标签,后两个是训练的图片与标签
我们看一下train_image,train_label,test_image,test_label的shape
我们现在看一下train_image的第0张图片
我们在看一下第0张图片的数值情况
这个我就截取其中的一部分,发现它的取值范围为[0,255]
我们再看一下第0张图像对应的标签
发现显示出一个9,fashion_mnist中使用整形数据表示标签,我们这里的9代表鞋子,我们的label的取值范围为[0,9]一共十分类
我们讲train_image与test_image除255,这样我们的取值范围就为[0,1]
我们依然使用顺序模型
我们之前使用的层只有dense层,那个是处理一维数据的,现在我们的输入是(28,28),这个是个二维数据,所以我们第一层要使用Flatten(扁平层),这一层的目的是将其变成28*28的向量,这样我们这一层的结果就变为了1维数据,后面就能使用dense了
128是我们自定的神经元个数,这个没有一个最佳值,太小会欠拟合,太大会过拟合
这一层是输出层,由于我们是10分类所以我们在这里写10,如果是6分类就写6,后面的激活函数是softmax,只要是分类问题(不管是10分类还是6分类)就一定要用softmax,上一章我们提到了二分类,二分类用sigmod(当然2分类用softmax也不会报错,就是效果不好)
我们看一下整体的模型
我们可以看到Flatten这层是没有参数的,在这里只对数据进行转换 784 = 28 * 28 ,下一层dense层 100480 = 784 * 128 + 128
优化器使用adam,loss值使用sparse_categorical_crossentropy(标签是数字),我们在训练过程中检测其正确率
我们使用测试集对训练好的模型进行评估
我们最后进行预测一下,然后与原本的标签进行比对
这个是未经过处理的预测结果,结果中会包含10个值,这个值可以理解为每个分类的可能性,一般来讲,我们会选取10个值中的最大值然后获取其索引从而得到最终的结果
可以使用np.argmax()取出最大值的索引,我在这里就人工取最大值了[9,2,1,1,6,1,4,6,5]
我们可以用上面的结果和下面的实际值进行比对,发现正确率还是可以的(前9个都是正确的)
上面我们使用的是数字编码作为label,使用的loss为sparse_categorical_crossentropy,现在我们使用独热编码作为label,使用loss为categorical_crossentropy再做一遍
我们使用utils.to_categorical()将数字编码转换为独热编码
我们显示出来看一下
测试数据也应改为独热编码,后面进行评估时要用到
我们看刚刚那个鞋的标签
我们发现在第9位(从0数)的值置为1,我们没转变独热编码之前的label是9
与上面相同,只是更换了loss
这里我们要换掉label
我们在这使用np.argmax直接取出最大值索引
之后再对比一下,发现预测结果与实际结果相似