切换视频源:

从头开始做一个汽车状态分类器2 搭建模型

作者: 莫烦 编辑: 莫烦 2017-12-14

学习资料:

上次 我们已经处理好了需要用到的数据, 这就已经解决了一大堆问题了. 在机器学习/深度学习中, 其实花时间最多的不是训练, 而是数据的预处理. 大多数人都感叹, 如果搭建模型训练花了10分钟, 那处理数据就得花一天. 哈哈哈. 你已经攻克了最难的地方了. 这节内容, 就是非常容易, 我们搭建一个模型, 训练, 并可视化它.

导入数据

我们使用 tensorflow 搭建神经网络 (Tensorflow 教程), 其实你也可以按我的 Pytorch 教程 使用 Pytorch 来编写这个网络, 没太多差别. 然后使用 matplotlib 可视化学习过程, 使用之前写好的 data_processing 来导入, 加工数据. 因为我们的数据都是类别数据, 所以我们将要使用的数据都是 onehot 形式的数据.

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import data_processing

data = data_processing.load_data(download=True)
new_data = data_processing.convert2onehot(data)

加工好数据以后, 为了比较严谨地测试模型的准确率, 我们首先打乱数据的顺序, 然后将训练和测试数据以 7/3 比例分开.

# prepare training data
new_data = new_data.values.astype(np.float32)       # change to numpy array and float32
np.random.shuffle(new_data)
sep = int(0.7*len(new_data))
train_data = new_data[:sep]                         # training data (70%)
test_data = new_data[sep:]                          # test data (30%)

搭建网络

接着我们就搭建神经网络, input 数据的后面4个是真实数据的4类型的 onehot 形式. 我们添加两层隐藏层, 用 softmax 来输出每种类型的概率. 使用 tensorflow 的功能计算 loss 和 accuracy.

# build network
tf_input = tf.placeholder(tf.float32, [None, 25], "input")
tfx = tf_input[:, :21]
tfy = tf_input[:, 21:]

l1 = tf.layers.dense(tfx, 128, tf.nn.relu, name="l1")
l2 = tf.layers.dense(l1, 128, tf.nn.relu, name="l2")
out = tf.layers.dense(l2, 4, name="l3")
prediction = tf.nn.softmax(out, name="pred")

loss = tf.losses.softmax_cross_entropy(onehot_labels=tfy, logits=out)
accuracy = tf.metrics.accuracy(          # return (acc, update_op), and create 2 local variables
    labels=tf.argmax(tfy, axis=1), predictions=tf.argmax(out, axis=1),)[1]
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = opt.minimize(loss)

sess = tf.Session()
sess.run(tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()))

car_classifier2-1.png

训练网络

搭建好图, 然后通过 tensorboard 检查一下有没有错误, 最后就能开始训练啦. 通过4000次循环, 这里我们使用 Mini-batch update, 先随机生成 batch 的索引, 然后在 train_data 中选择数据当作这次的 batch. 这样运算起来比较快. 还有更快的方式, 比如使用 epoch 在每次 epoch 的时候 shuffle 一次数据, 然后在这个 shuffle 完的数据中按先后索引 batch 数据. 这都是使用 numpy 进行 mini-batch 运行速度上的经验之谈了.

for t in range(4000):
    # training
    batch_index = np.random.randint(len(train_data), size=32)
    sess.run(train_op, {tf_input: train_data[batch_index]})

    if t % 50 == 0:
        # testing
        acc_, pred_, loss_ = sess.run([accuracy, prediction, loss], {tf_input: test_data})
        print("Step: %i" % t,"| Accurate: %.2f" % acc_,"| Loss: %.2f" % loss_,)

可视化学习过程

可视化的代码, 我不在这里呈现了, 想看代码的朋友来我的 github. 这个可视化展示的是在整个训练过程中, 原本 target 有多少这种类型的数据, 我们发现, 其实每种车状况的数据量还是不同的, 虽然有点 imbalance 的问题, 但是貌似模型没有被这种 imbalance 问题给带偏. 这是好事. 要不然, 我们还要对这套模型或者数据做手脚, 来解决 imbalance 问题.

好啦, 我们现在就已经成功的走过了一遍分类器的实践. 我们发现, 在机器学习中, 搭建模型和训练并不一定是最难的地方, 很多时候处理和分析数据也是很麻烦很繁琐的. 我们需要把握数据的规律, 寻找数据的正确表达形式. 好让神经网络比较容易接受.

实战:从头开始做一个汽车状态分类器


降低知识传递的门槛

莫烦很常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛免费 奉献我的所学正是受这种态度的影响。 通过 【赞助莫烦】 能让我感到认同,我也更有理由坚持下去。