TensorFlow入门:基本分类任务
基本分类任务
官网教程:基本分类教程
主要步骤
- 加载数据集
- 数据探索
- 数据预处理
- 构建模型
- 模型训练
- 评估准确率
- 模型预测
时尚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:数据下载失败
错误提示:下载数据时出现连接超时错误。
处理方法:
- 手动下载数据集文件: - 训练标签文件:train-labels-idx1-ubyte.gz - 训练图片文件:train-images-idx3-ubyte.gz - 测试标签文件:t10k-labels-idx1-ubyte.gz - 测试图片文件:t10k-images-idx3-ubyte.gz
- 将下载的文件放置在路径:~/.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问题
