试着在tensorflow上运行第一个小程序,其中源代码都是有的,具体网址可以看这个https://www.cs.toronto.edu/~frossard/post/vgg16
原来是caffe的,现在移植到了tensorflow上,能够提供更好的接口
输出模型的类型,即我们需要分类的名称都在imagenet_classes.py上
vgg16_weights.np是已经训练好的权重,,可以直接调用
vgg的网络结构都在vgg16.py里面,有空可以来分析分析~,作者在里面加入了预处理,直接可以计算平均像素值,不用像caffe还要自己生成,VGG的结构如下:
VGG是卷积网络,由图片上可知,前面经历了卷积+激活(激活函数采用的是relu,relu函数在收敛性和时间上都较优于其他函数,后面讲对relu的函数性能做解释),然后进行池化层,再进行一次全连接+relu激活,最后激活函数采用的softmax,softmax可以对属于的类进行判断,生成属于每一类的概率值,概率最大的值就是最后的归属类,同时也可以看到属于其他类的概率值,这就是使用softmax的好处。
卷积我是这样理解的,类似于图像处理的模板,你统一输入一个模板,比如三阶的全1矩阵,你对图像中的每一个3阶矩阵进行卷积,最后得到的值都有可能不一样,有些得到的值一样的,可能像素值比较相同,相似度较高,明显不同图像的,得到的卷积值就不一样,所以卷积类似于提取特征。卷积就相当于是加权,但是卷积在处理的过程中卷积核进行了翻转,
池化的作用简单的说就是降维了。有很多种降维的方式,比如这里的max pooling,就是选择最大值进入下一层,比如2N*2N的原始图像,进行2*2的max pooling后就是N*N,瞬间减少了很多~减少了运算量。
下载好所有的文件运行python vgg16.py
由于tensorflow不支持py27,只能用py35,但是vgg里面是用的27的语法,所以会报这里的输出错误,只需要这样加个括号就行
然后再次执行,输出以下就是正确的
输出的是每一层的模型大小,最后的输出是各个的概率。。。。
不过很不高兴的是。。。居然把我的神兽
分类成了这个。。。
纸风车是什么鬼。。。什么鬼 。。。。哎,
对正常的还分类的比较对,哈哈
雪橇犬,种类还准确的~心疼的我神兽,其实我的神兽也是狗,哈哈~
对于vgg网络的细节,后面再继续谈~玩通一个网络,再继续下一个~come on guys~