[npnet] 卷积神经网络
我们将用上一篇笔记实现的模型来搭建卷积神经网络去识别 Fashion MNIST 数据集。在之前的一篇笔记中我们用两个线性模型的串型网络达到了85%左右的准确率。我们期待使用卷积神经网络能达到更好的准确率。
Believe in Mathematics
我们将用上一篇笔记实现的模型来搭建卷积神经网络去识别 Fashion MNIST 数据集。在之前的一篇笔记中我们用两个线性模型的串型网络达到了85%左右的准确率。我们期待使用卷积神经网络能达到更好的准确率。
卷积神经网络 (convolution neural network) 是当下图像识别最为热门而有效的手段。这种网络一般有若干个卷积模型 (convolution model) 加上若干个线性模型 (linear model) 组合而成。卷积模型部分相当于提取图像的特征,而线性模型部分是根据这些特征做出预测。卷积模型的想法是通过卷积运算提取图像的局部信息。我们在本笔记中首先介绍卷积运行,然后按照 CS231n Convolutional Neural Networks for Visual Recognition 这篇参考资料的思路实现卷积模型。我们会在下一篇笔记中使用卷积模型建立一个简单的卷积神经网络来做 Fashion MNIST 识别。
我们在之前的一篇笔记中使用简单的线性模型去识别 Fashion-MNIST 数据集,达到了 75% 到 80% 的准确率。通过对损失 [loss] 的可视化我们发现这个简单的模型并没有过拟合 [overfitting],说明我们基本达到了这个模型的上限了。我们如何增加提高识别的准确率呢?一个直接的做法就是提高模型的复杂度,比如我们可以使用简单的模型搭建一个复杂的神经网络。这一般来说也是最有效的方法。我们还可以通过数据预处理的方法来榨取原先模型的能力,只是我对此是门外汉,除了使数据具有零平均值 (zero mean) 和单位方差 (unit variance) 之外就一无所知了,所以我就在这方面就不展开了。
这次只做出了前三题。最后一题我算了一下枚举复杂度也大概是 10!=3628800 左右,但是就老是 TLE。今天早上用 C 重新写了一下就过了。有点郁闷。
第一题Find N Unique Integers Sum up to Zero
每次加入 i 和 -i 就能保证和为0。如果 n 是奇数,那么我们要添加 0。
class Solution:
def sumZero(self, n: int) -> List[int]:
ans = []
if n & 1:
ans.append(0)
for i in range(1, n//2 + 1):
ans.append(i)
ans.append(-i)
return ans
上次参加 leetcode 比赛还是去年四月份的时候了。回想的时候总觉得时间过得很快。只是一年,以前一起比赛的小伙伴们包括我自己都已经离开哥村了。
第一题Convert Binary Number in a Linked List to Integer
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getDecimalValue(self, head: ListNode) -> int:
r = 0
while head:
r = r * 2 + head.val
head = head.next
return r
这篇笔记尝试着实现几种简单的机遇梯度下降的优化器 (Optimizer)。主要的参考资料是 Neural Networks Part 3: Learning and Evaluation。另外我还参考了 An overview of gradient descent optimization algorithms。这篇博文不仅有篇对应的论文:An overview of gradient descent optimization algorithms,还已经被翻译成中文了:梯度下降优化算法综述。
逻辑回归 (logistic regression) 是广义线性模型 (generalized linear model) 的一种,对应的是伯努利分布 (Bernoulli distribution)。如果我们在广义线性模型中使用的是多项分布 (multinomial distribution),那么我们将得到逻辑回归的推广——多项逻辑回归 (multinomial logistic regression)。我们在这里用逻辑回归来代表逻辑回归和多项逻辑回归。
我们现在已经知道机器学习三个重要的模块是模型 (model)、标准 (criterion) 以及 优化 (optimization)。在这篇笔记中我们讨论各个模块必要的基本功能,然后用 Python 给出模块的基类 (base class)。 最后我们继承这些基类实现上一篇笔记的线性模型 (linear model) 以及均方误差 (mean square error)。
很早之前我就有一个“写一个机器学习的系列笔记”的想法了。之所以叫做“笔记”而不叫“教程”,是因为机器学习只是我的业余爱好之一,我并不精通此道。事实上,我只是学到最简单的皮毛知识,还不一定明白透彻。所以我把我将要写的这个系列定义为笔记,并且在开篇就写得明明白白,这样我就可以随心所欲地写而并不担心误人子弟。不过既然我把笔记放在网上了,那表明我也希望其他人能从我写的东西里得到启发。如果你发现我的理解有误或者文章有错,也请务必留言让我知道。
这个笔记记录如何在 Raspbian 上编辑 Raspbian 镜像。为什么会有这个需要呢?第一是因为经常在 Raspberry Pi 上尝试各种各样的东西,会把系统弄得乱七八糟,所以经常要重新刷 Raspbian ,因此就有了编辑 Raspbian 镜像的需求。第二是我现在用的是 Mac OS ,编辑镜像文件并不那么方便,所以就干脆在 Raspbian 系统中编辑 Raspbian 镜像了。