0%

作者认为CNN的卷积核是一种泛化的线性模型(generalized linear model GLM),把GLM换成一种非线性近似函数能提高局域的特征提取能力。他说CNN的假设是说需要提出特征都是线性可分的,但是很多特征是以非线性流型的形式存在。非线性流型(nonlinear manifold)这是啥玩意?

他说自己是NiN,就是在普通卷积核之后增加了一个小的普通NN,以提高特征提取能力。而且在网络最后去掉了全连接层,通过 average pooling layer直接进入softmax分类器。

MLPconv

就是在普通conv后增加了全连接层,但是这篇文章厉害的地方是把这个Full Connect Layer视为1*1的conv layer。这个新颖的观点后来被Inception、resnet使用了,并且google还在论文中感谢了这边文章的作者。

Global Average Pooling

文中提到很多FC layer的弊病,如过拟合,参数多等。于是他用的方法是,把最后一层每个通道的feature map看做是类别的特征,把feature map的每个channel 求一个平均数,作为对应类别的分数,然后在求loss。

这篇文章虽然很多细节上没有交代,比如网络结构参数等等。但是他的想法还是很新奇的。并且被很多后续很成功的Net所采用。

论文基于AlexnNet修改,CIFAR100可以到65.3%

LeNet,证明多层的CNN是有价值的,可以拿来做图像识别

AlexNet,提出数据多,网络深就可以有好结果,但是计算速度、过拟合是问题,所以给出了ReLU,Dropout

VGG,说他们有效是因为用了很小的filters(3*3),因为小的filter可以让网络变得很深。VGG说LRN没啥效果。

使用小filter可以使参数变少,计算量变小。3层3*3就相当于是一层7*7,同时因为之间加入了ReLU,所以使得判定函数(decision function)更加具有判别力,不知道这个的根据是啥?

VGG训练时,是一点点涨起来的,先训练11层的,等稳定了,把网络扩展13层,旧的layer还用原来的参数,新的layer随机初始化参数。

实际在测试VGG时,感觉不是那么好用,首先我用的1060的卡,只能跑很小的batch_size,这样训练就很慢。而且再cifar100上,也没看到特别明显的效果。还不如直接在AlexNet上加几层3*3的Conv Layer。这可能也和数据集有关,可能在ImageNet2012上VGG表现更好。

Vgg Acc@1能到 63%,AlexNet Acc@1能到50%左右

2012----AlexNet----Imagenet classification with deep convolutional neural networks_ILSVRC2012

作者说,为了提高分类精确度,需要收集更多标注数据,需要更强大的模型,还需要更好的技术防止过拟合,这应该是2012年人们面对的挑战。

AlexNet提出了很多新的特性,能够使得训练时间更短,并且提出一些防止过拟合的新方法。AlexNet有8个层,5个卷积层,3个全连接层。

AlexNet使用了ReLU,f(x) = max(0, x) , 这么简单的函数,但是效果很好,比tanh,sigmoid要快很多。

AlexNet使用LRN(Local Response Normalization)层是用来做归一化的。

使用了有重叠的max-pooling。

使用了Dropout防止过拟合,同时做了很多数据增强的事情。

AlexNet结构:

  1. 输入是3*224*224
  2. conv1: kernel(96*3*11*11,stride=4 padding=2), output(96*55*55), active(ReLU)
    1. LRN
    2. max_pool(size=3, stride=2 ), output(96*27*27)
  3. conv2: 256*96*5*5 padding=2, group = 2, active(ReLU)
    1. LRN
    2. max_pool(size=3, stride=2 ), output(256*13*13)
  4. conv3: kernel(384*256*3*3 padding=1), output(384*13*13), active(ReLU)
  5. conv4: kernel(384*384*3*3 padding=1, group = 2), output(384*13*13), active(ReLU)
  6. conv5: kernel( 256*384*3*3 padding=1, group = 2), output(256*13*13), active(ReLU)
    1. max_pool(size=3, stride=2 ), output(256*6*6)
  7. fc6: (256*6*6, 4096), dropout
  8. fc7: (4096, 4096),dropout
  9. fc8: (4096, num_classes)

计算机领域还是得动手做一下,才能更清楚的明白。网上很多人说AlexNet输入图片是227*227,其实就是224*224,只是加了padding=2,最后一列和最后一行被抛弃了。

而且我才发现,alexnet的conv实际是分开两部分了,幸好pytorch的conv2d函数有groups这个参数,否则还真不知道该怎么去实现。

但是在alex上跑cifar,还是比较容易overfitting,cifar的top1 accuracy只能到46%左右。

《Gradient-based learning applied to document recognition》

之前的模式识别系统,分为两部分,第一部分是特征提取器,把输入变量变成低纬度的特征向量。这个过程需要很多人类知识,而且主要是针对特定任务。第二部分是分类器,分类器是比较通用的,也可以进行训练。

卷积网络组合了三个关于架构的想法:局部感知区域、共享参数、空间二次采样。小的卷积核可以提取出基本视觉元素,比如边缘,角点,终点。这些特征再被后续的层去提取更高维度的特征。一个卷积神经元输出一个feature map,完整的卷积层由多个卷积核组成。

池化层的作用是减少feature的精确位置,只关注特征之间的相对位置。

LeNet-5结构

1,C1,6个5*5的filter

2,S2,avg_pooling, 12个参数

3,C3,16个5*5的filter,但是不是完全卷积

4,S4,22的avg pooling , 162=32个参数

5,C5,120个5*5卷积filter,这一层又是完全卷积了,只有C3特殊

6,F6,是全连接层,有84的神经元,这一个层后用了tanh,作为激活函数

7,Output,F7层也不是普通的全连接层,而是用了所谓RBF函数,实际是把F6层输出84维向量,和10个分类的向量求欧式距离

8,Loss Func也不是现在常用的交叉熵,而是一个我看不懂的公式

原始LeNet和现在通用模式,还是有很多差别。比如C3层就不是对S2层的完全卷积操作,而是不同的卷积核对应不同的层,作者说是为了减少计算量,更重要是为了打破对称。而在卷积处理后,是现在avg_pool,并且还是乘上一个参数,再加一个bias,才得到采样以后的数值,这个数值还要进行sigmoid。早先的论文很多都是数学公式,不想现在更注重简化,方便工程实现。

可以看出LeNet的时候,还没有dropout, max_pool, relu等优化,但已经把CNN的大框架定下来了。

这篇文章还讲了很多图像分割,后处理等技术,实在看不懂,留到后续再学习吧,现在先把LeNet的结构搞懂就不错。

也就是说,在1998年人们就开始利用CNN自动选择特征,发展到2010s以后,就开始用GPU寻找feature vector,而且有了大量的标注数据。此后,人工寻找好的NN结构,用不同的超参做实验,俗称炼丹师,到2017年后,开始机器寻找好的网络结构(NAS, PNAS, ENAS)

1998----LeNet----Gradient-based learning applied to document recognition

2012 ILSVRC AlexNet----Imagenet classification with deep convolutional neural networks

2013----ILSVRC ZFNet----Visualizing and Understanding Convolutional Networks

2014----AlexNet V2----One weird trick for parallelizing convolutional neural networks

2014----ILSVRC VGGnet----Very deep convolutional networks for large-scale image recognition ----(ICLR 2015)

2014----NiN----Network in Network

2014----ILSVRC GoogLeNet(Inception V1)----Going deeper with convolutions_ILSVRC2014 ----(CVPR 2015)

2015----ILSVRC ResNet----Deep Residual Learning for Image Recognition——(CVPR 2016)

2015----inception v3----Rethinking the Inception Architecture for Computer Vision

2015----ReNet_A Recurrent Neural Network Based

2016---- Neural Architecture Search with Reinforcement Learning

2016----Binarized Neural Networks_Training Neural Networks with Weights and Activations Constrained to+ 1 or−1

2016----Identity Mappings in Deep Residual Networks —— (ECCV 2016)

2016----Inception V4----Inception-ResNet and the Impact of Residual Connections on Learning

2016----Interleaved Group Convolutions for Deep Neural Networks

2016----Residual Networks are Exponential Ensembles of Relatively Shallow Networks

2016----SqueezeNet- AlexNet-level accuracy with 50x fewer parameters and 0.5MB model size

2016----Wide Residual Networks

2017---- FractalNet_Ultra-Deep Neural Networks without Residuals

2017---- Xception_Deep Learning with Depthwise Separable Convolutions

2017----An Analysis of Deep Neural Network Models for Practical Applications

2017----CVPR2017 best paper----DenseNet ----Densely Connected Convolutional Networks

2017---- (ResNext) Aggregated residual transformations for deep neural networks (CVPR 2017)

2017----ILSVRC2017 winner SENet----Squeeze-and-Excitation Networks

2017----Interleaved Group Convolutions for Deep Neural Networks

2017----Learning Transferable Architectures for Scalable Image Recognition

2017----Residual Attention Network for Image Classification

2017----Neural Architecture Search with Reinforcement Learning (ICLR,2017)

2017----Learning Transferable Architectures for Scalable Image Recognition

2017----Progressive Neural Architecture Search

2018----Efficient Neural Architecture Search via Parameter Sharing

2017----CVPR----ShuffleNet_An Extremely Efficient Convolutional Neural Network for Mobile

2017---- MobileNetV1_Efficient Convolutional Neural Networks for Mobile Vision Applications

2018----MobileNetV2----Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation

2018----MnasNet: Platform-Aware Neural Architecture Search for Mobile

我原来是不懂PHP怎么生成的页面。后来懂了,类似PHP的框架都是叫MVC,就是获取请求,拉取数据或添加数据到db,然后返回经过数据填充的页面。这里面只是需要记住框架的基本接口,理解基础处理流程。这里面可能混杂了php的语法,html, css, js。都需要想背单词一样把这些接口API背下来,当然每天反复用是可以记住的。反复用是可以记住,这里的主要问题是不知道怎么拓展。对于那些我不知道API可能永远的都没法使用上。

随后出现了ajax(大概2005年)。ajax其实没什么特别的,就是所谓webapp数据变化时,不需要重新刷新页面,用户体验更好了。随后出现了jQuery,可以特别方便的处理ajax和HTML DOM变化,但是永远没学到精髓,只是知道皮毛。现在(2018)好了,随着浏览器实现的js API越来越强大,jQuery基本面临淘汰了。

现在好了,前端的能力越来越强,强大是通过新的功能,新的API,新的编程范式来实现的。旧的还没完全懂,妈的新的又来了。什么HTML5, CSS3, Javascript也开始带上class了。js不仅在学习传统的开发语言,他还有一堆函数式编程的特性,什么callback,arrow function,promise, async/await,这都尼玛什么鬼,老老实实的开发不好么。

我都快成开发领域的恐龙了,从他妈table布局开始,到现在都是什么flex,grid布局,作为恐龙是不是终将面临灭绝这样的惨状。抱怨是没有用的。整体的互联网经济,符合任何其他行业,现在要做的就是看看哪个是自己的兴趣。不要那么执着,好玩就玩下,不好玩了,没意思了,就去整点其他的。没有那么严重。

TL;DR : js的一个重要功能,就是实现网页的各种交互效果。主要是通过添加事件处理函数,然后修改DOM元素的style,或者添加预制的css class来实现各种前端展现。

Read more »

Javascript前端工程化

安利一下udemy上的这门课Object-oriented Programming in JavaScript,让我明白了很多困扰我很久的概念。

我没正规做过前端开发,连现在所谓的web后台开发都没做过,这是我始终进展很慢的原因之一。因为别人提到的技术实现,我根本看不懂,即使是花钱,也没法判断投入的是否合理。

我个人的经历与前端开发、javascript简直就是平行空间,就想和现在的邻居,虽然都生活距离很近,但貌似谁也不了解对方的状态。

javascript的标准叫ECMAScript,99年出版的ES3,我可能看过一点,但是那个时候觉得MFC牛逼,甚至操作系统、汇编才牛逼,就压根不喜欢看和界面有关的一切技术。没想到差不多到现在界面技术反而前后通吃了,而且更容易做一个产品出来,后台技术只能做幕后英雄了。ES5是2009年发布的标准,2015年大佬们又发布了ES6,也就是ECMAScript 2015,估计未来还会有ES7,ES8,ESX。。。

随着对用户体验要求越来越高,前端代码肯定越来越复杂,大佬们希望通过更多的语言特性,使前端开发更加工程化。工程化有啥内涵,我也不是很了解,但至少现在能看到的就是模块化,然后提供更便利的工具。

Read more »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//JS里面创建一个对象最简单的方式是通过{}来直接建立
const bookLiteral = {
bookName : 'Program',
bookPrice : '30',
calcPrice : function(){}
};

//如果需要建立同类型的对象,可以用工厂,或者构造器

//factory function
function createBook(bookName, bookPrice) {
return {
bookName,
bookPrice,
calcPrice :function (numOfBooks){
return this.bookPrice * numOfBooks;
}
}
}

bookFromFactory = createBook("Factory Object", 15);
console.log(bookFromFactory);
console.log(bookFromFactory.calcPrice(30));

//constructor function
function Book(bookName, bookPrice){
this.bookName = bookName;
this.bookPrice = bookPrice;
this.calcPrice = function (numOfBooks){
return this.bookPrice * numOfBooks;
}
}

//js里的new 实际上先生成一个object,然后在这个object上,通过this, 动态增加属性和方法
myBook = new Book('JS', 10);
console.log(myBook.constructor);

for (let key in myBook){
console.log(key, myBook[key]);
}

const keys = Object.keys(myBook);
console.log(keys);

if ('bookPrice' in myBook) {
console.log('the price of 10 books: ', myBook.calcPrice(10));
}else
console.log('price of book:', myBook.calcPrice(1));


//js 的普通{} 都是对外直接访问的,这就导致无法真的做到oop,最起码的封装就没有
//所以需要通过曲线的方式来实现封装,比如:closur, getter , setter
function Circle(radius){
this.radius = radius;
//defaultLocation 外部是访问不到的,因为没有把这个defaultLocation加到this的属性上
let defaultLocation = {x:10, y:10};
this.draw = function (){
console.log('DefaultLocation:', defaultLocation);//这里用到了closure backpack
};
//getter setter
Object.defineProperty(this, 'defaultLocation', {
get: function(){
return defaultLocation;
},
set: function(value){
if (!value.x || !value.y){
throw new Error('Not Valid Value');
}
defaultLocation = value;
}
});
}

var circle = new Circle(10);
//circle.defaultLocation = {x:3}; 不符合合法性校验
circle.defaultLocation = {x:3, y:5};
console.log(circle.defaultLocation);