作者:dmcm0001 | 来源:互联网 | 2024-12-03 18:24
数据预处理是机器学习任务中的关键步骤,特别是在深度学习领域。通过将数据归一化至特定范围,可以在梯度下降过程中实现更快的收敛速度和更高的模型性能。本文探讨了如何使用TensorFlow2.0和Keras进行有效的数据归一化。
在机器学习项目中,数据预处理是确保模型能够有效学习的重要环节。特别是对于深度学习模型而言,数据的归一化处理尤为重要,因为它能帮助模型更快地收敛,并提高最终的预测准确性。本文将介绍如何使用 TensorFlow 2.0 和 Keras 来实现这一过程。
在深度学习中,数据归一化是指将不同量级的数据调整到同一尺度,从而避免某些特征因为数值较大而主导模型的学习过程。这种做法有助于保持所有特征在训练过程中的相对重要性,进而提升模型的整体表现。
数据归一化的数学表达式通常为:
实战演练:使用 TensorFlow 2.0 和 Keras 进行数据归一化
为了更好地理解数据归一化的过程,我们将通过一个具体的例子来演示如何在 TensorFlow 2.0 中使用 Keras 对 Fashion MNIST 数据集进行归一化处理。以下是详细的代码示例:
首先,我们需要导入必要的库:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
print(module.__name__, module.__version__)
接下来,加载并分割数据集:
fashion_mnist = keras.datasets.fashion_mnist
(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()
x_valid, x_train = x_train_all[:5000], x_train_all[5000:]
y_valid, y_train = y_train_all[:5000], y_train_all[5000:]
print(x_valid.shape, y_valid.shape)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
检查原始数据的最大值和最小值:
print(np.max(x_train), np.min(x_train))
输出结果显示,训练集中的像素值范围为 0 到 255。为了使这些值更适合神经网络的输入,我们对其进行归一化处理:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(
x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
x_valid_scaled = scaler.transform(
x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
x_test_scaled = scaler.transform(
x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
在这个过程中,StandardScaler
类用于计算训练数据的均值和标准差,并据此对数据进行缩放。值得注意的是,训练数据使用 fit_transform
方法,而验证和测试数据则仅使用 transform
方法,以确保模型不会受到未见数据的影响。
归一化后,再次检查数据的最大值和最小值:
print(np.max(x_train_scaled), np.min(x_train_scaled))
接下来,构建并训练一个简单的多层感知器模型:
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.Dense(300, activation='relu'),
keras.layers.Dense(100, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
model.compile(loss='sparse_categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
history = model.fit(x_train_scaled, y_train, epochs=10,
validation_data=(x_valid_scaled, y_valid))
训练过程中的日志显示,随着训练的进行,模型的准确率逐渐提高,验证集上的表现也有所改善。这表明数据归一化确实有助于提升模型性能。
最后,可以通过绘制学习曲线来直观地观察模型的训练情况:
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)
plt.show()
plot_learning_curves(history)
此外,还可以对测试集进行评估,以了解模型在未见过的数据上的表现:
model.evaluate(x_test_scaled, y_test)
评估结果显示,模型在测试集上的准确率为 0.8825,进一步验证了数据归一化对模型性能的积极影响。