干货第一时间送达
![](http://mmbiz.qpic.cn/mmbiz_jpg/ow6przZuPIENb0m5iawutIf90N2Ub3dcPuP2KXHJvaR1Fv2FnicTuOy3KcHuIEJbd9lUyOibeXqW8tEhoJGL98qOw/640?wx_fmt=jpeg)
本书基于TensorFlow、Keras和scikit-learn,介绍了21个典型的人工智能应用场景。全书共3篇,分别是预测类项目实战篇、识别类项目实战篇和生成类项目实战篇。其中预测类项目包括房价预测、泰坦尼克号生还预测、共享单车使用情况预测、福彩3D中奖预测、股票走势预测等8个项目;识别类项目包括数字识别、人脸识别、表情识别、人体姿态识别等7个项目;生成类项目包括看图写话、生成电视剧剧本、风格迁移、生成人脸等6个项目。本文章将使用神经网络模型来实现房价预测,使用的是TensorFlow下的Keras的API代码。我们将使用Keras创建模型、训练模型、预测和对比图预览。Keras封装了一套高级的API用来构建深度学习模型,常用于快速实现原型和高级搜索;得益于Keras对开发者的友好性、模块化、可组合性和易于扩展的关键特征,使得Keras成为目前使用是较为广泛的深度学习开源框架,它的backend之一就是TensorFlow。Keras在2015年12月份就将其的TensorFlow的backend的API部分融合到了TensorFlow框架中,所以目前我们可以通过tf.keras或者独立的Keras库来使用它。通过TensorFlow提供的Keras接口下的datasets模块来加载数据,数据集是由卡内基梅隆大学维护的,它来自波士顿近郊房价数据。读者也可以在本书中1.1小节的介绍中的链接去查看后续更新的数据集。在tf.keras.datasets下加载的数据集和在链接中看到的数据集是一样格式的,只是年代不同。加载数据集代码如下:from tensorflow import keras(train_data, train_labels), (test_data, test_labels) = \keras.datasets.boston_housing.load_data()# np.random.random()表示在0.0到1.0之间返回指定个数的随机浮点数# np.argsort()表示返回对数组进行排序的索引order = np.argsort(np.random.random(train_labels.shape))train_data = train_data[order]train_labels = train_labels[order]# 对不同的范围和比例进行归一化处理,并且每个元素都要减去均值除以标准差# 模型虽然在没有特征归一化时也可以得到收敛,但是这会让训练更加困难,mean = train_data.mean(axis=0)std = train_data.std(axis=0)train_data = (train_data - mean) / stdtest_data = (test_data - mean) / stdprint("train_data.shape: {}, train_labels.shape: {}.".format(train_data.shape, train_labels.shape))print("test_data.shape: {}, test_labels.shape: {}.".format(test_data.shape, test_labels.shape))train_data.shape: (404, 13), train_labels.shape: (404,).test_data.shape: (102, 13), test_labels.shape: (102,).
在Keras中,我们创建神经网络模型,就是使用Sequential类来创建Keras模型。本次创建的模型比较简单,通过Dense类来创建神经网络层;对于输入层,层的深度是64个units,输入层必须传入input_shape参数,表示的是输入数据的特征维度的大小。激活函数(activation),我们指定的是修正线性单元(ReLU),它是神经网络中最常用的激活函数。当输入的值为正数时,导数不为0,返回它本身,这就允许在训练模型时进行基于梯度的学习,也会使计算变得更快。当输入的值为负数时,学习速度可能会变得很慢,甚至会使神经元直接失效;这是因为输入的值是小于0的值,计算它的梯度也为0,从而使其权重无法得到更新,那么在传播到下一个神经网络层的时候,返回的值为0就没有什么意义了。然后我们再添加一个隐藏层,这一层不需要input_shape参数了,因为在第一层时已经指定了;我们仍然设置是64个units,激活函数是ReLu。model = keras.Sequential([keras.layers.Dense(64, activation=tf.nn.relu,input_shape=(train_data.shape[1],)),keras.layers.Dense(64, activation=tf.nn.relu),# 使用RMSProp(均方根传播)优化器,它可以加速梯度下降,其中学习速度适用于每个参数optimizer = tf.train.RMSPropOptimizer(0.001)# mae(平均绝对误差)也是一般用在回归问题的测量/评估上model.compile(loss='mse', optimizer=optimizer, metrics=['mae'])输出模型架构,如图所示。全部的参数有5,121个,模型中的每一层参数都可以在表格的Param列看到;每一层的输出大小就是Output Shape,其中None表示是可变的batch size,它会在训练模型或者模型预测时被自动填充上具体的值。这个模型我们训练500次,并且将训练精确度和验证精确度记录在history对象中,以便于下面的绘图预览。我们自定义一个回调对象类,重写了on_epoch_end()方法,该方法会在每次epoch结束时调用。代码如下:# 自定义一个回调类,在每次epoch(代)结束时都会调用该函数class PrintDot(keras.callbacks.Callback):def on_epoch_end(self, epoch, logs):if epoch % 100 == 0: print('')# 参数4:validation_split,表示验证集分割比例,0.2表示20%的数据用于验证,80%的数据用于训练# 参数5:verbose,表示输出打印日志信息,0表示不输出打印任何日志信息# 参数6:callbacks,回调对象,这里我们使用自定义的回调类PrintDothistory = model.fit(train_data, train_labels, epochs=EPOCHS,validation_split=0.2, verbose=0,通过history对象,我可以读取到该模型训练时的误差数值,以便于来决定何时是最佳模型,何时应该停止训练。import matplotlib.pyplot as plt# 绘制图来显示训练时的accuracy和lossdef plot_history(history):plt.ylabel('Mean Abs Error [1000$]')plt.plot(history.epoch, np.array(history.history['mean_absolute_error']),plt.plot(history.epoch, np.array(history.history['val_mean_absolute_error']),
通过这个曲线图来看,大约在150到200次迭代时,训练损失值就没有怎么降低了。所以,这里我们用到一个降低过拟合技术叫做:早期停止(EarlyStopping),它会在指定的迭代次数时,如果依旧没有损失降低,模型性能提升的话,则自动终止训练。我们重新构建和训练该模型,在重新构建模型前,请先清除Keras的内存状态,最简单的办法就是重新运行Jupyter Notebook整个环境;如果使用终端的话,就重新启动该脚本程序。代码如下:# 设置早期停止,如果20次的迭代依旧没有降低验证损失,则自动停止训练early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=20)# 重新训练模型,此时的callbacks有两个回调函数,所以我们使用数组的形式传入它们history = model.fit(train_data, train_labels, epochs=EPOCHS,validation_split=0.2, verbose=0,callbacks=[early_stop, PrintDot()])图3 训练和验证模型时的平均绝对误差图,使用早期停止技术接下来,我们来测试下模型在测试集下的表现,这就需要对模型进行评估了。通过evaluate()函数,传入测试房屋特征数据集,测试房屋价格数据,计算测试集的平均绝对误差。代码如下:[loss, mae] = model.evaluate(test_data, test_labels, verbose=0)print("Testing set Mean Abs Error: ${:7.2f}".format(mae * 1000))Testing set Mean Abs Error: $2930.86然后,预测模型,通过predict()函数,传入测试房屋特征数据集,返回预测到的房屋价格;最后将这个返回的数据通过flatten()函数扁平化处理,以便于在绘制的散点图中显示。代码如下:test_predictions = model.predict(test_data).flatten()plt.scatter(test_labels, test_predictions)plt.xlabel('True Values [1000$]')plt.ylabel('Predictions [1000$]')plt.plot([-100, 100], [-100, 100])接下来,我们来看下真实的房屋价格数据和预测到的房屋价格数据对比,形成价格差的直方图。那我们就使用预测到的房价减去真实房价所得的差价,代码如下:error = test_predictions - test_labelsplt.xlabel("Prediction Error [1000$]")最后,我们再通过真实房价和预测的房价生成一张更直观的图来显示。函数plotVersusFigure()在上面的代码中已经定义过,这里就不再写了,代码如下:
plotVersusFigure(test_labels, test_predictions)通过以上分析,不管是用Scikit-learn的机器学习库来预测房价,还是使用Keras的神经网络模型来预测房价,真实的房价和预测的房价总是有些误差。所以我们能控制的就是在训练神经网络模型时,调整训练的超参数、迭代次数、网络层数和优化器等参数,以达到更好的适用于该房屋数据的预测模型。这里的数据量比较小,如果数据量更大一些,模型效果会更好。---------- 本文章摘自《深度学习训练营 21天实战》一书中,经授权发布。
![](http://mmbiz.qpic.cn/mmbiz_gif/p2XQ4YTnzgEicFAPZsak3Via8PWDk5VOdL4uyGeM1Mh5hVTsaOIiaqjcN2ynaXfM2ppXt976s1aswOmCOV8xGicokA/640?wx_fmt=gif)
如果你对深度学习感兴趣
快在留言区大声告诉我们
截止9月21日晚八点
留言获赞数最高的五位同学各赠一本
《深度学习训练营21天实践》
![](http://mmbiz.qpic.cn/mmbiz_gif/PW0wIHxgg3kHlA1TjoAzFyIhcjiaXA6wos9OerdfJmaxN05o9bmRS3BPlhiaUa0pq5SRMHDgfhyKUptwZSJa696g/640?wx_fmt=gif)
没有抽中的粉丝不要气馁,京东图书现有5折活动哦,点击下面链接,快快来抢购吧。
在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
![](http://mmbiz.qpic.cn/mmbiz_jpg/Q0FNTB1XHicyndHwRmuJX669E0lrGJ6MyIPlw7ficGYyjvVib64Sr8Bj3suouibmRyb79TFGcBtrnFrvSpLSb41OrQ/640?wx_fmt=jpeg)
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款 圈里有高质量教程资料、可答疑解惑、助你高效解决问题觉得有用,麻烦给个赞和在看~
![](http://mmbiz.qpic.cn/mmbiz_gif/gYUsOT36vfpFnEj3CMde0iaOKfGiaAmbfRRPePWld5pUR0niaibYOvNP5cx7nKS5I6180xeya4ZIYJClvHqSpQecqA/640?wx_fmt=gif)