Tensorflow 入门

发布日期:2026-07-11 11:48:04   来源 : 杭州电子商务研究院    浏览量 :9
杭州电子商务研究院 发布日期:2026-07-11 11:48:04  
9

介绍

Tensorflow 是一个机器学习库,研究人员使用它,也用于生产。在本指南中,我们将探索如何使用 Keras 后端在 Tensorflow 中执行简单的图像分类。图像分类是从一组预定义的标签(也称为标签或类别)中为输入图像分配单个标签的任务。阅读本指南后,您将清楚地了解图像分类的工作原理。对图像进行分类后,您可以在图像上绘制边界框。这称为图像定位。图像分类是自动驾驶汽车的基础,它创建了生成网络,可以帮助行业完成决策任务。

该任务可分为以下几个子任务。

  1. 数据准备

    1. 加载数据
    2. 探索性数据分析
    3. 正常化
    4. 重塑
    5. 标签编码
    6. 拆分训练集和验证集
  2. 构建 CNN 模型

    1. 构建顺序 CNN 模型
    2. 设置超参数
    3. 设置优化器
    4. 编译模型
    5. 拟合模型
  3. 评估模型

  4. 预测验证数据

    1. 预测验证数据的标签
    2. 使用预测标签和实际标签创建混淆矩阵
  5. 预测测试数据

  6. 保存预测

  7. 结论

  8. 进一步阅读

环境设置

本演示使用Google Colab。它提供免费的 GPU 和 TPU 来执行 ML/AI 任务。本指南的完整代码可在mnist中找到。首先,您需要从 Kaggle 帐户获取新的 API 令牌。然后,使用以下代码将 API 令牌文件作为 kaggle.json 上传到 Colab 中:

      from google.colab import files
files.upload()
    

下一步是安装 Google Drive 并将其更改为 Google Drive 中的所需目录。

      from google.colab import drive
import os

drive.mount("/content/gdrive")
os.chdir("/content/gdrive/My Drive/<path/of/google drive folder/>") #change dir
    

接下来,通过 pip 安装 Kaggle python 库。然后,创建一个名为 Kaggle 的目录,复制 API 令牌并设置权限。

      !pip install -q kaggle
!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/
!ls ~/.kaggle
!chmod 600 /root/.kaggle/kaggle.json # set permission
    

然后,使用以下命令下载 MNIST 数字识别器数据:

      !kaggle competitions download -c digit-recognizer
    

如果下载成功,当前工作目录中会有三个文件,分别为“train.csv”、“test.csv”和“sample_submission.csv”。这些数据可以直接从Kaggle 网站下载,并用于在不同环境设置中进行训练。

关于数据

MNIST 是一个手写数字图像数据库,每幅图像为 28x28 = 784 个像素。给定的数字识别器数据有 42000 张训练图像和 28000 张测试图像。数据以 CSV 格式表示,其中第一列是标签,其余 784 列表示像素值。每行代表单个图像。测试数据包含 784 列。任务是预测 28000 张测试图像的标签;标签是数字 0-9。

1.数据准备

A. 加载数据

读取以 CSV 格式存储的图像数据。pandas read_csv() 函数用于读取 CSV 文件。

      train = pd.read_csv("train.csv")
test=pd.read_csv("test.csv")
    

然后,通过删除标签列来准备训练数据。训练数据仅包含像素值。

      X_train = train.drop(["label"],axis = 1)
Y_train = train["label"]
X_test=test
    

B.探索性数据分析

读取数据后,检查数据的质量,你能发现训练图像中的 10 个类别是如何分布的吗?你能发现有多少个缺失值吗?下面的代码计算每个类别有多少个样本。

      g = sns.countplot(Y_train)
Y_train.value_counts()
    

接下来,我们将计算训练和测试数据中的空值数量。这将告诉我们数据中是否有任何损坏的图像。在这种情况下,没有空值,因此数据质量良好。

      X_train.isnull().any().describe()
    
      X_test.isnull().any().describe()
    

C. 规范化

这是一张灰度图像,像素强度值可能在 0-255 之间。为了使像素强度值在 0-1 范围内,我们将所有像素的强度值除以 255。这样做的目的是使所处理的值的范围保持一致,以避免精神分散或疲劳。

      X_train = X_train/255.0
X_test = X_test/255.0
    

D. 重塑

Keras 中的 Conv2D 层设计用于处理每个图像的三维。它们具有 4D 输入和输出。输入参数是样本数、宽度、高度以及特征或通道数。语法:reshape (nb_samples, width, height,nb_features)

      X_train = X_train.values.reshape(len(X_train), 28, 28,1)
X_test = X_test.values.reshape(len(X_test), 28, 28,1)
    

E. 标签编码

对标签进行编码时,将标签转换为独热编码。

Keras 函数“to_categorical()”以标签[0-9]作为输入,并将其转换为整数编码值的独热编码。

      from keras.utils.np_utils import to_categorical

Y_train = to_categorical(Y_train, num_classes = 10)
    

F. 拆分训练集和验证集

训练数据分为训练集和验证集。验证数据用于在将模型应用到实际数据之前评估模型的性能。以下代码将 10% 的训练数据随机移动到验证数据中。我们设置一个随机种子 =3 来初始化一个随机生成器,以随机选择验证数据。

      from sklearn.model_selection import train_test_split
# Set the random seed
random_seed = 3
X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=random_seed)
    

2.建立CNN模型

A.构建顺序CNN模型

i). 卷积运算

卷积用于从输入图像中提取特征。下图中,图像大小为 5x5,核大小为 3x3。核在图像上滑动以提取特征图。提取的特征图具有空间相关性。

ii)批量标准化

批量标准化用于将隐藏层中的值与其他所有值置于相同的尺度。为了区分橙子和柠檬,每个批次都会看到一组不同的值,并且它们的激活值也会不同。批量标准化通过将所有值置于相同的尺度来减少每个批次之间的依赖性。

iii)最大池化

最大池化提取了从卷积中获得的重要特征。最大池化在几次卷积后完成。在下面的代码中,使用了 2x2 最大池化。它在 2x2 中找到最大值并返回最高值。它还通过减小特征图的大小来减少网络中的参数数量。

iv)全局平均池化

对于 11x11x10 的传入张量特征图,取每个 11x11 矩阵切片的平均值,得到一个 10 维向量。这可以输入到全连接层,即代表 10 个类的单维向量。

v)ReLu 激活

ReLu 激活函数用于将所有正值传递到下一层,并确保负值被丢弃。任何小于零的值都是负值;零或大于零的值被视为正值。

      model = Sequential()
model.add(Conv2D(128, (3, 3), activation='relu', input_shape=(28,28,1))) # 26
model.add(BatchNormalization())

model.add(Conv2D(64, (3, 3), activation='relu')) # 24
model.add(BatchNormalization())

model.add(Conv2D(50, (3, 3), activation='relu')) # 22
model.add(BatchNormalization())

model.add(Conv2D(52, (3, 3), activation='relu')) # 20
model.add(BatchNormalization())

model.add(Conv2D(64, (3, 3), activation='relu')) # 18
model.add(BatchNormalization())

model.add(Conv2D(32, (3, 3), activation='relu')) # 16
model.add(BatchNormalization())

model.add(Conv2D(27, (3, 3), activation='relu')) # 14
model.add(BatchNormalization())

model.add(Conv2D(15, (3, 3), activation='relu')) # 12
model.add(BatchNormalization())

model.add(Conv2D(10, (3, 3), activation='relu')) # 9
model.add(BatchNormalization())

model.add(GlobalAveragePooling2D())

model.add(Activation('softmax'))
    

B.设置超参数

超参数是在学习过程之前设置的参数。CNN 中存在的超参数包括:

  • 学习率
  • 时期数 - 查看整个训练图像的次数
  • 批量大小- 每次提取特征图需要读取的图像数量

C.设置优化器

优化器用于更新权重和模型参数以最小化损失函数。Adam 代表自适应矩估计,之所以选择它,是因为其收敛速度快。

D. 编译模型

<div class="rich-text-editor text
以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据