52. TensorFlow 汽车评估分类#
52.1. 介绍#
前面的实验已经学习了如何使用 TensorFlow 搭建人工神经网络,本次挑战将由你独立完成一个开放性的分类预测练习。
52.2. 知识点#
TensorFlow 构建神经网络
张量数据处理转换
损失函数,优化器
TensorFlow 构建人工神经网络的实验中,你已经学习了使用 TensorFlow 构建神经网络的一般步骤。本次挑战提供了 UCI 汽车评估数据集,你需要使用该数据集自行构建一个神经网络,并最终完成训练。
首先,导入该数据集,并简单处理。
wget -nc https://cdn.aibydoing.com/aibydoing/files/car.data
import pandas as pd
# 加载数据集
df = pd.read_csv("car.data", header=None)
# 设置列名
df.columns = ["buying", "maint", "doors", "persons", "lug_boot", "safety", "class"]
df.head()
buying | maint | doors | persons | lug_boot | safety | class | |
---|---|---|---|---|---|---|---|
0 | vhigh | vhigh | 2 | 2 | small | low | unacc |
1 | vhigh | vhigh | 2 | 2 | small | med | unacc |
2 | vhigh | vhigh | 2 | 2 | small | high | unacc |
3 | vhigh | vhigh | 2 | 2 | med | low | unacc |
4 | vhigh | vhigh | 2 | 2 | med | med | unacc |
数据集包含 6 个特征及
class
目标列。特征表示了汽车的价格及一些技术规格,而目标则是对样本的安全性评估,是一个多分类数据集。
挑战先对数据集完成训练集和测试集划分:
from sklearn.model_selection import train_test_split
X = df.iloc[:, :-1] # 特征
y = df["class"] # 目标
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
((1382, 6), (346, 6), (1382,), (346,))
接下来,将由你独立完成神经网络的构建,并最终得到分类准确率结果。
开放型挑战
挑战:使用 TensorFlow 构建一个合理的全连接人工神经网络,完成汽车安全性评估分类任务。
规定:你需要使用前面学习过的 TensorFlow 函数及方法完成网络的构建,训练,预测及评估。自行选择数据处理方式,神经网络结构,损失函数,优化方法等。数据预处理等非主要代码允许少量使用其他类库提供的函数及操作。
开放型挑战没有思路引导过程,有更大的自由度和灵活性,更锻炼独立解决问题能力。这可能会涉及到一些课程外的知识点,需要你拥有一定的探索精神和独立解决问题的能力。
参考答案 Exercise 52.1
X_train = pd.get_dummies(X_train).values
X_test = pd.get_dummies(X_test).values
y_train = pd.get_dummies(y_train).values
y_test = pd.get_dummies(y_test).values
X_train.shape, X_test.shape, y_train.shape, y_test.shape
import tensorflow as tf
def fully_connected(inputs, weights, biases):
"""
inputs -- 输入 Variable
weights -- 权重项 Variable
biases -- 截距项 Variable
"""
layer = tf.add(tf.matmul(inputs, weights), biases) # 输入 x 权重 + 截距
output = tf.nn.relu(layer) # RELU 激活
return output
x = tf.placeholder(tf.float32, [None, 21]) # 输入特征张量占位符
# 全连接层 1
W1 = tf.Variable(tf.random.uniform([21, 15])) # 随机初始化权重
b1 = tf.Variable(tf.random.uniform([15]))
fc1 = fully_connected(x, W1, b1)
# 全连接层 2
W2 = tf.Variable(tf.random.uniform([15, 4]))
b2 = tf.Variable(tf.random.uniform([4]))
outs = fully_connected(fc1, W2, b2)
outs # 输出
y = tf.placeholder(tf.float32, [None, 4]) # 真实值标签占位符
# 交叉熵损失函数,reduce_mean 的目的是对每个样本的计算结果求平均
loss = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits_v2(logits=outs, labels=y))
loss
train_step = tf.train.AdamOptimizer(0.01).minimize(loss)
train_step
acc = tf.reduce_mean(tf.cast(tf.math.in_top_k(
outs, tf.math.argmax(y, 1), k=1), tf.float32)) # 准确率计算
iters = 1000 # 迭代次数
feed_dict_train = {x: X_train, y: y_train} # 训练数据
feed_dict_test = {x: X_test, y: y_test} # 测试数据
init = tf.global_variables_initializer() # 初始化全局变量
with tf.Session() as sess:
sess.run(init)
for i in range(iters):
if (i+1) % 100 == 0: # 每间隔 100 次打印 loss 值
print("Iters [{}/{}], Train Acc [{:.3f}], Test Acc [{:.3f}]".format(
i+1, iters, acc.eval(feed_dict=feed_dict_train), acc.eval(feed_dict=feed_dict_test)))
sess.run(train_step, feed_dict=feed_dict_train)
最终,挑战期望得到合理迭代次数下的测试集准确率和损失结果。示例如下:
期望输出
Epoch [000/500], Accuracy: [0.17], Loss: [9.9333]
Epoch [100/500], Accuracy: [0.93], Loss: [0.1228]
Epoch [200/500], Accuracy: [0.93], Loss: [0.1056]
Epoch [300/500], Accuracy: [0.93], Loss: [0.1025]
Epoch [400/500], Accuracy: [0.94], Loss: [0.1003]
Epoch [500/500], Accuracy: [0.94], Loss: [0.0992]
相关链接
○ 欢迎分享本文链接到你的社交账号、博客、论坛等。更多的外链会增加搜索引擎对本站收录的权重,从而让更多人看到这些内容。