欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tensorflow2.0教程(6)--油耗预测实战

程序员文章站 2022-06-06 08:04:48
...
  1. 数据集结构,其中产地,1表示美国,2表示欧洲,3表示日本。

tensorflow2.0教程(6)--油耗预测实战

  1. 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)
  1. 创建网络
    创建一个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
  1. 训练与测试
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()                

结果

tensorflow2.0教程(6)--油耗预测实战

相关标签: tensorflow2.0教程