作者:射命丸咲 Python 与 机器学习 爱好者
知乎专栏:https://zhuanlan.zhihu.com/carefree0910-pyml
个人网站:http://www.carefree0910.com
往期阅读:
从零开始学人工智能(5)--Python · 神经网络(四)· 网络
从零开始学人工智能(6)--Python · 神经网络(五)· Cost & Optimizer
最终成品的 GitHub 地址:
https://github.com/carefree0910/MachineLearning/tree/master/NN
本章用到的 GitHub 地址:
https://github.com/carefree0910/MachineLearning/blob/master/Zhihu/NN/two/Network.py
这一章主要是将上一章提到的一些拓展实现出来。由于这些和神经网络的算法本身没有太大关系而更多只是编程能力的考验,所以我不会说得太详细而只会说一个大概思路
分 batch 训练
预测时分批预测
还是因为内存问题。实现的方法有两种:一种是比较常见的按个数分组,一种是我采取的按数据大小分组。换句话说:
常见做法有一个显而易见的缺点:如果单个数据很庞大的话、这样做可能还是会爆内存
实现稍微有些繁复、主要是要考虑 tensorflow 的 session 的生存周期(不知道能不能这样说……)、但其实思路是平凡的。下面姑且贴一下核心代码,但建议跳过(喂)
def _get_prediction(self, x, batch_size=1e6, out_of_sess=False):
single_batch = int(batch_size / np.prod(x.shape[1:]))
if not single_batch:
single_batch = 1
if single_batch >= len(x):
if not out_of_sess:
return self._y_pred.eval(feed_dict={self._tfx: x})
with self._sess.as_default():
x = x.astype(np.float32)
return self.get_rs(x).eval(feed_dict={self._tfx: x})
if not out_of_sess:
rs = [self._y_pred.eval(
feed_dict={self._tfx: x[:single_batch]})]
else:
rs = [self.get_rs(x[:single_batch])]
count = single_batch
while count < len(x):
count += single_batch
if count >= len(x):
if not out_of_sess:
rs.append(self._y_pred.eval(feed_dict={
self._tfx: x[count - single_batch:]}))
else:
rs.append(self.get_rs(x[count - single_batch:]))
else:
if not out_of_sess:
rs.append(self._y_pred.eval(feed_dict={
self._tfx: x[count - single_batch:count]}))
else:
rs.append(self.get_rs(x[count - single_batch:count]))
if out_of_sess:
with self._sess.as_default():
rs = [_rs.eval() for _rs in rs]
return np.vstack(rs)
交叉验证
交叉验证大概有三种:K 折交叉验证、留一验证、和 Holdout 验证。我们要采用的就是最后这一种、因为它最简单(喂
实现起来也很直观:只需要在一开始把数据随机打乱然后按比例分割即可
if train_rate is not None:
train_rate = float(train_rate)
train_len = int(len(x) * train_rate)
shuffle_suffix = np.random.permutation(int(len(x)))
x, y = x[shuffle_suffix], y[shuffle_suffix]
x_train, y_train = x[:train_len], y[:train_len]
x_test, y_test = x[train_len:], y[train_len:]else:
x_train = x_test = x
y_train = y_test = y
用到了一点 Numpy 的技巧、不过(应该)不是唯一的做法
实时记录结果
以上大概把上一章留下来的坑填了一遍。至此一个还算能用的神经网络模型就已经做好了,它诚然还有相当大可优化的空间、不过作为基础来说业已足够
从下一章开始就是比较重头戏的 CNN 了;本来从 NN 到 CNN 的拓展其实并不太平凡,可是 tensorflow 这个外挂愣是把这件事情变得相当容易……想起当初用纯 Numpy 好不容易才把 CNN 整合进这个框架结果看到 tensorflow 之后直接傻眼……唉不说了挺心疼自己的(叹
最后贴一个比较普适的、不限于 NN 的二维数据可视化函数作为结束吧:
def visualize_2d(self, x, y, plot_scale=2, plot_precision=0.01):
plot_num = int(1 / plot_precision)
xf = np.linspace(
np.min(x) * plot_scale, np.max(x) * plot_scale, plot_num)
yf = np.linspace(
np.min(x) * plot_scale, np.max(x) * plot_scale, plot_num)
input_x, input_y = np.meshgrid(xf, yf)
input_xs = np.c_[input_x.ravel(), input_y.ravel()]
output_ys_2d = np.argmax(self.predict(input_xs), axis=1).reshape(
len(xf), len(yf))
plt.contourf(input_x, input_y, output_ys_2d, cmap=plt.cm.Spectral)
plt.scatter(x[:, 0], x[:, 1],
c=np.argmax(y, axis=1), s=40, cmap=plt.cm.Spectral)
plt.axis("off")
plt.show()
把 predict 函数换成任一个有预测功能的函数都行。在我们这个 NN 里,它的效果大概如下:
希望观众老爷们能够喜欢~
公众号后台回复关键词学习
回复 人工智能 揭开人工智能的神秘面纱
回复 贝叶斯算法 贝叶斯算法与新闻分类
回复 机器学习 R&Python机器学习
回复 阿里数据 阿里数据系列课程
回复 Python Python机器学习案例实战
回复 Spark 征服Spark第一季
回复 kaggle 机器学习kaggle案例
回复 大数据 大数据系列视频
回复 数据分析 数据分析人员的转型
回复 数据挖掘 数据挖掘与人工智能
回复 机器学习 R&Python机器学习
回复 阿里数据 阿里数据系列课程
回复 R R&Python机器学习入门