如何使用TensorFlow在Auto MPG数据集上构建DNN(深度神经网络)模型?
TensorFlow是目前最流行的深度学习框架之一,它提供了丰富的工具和API,可以方便地构建和训练各种深度模型。在这篇文章中,我们将探讨如何使用TensorFlow构建一个多层神经网络模型,对汽车MPG数据集进行回归预测。
更多Python教程,请阅读:Python 教程
数据预处理
在开始构建模型之前,我们需要对数据进行预处理。这里我们将使用Auto MPG数据集来进行训练和测试。数据集包含了398个样本,每个样本包含了8个特征。我们需要将这些特征归一化处理,将其转换成标准正态分布。
下面是对数据集进行预处理的代码,其中使用了Pandas和NumPy库来对数据进行处理。
import pandas as pd
import numpy as np
# 加载数据集
url = "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data"
data = pd.read_csv(url, header=None, sep='\s+', names=["MPG", "Cylinders", "Displacement", "Horsepower", "Weight",
"Acceleration", "Model Year", "Origin"])
# 对数据进行预处理
data = data.replace('?', np.nan)
data = data.dropna()
# 将类别型特征转换成数值型特征
data["Origin"] = data["Origin"].map({1: "USA", 2: "Europe", 3: "Japan"})
data = pd.get_dummies(data, prefix="", prefix_sep="")
# 将数据集分成训练集和测试集
train_dataset = data.sample(frac=0.8, random_state=0)
test_dataset = data.drop(train_dataset.index)
# 对特征进行归一化处理
train_stats = train_dataset.describe()
train_stats.pop("MPG")
train_stats = train_stats.transpose()
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
构建模型
在预处理完数据后,我们可以开始构建模型了。在这里,我们将使用Keras API来搭建多层感知器(MLP)模型,它包含了一个输入层,两个隐藏层和一个输出层。接下来,我们将逐步介绍如何构建这个模型。
首先,我们需要导入TensorFlow和Keras库。
import tensorflow as tf
from tensorflow import keras
然后,我们可以定义一个函数build_model来构建模型。这个函数将返回一个Keras模型实例,它由一个输入层、两个隐藏层和一个输出层组成。我们可以通过调整隐藏层的神经元数、激活函数和正则化参数等来改进模型性能。
def build_model():
model = keras.Sequential([
keras.layers.Dense(64, activation=tf.nn.relu, input_shape=[len(train_dataset.keys())]),
keras.layers.Dense(64, activation=tf.nn.relu),
keras.layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
return model
model = build_model()
model.summary()
输出模型的执行结果如下所示:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 64) 576
_________________________________________________________________
dense_1 (Dense) (None, 64) 4160
_________________________________________________________________
dense_2 (Dense) (None, 1) 65
=================================================================
Total params: 4,801
Trainable params: 4,801
Non-trainable params: 0
_________________________________________________________________
训练模型完成了模型的搭建后,我们可以开始训练模型了。在这里,我们将使用已经预处理过的训练集数据,通过fit方法对模型进行训练。同时,我们还设置了一些回调函数来监控模型的性能,例如EarlyStopping和TensorBoard。
# 定义回调函数
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs')
# 训练模型
history = model.fit(normed_train_data, train_labels, epochs=1000,
validation_split=0.2, verbose=0, callbacks=[early_stop, tensorboard_callback])
# 输出训练结果
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
print(hist.tail())
在训练模型之后,我们可以通过plotting来可视化模型的性能表现。在这里,我们将使用Matplotlib库来绘制训练集和验证集的损失值和MAE值的变化曲线。
import matplotlib.pyplot as plt
def plot_history(history):
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
plt.figure()
plt.xlabel('Epoch')
plt.ylabel('Mean Abs Error [MPG]')
plt.plot(hist['epoch'], hist['mae'], label='Train Error')
plt.plot(hist['epoch'], hist['val_mae'], label='Val Error')
plt.ylim([0, 5])
plt.legend()
plt.figure()
plt.xlabel('Epoch')
plt.ylabel('Mean Square Error [MPG^2]')
plt.plot(hist['epoch'], hist['mse'], label='Train Error')
plt.plot(hist['epoch'], hist['val_mse'], label='Val Error')
plt.ylim([0, 20])
plt.legend()
plt.show()
plot_history(history)
测试模型
最后,我们将测试集数据输入到训练好的模型中,通过evaluate方法计算模型的测试误差。同时,我们还可以使用predict方法来预测新的数据。在这里,我们将输出前10个样本的真实值和预测值。
# 测试模型
loss, mae, mse = model.evaluate(normed_test_data, test_labels, verbose=0)
print("Testing set Mean Abs Error: {:5.2f} MPG".format(mae))
# 预测新数据
test_predictions = model.predict(normed_test_data).flatten()
# 输出前10个样本的真实值和预测值
print(test_labels[:10])
print(test_predictions[:10])
结论
本文介绍了如何在TensorFlow中使用Keras API构建深度神经网络模型,并对Auto MPG数据集进行了回归预测。在模型训练过程中,我们采用了回调函数来监控模型的性能,通过可视化工具Matplotlib绘制了训练集和验证集的损失值和MAE值的变化曲线。最终,在测试集上对模型进行了测试,并输出了前10个样本的真实值和预测值。