使用多层感知机初步实现MNIST的分类
使用多层感知机初步实现MNIST的分类
参考书目:《深度学习入门:基于Python的理论与实现》
神经网络可以视为一个带参函数,函数的输入是数据,也是函数的自变量,输出是我们所要的结果,也是函数的因变量。而根据监督数据,对其中的参数的调整就叫做“训练”,训练的标准用”损失函数“,训练的具体过程就是求这个多元函数的最值。可以使用梯度法。
项目计划
完成MNIST数据集的导入。
对参数初始化后运行程序,前向处理神经网络
根据多批监督数据计算损失
根据损失计算梯度
根据梯度更新参数
数据导入12345678910111213import sysimport os# 导入book_note下的数据current_dir = os.path.dirname(os.path.abspath(__file__))sys.path.append(os.path.join(current_dir, "..", "book_code"))import dataset.mnist# 导入MNIST数据集# x为图片;t为监督数据,表示该图片所属的分类(x ...
matlab02
矩阵和数列MATLAB 的全称是矩阵实验室。所以这个算是matlab的主要功能之一了。
数列其实是只有一行的矩阵,而在matlab中所有的变量其实都是以矩阵的方式存在的。
新建数列空格和’,’放在中括号里就可以新建数列,甚至可以混用,但是不建议这么写。
1[1,2 3]
Output:123ans = 1 2 3这里的ans是matlab未命名结果变量时存储结果的地方,matlab作为一个计算机而非正式的编程语言,尽可能的方便用户使用而减少报错机会。除了数学原因很少报错。所以它是比其他程序设计语言好学不少的(除了python)
新建矩阵新建矩阵,即多行数列有三种主流方式,换行和用;和用函数。123a = [1 3 5 2 4 6 7 8 10]和1a = [1 3 5; 2 4 6; 7 8 10]Output相同,为:12345a = 1 3 5 2 4 6 7 8 10也可以用函数快捷新建特定矩阵1zero(n,m) %新建一个n*m的零矩阵如:1z = zeros(5,1 ...
matlab01
也是装上了MATLAB了,让这个计算机能成为一个真正的计算机,发挥它的力量吧。开始入手学习。
变量名命名规则字母开头,后面只能跟着字母、数字、下划线。不能跟其他乱七八糟的符号。大小写敏感,空格敏感,缩进敏感。函数和变量可以同名,但是尽量不要使用同一名字
可以用exist函数判断变量是否存在。若返回零值则可以使用该名字1exist checkname
多行命令;可以使命令执行结束不立即显示禹屏幕,’,’可以使多行命令写在一行,同C语言,但是不建议如此做。...可使命令分行:12s = 1 - 1/2 + 1/3 - 1/4 + 1/5 ... - 1/6 + 1/7 - 1/8 + 1/9;Output:123s = 0.7456字符串使用...分行时要用两个分号:1234567False:mytext = 'Accelerating the pace of ... engineering and science'True:mytext = ['Accelerating the pace of ' ... ...
运动学
开始学一下物理吧,那么严谨的数学有点枯燥,可是以后再来试试。从物理问题出发说不定可以对数学有更多的理解。虽然数学没有学好的话物理会有点吃力。这两个东西还是分不开的呀。
前置技巧Inspection视察法。田光善老师说的物理学家常用的数学技巧。确实好用哦。跳出了数学分析的拘谨。
Reductionism简约主义。物理学家解决问题的原则。
如无必要,勿增实体
半桶水数学水平行列式会一点,积分会一点,微分方程会一点,偏导会一点,概率会一点…… 就够用了。(?)
近似的艺术如果一个人在和你讨论白马的问题,然后在黑板上画了一个圆,那他大概率是学物理的。费米曾经提到,如果你每一步随机地引入误差,那么多估计和少估计就很可能相互抵消。在严谨的数学定义中,也可以通过视察法或者近似简化证明过程。
空间和时间经典力学中研究的是绝对空间和绝对时间。不考虑相对论中的尺缩效应和钟慢效应。
运动学的研究内容运动学研究的是物体运动的情况,即物体位置随时间的变化关系。所以运动学最重要的一个内容就是运动方程 $x = x(t)$ 其中 $x$ 是一个矢量,叫做位移矢量(位矢)。
而动力学主要是研究物体运动的原因(牛顿 ...
埃氏筛和欧拉筛
埃氏筛比较原始,但很实用,性价比高。
最简单的实现如下:(筛出1~N的质数)1234567bool notp[N];void is() { for (int i = 2;i <= N;++i) if (!notp[i]) for (int j = 2*i;j <= N;j += i) notp[j] = 1;}当然这有很多的优化空间,比如排除偶数、从i*i开始等等。
上面这段代码没有记录素数的数组。可以改为:1234567891011bool notp[N];vector<int> pri;void is{ for (int i = 2;i <= N;++i) { if (!notp[i]) pri.push_back(i); for (auto p:pri) { if (i*p > N) break; notp[i*p] = 1; } }}这里把筛去 “质数的 ...