关于CS231n课的一些笔记
$L_i=-log(\frac{e^{f_y{_i}}}{\sum_je^{f_j}})$
$L=\frac{1}{N} \displaystyle \sum_i L_i + \frac{1}{2} \lambda \displaystyle\sum_k \displaystyle\sum_l W^{2}_{k,l}$
$\frac{\partial L_i}{\partial f_k} = p_k - \mathbb{ONE}(y_i=k)$
关于Hidden层的直觉性思考
直觉性的理解: 对于输入空间中$x1$和$x2$不同取值, 隐藏层将它们原先的一次组合(即: 没有隐藏层的线性(vanilla)模型)进行”二次加工”, 比如: 输入数据点在第一层模型分类的基础上, 再次进行调整, 使得图1中的三条直线段在不同的取值区间(小范围内)内呈现不同的位移/扭曲(直线变曲线), 完成此例中的螺旋分类.
激活函数的加入, 使得原先的”线段式”曲线变得更平滑(消除了不同线段连接间的折角特征), 原先的”线段式”曲线变成真正的曲线(平滑的), 这像是一个消除图像马赛克的过程/模拟.
todo: 贴网络传导图
好记性不如烂笔头(要理论, 也要工程):
1.jupyter notebook平常使用三步走: ;
matplotlib.plot三步走: ;
文字的先天不足: 文字就是文字, 在解释/描述程序世界时总是外界事物, 能用例子看懂了, 你还想要文字来描述吗: 编程语言的API再详细, 那也不是程序设计时的内在逻辑, 如https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=scatter#matplotlib.pyplot.scatter这个API的描述;
Matplotlib的API简记
首先, Matplotlib是因其作者想要在Python中使用像Matlab一样的画图(便利)方式而写出来的一个Python的画图库(主要是数据图的绘制而不是图像的显示/绘制, 图像的显示/绘制应该用OpenCV, 即cv2模块(但安装的时候是’pip install opencv-python’(或者python-opencv, 哪个对用哪个))), 此库的前三个字母就是Matlab的前三个字母, 接着是两个单词: plot(绘制)和lib(库). Matplotlib的pyplot
模块最为常用: 体现为代码语句import matplotlib.pyplot as plt
的使用频率.
在做cs231n中模型的总结时, 调用到其一些函数, 做个总结, 加深印象(第一个api我会写得详细一些, 其它的话都是一样的套路就不那么详细, 除非有新的要点出现):
plt.contourf()
[REF]: 调用格式(Call signatures): contour([X, Y,] Z, [levels], **kwargs)
:
X
和Y
参数是数组(np.array()
)形式的变量(如: np.arange(9)
), 代表的是平面坐标系中的两个维度上的坐标X
和Y
$^{[注1]}$, 调用时可以省略不给(它们在中括号([]
)中), 不给的话, 在函数内有默认的值(整数索引, “integer indices”)会被填充进去: X=range(M), Y=range(N)
, 即X
从0
到M-1
, 以及Y
从0
到N
.
X
和Y
是Z
中元素值的坐标, 它们的维度要么是2D的, 或者要么是1D的(详见下图关于X,Y
的说明).
Z
参数是必须给的, 它的shape是(N,M)
, 对应len(Y)/Z的行数
和len(X)/Z的列数
, 即把X
和Y
相应位置的索引对应到相应的Z
值(等高图中的高度).
注1: 经常弄错的是, 我把
(x1,y1)
当做参数X
, 把(x2,y2)
当做参数Y
传给numpy函数, 但numpy中把所有X
维度和Y
维度上的一系列坐标分开处理, 只不过用相同的索引i
将两个数组中的坐标对应起来(如X[1]
对应Y[1]
): 就是这样的, 轮子就是这样的.
说了这么多, 上图吧(一图胜千字):
图1: 参数说明
图2: 等高图例
contourf()
函数在matplotlib
库中的原代码为[REF]:
1
2
3
4
5
6
7
8 > @docstring.copy(Axes.contourf)
> def contourf(*args, data=None, **kwargs):
> __ret = gca().contourf(
> *args, **({"data": data} if data is not None else {}),
> **kwargs)
> if __ret._A is not None: sci(__ret) # noqa
> return __ret
>
在这个函数内部, 它调用的是gca().contourf()
, 而gca()
又return gcf().gca(**kwargs)
, 而gcf()
$^{[注]}$的定义返回的是figManager.canvas.figure
或者figure()
, 至此, 终于好像看到了绘图的一线曙光了.
而figure()
返回的是figManager.canvas.figure
, 这就明白了: 如果在gcf()
调用中, 有figManager.canvas.figure
对象的存在, 则直接返回它, 如果没有此对象, 则调用figure()
, 生成一个figManager.canvas.figure
对象后返回它.
注:
gcf()
的意涵是: Get Current Figure,gca()
的意涵是: Get the Current :class:~matplotlib.axes.Axes
(instance on the
current figure matching the given keyword args, or create one)
函数返回的是: c
(contour), 一个QuadContourSet
对象, 详见[REF].
最后, contourf()
的**kwargs
参数在此函数页面的Other Parameters中被说明, 包含: corner_mask, colors, alpha, cmap, norm, vmin/vmax, origin, extent, locator, extend, xunits/yunits, antialiased, Nchunk, linewidths, linestyles, hatches.
作为contourf()
API的总结结尾, 引用一个它的使用用例[REF]:
图3: Irregularly_Contour
Concise Pyplot Toturial - 简要Pyplot说明[REF]
An introduction to the pyplot interface.
图: Part Of A Figure
首先, 我们常见的是: import matplotlib.pyplot as plt
, 通过上述语句, 我们
MMM
快点来报道:
程序: 高级编程, CPU, 汇编.