当前位置:首页 > 随笔 > 正文内容

TensorFlow入门:基本分类任务

访客 随笔 2026年7月10日 1

基本分类任务

官网教程:基本分类教程

主要步骤

  1. 加载数据集
  2. 数据探索
  3. 数据预处理
  4. 构建模型
  5. 模型训练
  6. 评估准确率
  7. 模型预测

时尚MNIST数据集

  • 经典MNIST数据集的替代品,常用于计算机视觉的入门任务
  • 包含60000张训练图片和10000张测试图片
  • 每张图片为28x28像素的灰度图像
  • 涵盖10个类别,包括T恤、裤子、毛衣等
  • 数据集链接:Keras数据集TensorFlow文档GitHub仓库

tf.keras简介

  • Keras是一个高级API,用于构建和训练深度学习模型
  • tf.keras是TensorFlow中的Keras实现,兼容大部分Keras代码
  • TensorFlow中的tf.keras版本与PyPI中的Keras版本可能不同
  • 文档链接:TensorFlow Keras API

过拟合问题

过拟合是指模型在训练数据上表现良好,但在新数据上表现较差的现象。

示例代码

GitHub代码示例:基本分类代码

# 基于TensorFlow 1.12.0的示例代码
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
import os

# 配置日志级别
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 查看TensorFlow和Keras版本
print("TensorFlow版本: {} - Keras版本: {}".format(tf.__version__, keras.__version__))

# 加载时尚MNIST数据集
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

# 定义类别名称
class_names = ['T恤', '裤子', '毛衣', '连衣裙', '外套',
              '凉鞋', '衬衫', '运动鞋', '包', '短靴']

# 数据探索
print("训练集图片数量: {}".format(train_images.shape))
print("训练集标签数量: {}".format(len(train_labels)))
print("训练集标签范围: {}".format(train_labels))
print("测试集图片数量: {}".format(test_images.shape))
print("测试集标签数量: {}".format(len(test_labels)))
print("测试集标签范围: {}".format(test_labels))

# 数据预处理
plt.figure(figsize=(4, 4))
plt.imshow(train_images[0], cmap=plt.cm.binary)
plt.colorbar()
plt.grid(False)
plt.show()

train_images = train_images / 255.0
test_images = test_images / 255.0

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

# 模型构建
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer=tf.train.AdamOptimizer(),
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

# 模型训练
model.fit(train_images, train_labels,
          epochs=5,
          verbose=2)

# 模型评估
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('测试损失: {} - 测试准确率: {}'.format(test_loss, test_acc))

# 模型预测
predictions = model.predict(test_images)
single_prediction = model.predict(np.expand_dims(test_images[0], axis=0))
print("单个预测结果: {}".format(single_prediction))
print("预测类别: {} - 类别名称: {}".format(np.argmax(single_prediction), class_names[np.argmax(single_prediction)]))
print("是否正确: {}".format(test_labels[0] == np.argmax(single_prediction)))

问题处理

问题1:数据下载失败

错误提示:下载数据时出现连接超时错误。

处理方法:

  1. 手动下载数据集文件: - 训练标签文件:train-labels-idx1-ubyte.gz - 训练图片文件:train-images-idx3-ubyte.gz - 测试标签文件:t10k-labels-idx1-ubyte.gz - 测试图片文件:t10k-images-idx3-ubyte.gz
  2. 将下载的文件放置在路径:~/.keras/datasets/fashion-mnist/

代码示例:

import os
import gzip
import numpy as np
from pathlib import Path

def load_data():
    # 定义数据文件路径
    base_url = "file:///" + str(Path.cwd()) + "\\"
    files = [
        'train-labels-idx1-ubyte.gz',
        'train-images-idx3-ubyte.gz',
        't10k-labels-idx1-ubyte.gz',
        't10k-images-idx3-ubyte.gz'
    ]
    
    # 下载并保存文件
    paths = []
    for fname in files:
        path = os.path.join(base_url, fname)
        paths.append(gzip.open(path, 'rb'))
    
    # 加载训练标签
    with paths[0] as f:
        y_train = np.frombuffer(f.read(), np.uint8, offset=8)
    
    # 加载训练图片
    with paths[1] as f:
        x_train = np.frombuffer(f.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)
    
    # 加载测试标签
    with paths[2] as f:
        y_test = np.frombuffer(f.read(), np.uint8, offset=8)
    
    # 加载测试图片
    with paths[3] as f:
        x_test = np.frombuffer(f.read(), np.uint8, offset=16).reshape(len(y_test), 28, 28)
    
    return (x_train, y_train), (x_test, y_test)

# 加载数据
(train_images, train_labels), (test_images, test_labels) = load_data()

问题2:解压.gz文件失败

错误提示:"OSError: Not a gzipped file"

处理方法:检查.gz文件是否完整无损,必要时重新下载。

参考链接:GitHub问题

标签: TensorFlow

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。