tensorflow2.0教程(6)--油耗预测实战
程序员文章站
2022-06-06 08:04:48
...
- 数据集结构,其中产地,1表示美国,2表示欧洲,3表示日本。
- Auto MPG 数据集一共记录了398项数据,下载数据集后,先对数据进行初步的处理。
#导入模块
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, losses
#下载数据集
dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
#设置表头
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
'Acceleration', 'Model Year', 'Origin']
#读取csv文件
raw_dataset = pd.read_csv(dataset_path,names=column_names,na_values = "?",comment='\t',sep=" ",skipinitialspace=True)
#浅复制
dataset = raw_dataset.copy()
#删除空白行
dataset = dataset.dropna()
#统计空白数据
dataset.isna().sum()
#将Origin字段换成USA、Europe和Japan
#先删除并返回Origin这一列
origin = dataset.pop("Origin")
#根据origin列来写入新的3个列
dataset['USA'] = (origin == 1)*1.0
dataset['Europe'] = (origin == 2)*1.0
dataset['Japan'] = (origin == 3)*1.0
#按照8:2的比例切分训练集和测试集
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
#移动MPG字段为标签数据
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
#统计训练集的各个字段数值的均值和标准差,并完成数据的标准化
train_stats = train_dataset.describe()
train_stats = train_stats.transpose()
#标准化数据
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
#打印出训练集和测试集的大小
print(normed_train_data.shape,train_labels.shape)
print(normed_test_data.shape,test_labels.shape)
#利用切分的训练集数据构建数据集对象
train_db = tf.data.Dataset.from_tensor_slices((normed_train_data.values,train_labels.values))
#随机打散,批量化
train_db = train_db.shuffle(100).batch(32)
- 创建网络
创建一个3层的全连接网络,其中,输入X的特征共有9种,第一层输入节点数为9,第一层、第二层的输出节点设计为64、64,由于只有一种预测值,输出层节点设计为1。考虑MPG属于实数范围,因此**函数可以不加,也可以添加ReLU**函数。
class Network(keras.Model):
# 回归网络
def __init__(self):
super(Network, self).__init__()
# 创建3个全连接层
self.fc1 = layers.Dense(64, activation='relu')
self.fc2 = layers.Dense(64, activation='relu')
self.fc3 = layers.Dense(1)
def call(self, inputs, training=None, mask=None):
# 依次通过3个全连接层
x = self.fc1(inputs)
x = self.fc2(x)
x = self.fc3(x)
return x
- 训练与测试
model = Network()
#通过build函数完成内部张量的创建,其中None为任意的batch数量,9为输入特征长度
model.build(input_shape=(None, 9))
#打印网络信息
model.summary()
#创建优化器,指定学习率
optimizer = tf.keras.optimizers.RMSprop(0.001)
train_mae_losses = []
test_mae_losses = []
for epoch in range(200):
#遍历一次训练集
for step, (x,y) in enumerate(train_db):
#梯度记录器
with tf.GradientTape() as tape:
out = model(x)
#计算MSE
loss = tf.reduce_mean(losses.MSE(y, out))
#计算MAE,平均绝对误差衡量模型的性能
mae_loss = tf.reduce_mean(losses.MAE(y, out))
#打印训练误差
if step % 10 == 0:
print(epoch, step, float(loss))
#计算梯度,并更新
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
train_mae_losses.append(float(mae_loss))
out = model(tf.constant(normed_test_data.values))
test_mae_losses.append(tf.reduce_mean(losses.MAE(test_labels, out)))
plt.figure()
plt.xlabel('Epoch')
plt.ylabel('MAE')
plt.plot(train_mae_losses, label='Train')
plt.plot(test_mae_losses, label='Test')
plt.legend()
# plt.ylim([0,10])
plt.legend()
plt.savefig('auto.svg')
plt.show()
结果
推荐阅读
-
《ElasticSearch6.x实战教程》之简单搜索、Java客户端(上)
-
js es6系列教程 - 新的类语法实战选项卡(详解)
-
spring mvc实战系列教程(6)--处理日期转换
-
《ElasticSearch6.x实战教程》之简单的API
-
《ElasticSearch6.x实战教程》之简单搜索、Java客户端(上)
-
tensorflow2.0教程(6)--油耗预测实战
-
《ElasticSearch6.x实战教程》之父-子关系文档
-
js es6系列教程 - 新的类语法实战选项卡(详解)
-
《ElasticSearch6.x实战教程》之简单的API
-
spring mvc实战系列教程(6)--处理日期转换