深度学习基于tensorflow的服装图像分类训练(数据集:fashion-mnist)(代码片段)

林夕07 林夕07     2022-12-07     223

关键词:

活动地址:CSDN21天学习挑战赛

目录

前言

关于环境这里不再赘述,与【深度学习】从LeNet-5识别手写数字入门深度学习一文的环境一致。

了解Fashion-MNIST数据集

Fashion-MNIST数据集与MNIST手写数字数据集不一样。但他们都有共同点就是都是灰度图片。
Fashion-MNIST数据集是各类的服装图片总共10类。下面列出了中英文对应表,方便接下来的学习。

中文英文
t-shirtT恤
trouser牛仔裤
pullover套衫
dress裙子
coat外套
sandal凉鞋
shirt衬衫
sneaker运动鞋
bag
ankle boot短靴

下载数据集

使用tensorflow下载(推荐)

默认下载在C:\\Users\\用户\\.keras\\datasets路径下。

from tensorflow.keras import datasets

# 下载数据集
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

数据集分类

这里对从网上下载的数据集进行一个说明。

文件名数据说明
train-images-idx3-ubyte训练数据图片集
train-labels-idx1-ubyte训练数据标签集
t10k-images-idx3-ubyte测试数据图片集
t10k-labels-idx1-ubyte测试数据标签集

数据集格式

训练数据集共60k张图片,各个服装类型的数据量一致也就是说每种6k。
测试数据集共10k张图片,各个服装类型的数据量一致也就是说每种100。

数据集均采用28281的灰度照片。

采用CPU训练还是GPU训练

一般来说有好的显卡(GPU)就使用GPU训练因为,那么对应的你就要下载tensorflow-gpu包。如果你的显卡较差或者没有足够资金入手一款好的显卡就可以使用CUP训练。

区别

(1)CPU主要用于串行运算;而GPU则是大规模并行运算。由于深度学习中样本量巨大,参数量也很大,所以GPU的作用就是加速网络运算。

(2)CPU计算神经网络也是可以的,算出来的神经网络放到实际应用中效果也很好,只不过速度会很慢罢了。而目前GPU运算主要集中在矩阵乘法和卷积上,其他的逻辑运算速度并没有CPU快。

使用CPU训练

# 使用cpu训练
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

使用CPU训练时不会显示CPU型号。

使用GPU训练

gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0]  # 如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True)  # 设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0], "GPU")

使用GPU训练时会显示对应的GPU型号。

预处理

最值归一化(normalization)

关于归一化相关的介绍在前文中有相关介绍。 最值归一化与均值方差归一化

# 将像素的值标准化至0到1的区间内。
    train_images, test_images = train_images / 255.0, test_images / 255.0
    return train_images, test_images

升级图片维度

因为数据集是灰度照片,所以我们需要将[28,28]的数据格式转换为[28,28,1]

# 调整数据到我们需要的格式
    train_images = train_images.reshape((60000, 28, 28, 1))
    test_images = test_images.reshape((10000, 28, 28, 1))

显示部分图片

首先需要建立一个标签数组,然后绘制前20张,每行5个共四行
注意:如果你执行下面这段代码报这个错误:TypeError: Invalid shape (28, 28, 1) for image data。那么你就使用我下面注释掉的那句话。

from matplotlib import pyplot as plt

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
                   'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

plt.figure(figsize=(20, 10))
for i in range(20):
    plt.subplot(4, 5, i + 1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    #plt.imshow(train_images[i].squeeze(), cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

绘制结果:

建立CNN模型

from tensorflow_core.python.keras import Input, Sequential
from tensorflow_core.python.keras.layers import Conv2D, Activation, MaxPooling2D, Flatten, Dense


def simple_CNN(input_shape=(32, 32, 3), num_classes=10):
    # 构建一个空的网络模型,它是一个线性堆叠模型,各神经网络层会被顺序添加,专业名称为序贯模型或线性堆叠模型
    model = Sequential()

    # 卷积层1 
    model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))

    # 最大池化层1
    model.add(MaxPooling2D((2, 2), strides=(2, 2), padding='same'))

    # 卷积层2
    model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'))

    # 最大池化层2
    model.add(MaxPooling2D((2, 2), strides=(2, 2), padding='same'))

    # 卷积层3
    model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'))

    # flatten层常用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。
    model.add(Flatten())

    # 全连接层 对特征进行提取
    model.add(Dense(units=64, activation='relu'))

    # 输出层
    model.add(Dense(10))
    return model


网络结构

包含输入层的话总共9层。其中有三个卷积层,俩个最大池化层,一个flatten层,俩个全连接层。

参数量

总共参数为319k,训练时间比LeNet-5较长。建议采用GPU训练。

Total params: 257,162
Trainable params: 257,162
Non-trainable params: 0

训练模型

训练模型,进行10轮,将模型保存到1.h5文件中。后期可以直接加载模型继续训练。

from tensorflow_core.python.keras.models import load_model
from Cnn import simple_CNN
import tensorflow as tf


model = simple_CNN(train_images, train_labels)
model.summary()  # 打印网络结构

model.compile(optimizer='adam',
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                  metrics=['accuracy'])
model.save("1.h5")
history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))

训练结果:测试集acc为91.64%。从效果来说该模型还是不错的。

模型评估

对训练完模型的数据制作成曲线表,方便之后对模型的优化,看是过拟合还是欠拟合还是需要扩充数据等等。

acc = history.history['accuracy']
    val_acc = history.history['val_accuracy']

    loss = history.history['loss']
    val_loss = history.history['val_loss']

    epochs_range = range(10)

    plt.figure(figsize=(12, 4))
    plt.subplot(1, 2, 1)
    plt.plot(epochs_range, acc, label='Training Accuracy')
    plt.plot(epochs_range, val_acc, label='Validation Accuracy')
    plt.legend(loc='lower right')
    plt.title('Training and Validation Accuracy')

    plt.subplot(1, 2, 2)
    plt.plot(epochs_range, loss, label='Training Loss')
    plt.plot(epochs_range, val_loss, label='Validation Loss')
    plt.legend(loc='upper right')
    plt.title('Training and Validation Loss')
    plt.show()

运行结果:

记录|深度学习100例-卷积神经网络(cnn)服装图像分类|第3天(代码片段)

记录|深度学习100例-卷积神经网络(CNN)服装图像分类|第3天1.服装图像分类效果图原始训练图如下:测试图:预测标签及实际标签如下:可以看到正确预测训练损失/准确度图:2.源码#深度学习100例-卷积神... 查看详情

深度学习-图像分类

... 应用框架:图像分类,目标检测,分割提取。底层:TensorFlow,Keras,Cuda,C/C++上层:C#.NETWinform 【图像分类】识别一张图片是否为某个类型的物体/形态/场景。 对不同纹理的图案(肉眼都不易快速辨识)进行标记分类... 查看详情

基于深度学习的图像分类中代码的error

...factionwithdeeplearning在本次的project中我利用NVIDIADIGITS网页版深度学习框架实现深度神经网络的简单可视化训练和设计,但出现过很多error1、搭环境问题我在Ubuntu的系统下进行配置,安装cuda、cudnn、caffe及其相关依赖错误一:makeall-j8... 查看详情

tensorflow2图像分类-flowers数据深度学习模型保存读取参数查看和图像预测(代码片段)

....2optimizer_weights使用之前一篇代码:  原文链接:Tensorflow2图像分类-Flowers数据及分类代码详解这篇文章中,经常有人问到怎么保存 查看详情

基于深度学习的图像语义分割方法综述

近年来,深度学习技术已经广泛应用到图像语义分割领域.主要对基于深度学习的图像语义分割的经典方法与研究现状进行分类、梳理和总结.根据分割特点和处理粒度的不同,将基于深度学习的图像语义分割方法分为基于区域分类... 查看详情

深度学习系列用paddlepaddle和tensorflow进行图像分类

...paddle的源码解析。这篇主要跟大家讲讲如何用PaddlePaddle和Tensorflow做图像分类。  在卷积神经网络中,有五大经典模型,分别是:LeNet-5,AlexNet,GoogleNet,Vgg和ResNet。本文首 查看详情

tensorflow学习

改系列只为记录我学习udacity中深度学习课程!!1.整个课程分为四个部分,如上图所示。第一部分将研究逻辑分类器,随机优化以及实际数据训练。第二部分我们将学习一个深度网络,和使用正则化技术去训练一个更大的模型第... 查看详情

深度学习keras+tensorflow实现猫和狗图像分类

...VGG,Resnet)做过了,迁移学习我就不说了,我自己用Keras+Tensorflow完整的实现了一遍。 准备工作:数据集:Dogsvs.Cats 注册激活困难,自己想想办法,Ps:实在注册不了百度云有 查看详情

tensorflow1.0学习:用别人训练好的模型来进行图像分类

...来图像分类。下载地址:https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip下载完解压后,得到几个文件:其中的classify_image_graph_def.pb文件就是训练好的 查看详情

手把手教你:基于深度残差网络(resnet)的水果分类识别系统(代码片段)

...码。主要功能如下:数据预处理,生成用于输入TensorFlow模型的TFRecord的数据。模型构建及训练,使用tensorflow.keras构建深度残差网络。预测水果分类并进行模型评估。如各位童鞋需要更换训练数据,完全可以根据源... 查看详情

深度学习基于tensorflow的小型物体识别训练(数据集:cifar-10)(代码片段)

...集的区别下载数据集官方下载地址(较慢)使用tensorflow下载(推荐)使用迅雷(推荐)采用CPU训练还是GPU训练区别使用CPU训练使用GPU训练显示部分图片建立CNN模型网络结构参数量主函 查看详情

tensorflow实现基于深度学习的图像补全

目录■简介■ 第一步:将图像理解为一个概率分布的样本  你是怎样补全缺失信息的呢?  但是怎样着手统计呢?这些都是图像啊。  那么我们怎样补全图像? ■ 第二步:快速生成假图像 &nb... 查看详情

pytorch深度学习实战|基于resnet的花卉图片分类

...实现效果,就直接使用将这些共有部分整理成框架的TensorFlow和Keras来完成开发工作。TensorFlow是Google公司开源的基于数据流图的科学计算库,适合用于机器学习、深度学习等人工智能领域。Keras是一个用Python编写的高级神... 查看详情

21个项目玩转深度学习:基于tensorflow的实践详解03—打造自己的图像识别模型(代码片段)

...Net,GoogLeNet,VGGNet,ResNet每个方法都有很多版本的衍生,tensorflow中带有封装好各方法和网络的函数,只要喂食自己的训练集就可以完成自己的模型,感觉超方便!!!激动!!!因为虽然原理流程了解了,但 查看详情

基于cnn卷积神经网络的tensorflow+keras深度学习的人脸识别(代码片段)

基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别前言项目实现效果补充模型数据嵌入模型CNN神经网络模型项目概述项目运行流程核心环境配置项目核心代码详解目录核心代码设置数据集目录收集人脸识别数据——UUID格... 查看详情

tensorflow-彩色图像识别(代码片段)

...文做法与上一篇案例基本一模一样,算是复习了一下tensorflow解决简单分类问题的基本流程了。设置GPU- 查看详情

深度学习-图像分割

... 应用框架:图像分类,目标检测,分割提取。底层:TensorFlow,Keras,Cuda,C/C++上层:C#.NETWinform 【图像分割】把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标。 下图是系统的截图: 通过对几十... 查看详情

深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全

原文地址:ImageCompletionwithDeepLearninginTensorFlowbyBrandonAmos原文翻译与校对:@MOLLY&&寒小阳([email protected])时间:2017年4月。出处:http://blog.csdn.net/han_xiaoyang/article/details/52665396声明:版权所有,转载请联系作者并 查看详情