帮朋友做网站不给钱,wordpress圈子,wordpress文章列表样式,网页开发基础知识VGG概念#xff1a;
VGG之所以经典#xff0c;在于它首次将深度学习做得非常“深”#xff0c;达 到了16-19层#xff0c;同时#xff0c;它用了非常“小”的卷积核#xff08;3X3#xff09;。
网络框架#xff1a; VGG的结构#xff1a;
1、一张原始图片被resize…VGG概念
VGG之所以经典在于它首次将深度学习做得非常“深”达 到了16-19层同时它用了非常“小”的卷积核3X3。
网络框架 VGG的结构
1、一张原始图片被resize到(224,224,3)。 2、conv1两次[3,3]卷积网络输出的特征层为64输出为(224,224,64)再2X2最大池化输出net为 (112,112,64)。 3、conv2两次[3,3]卷积网络输出的特征层为128输出net为(112,112,128)再2X2最大池化输出 net为(56,56,128)。 4、conv3三次[3,3]卷积网络输出的特征层为256输出net为(56,56,256)再2X2最大池化输出net 为(28,28,256)。 5、conv3三次[3,3]卷积网络输出的特征层为256输出net为(28,28,512)再2X2最大池化输出net 为(14,14,512)。 6、conv3三次[3,3]卷积网络输出的特征层为256输出net为(14,14,512)再2X2最大池化输出net 为(7,7,512)。 7、利用卷积的方式模拟全连接层效果等同输出net为(1,1,4096)。共进行两次。 8、利用卷积的方式模拟全连接层效果等同输出net为(1,1,1000)。 最后输出的就是每个类的预测。
VGG16代码实现
网络主体部分vgg16.py
#-------------------------------------------------------------#
# vgg16的网络部分
#-------------------------------------------------------------#
import tensorflow as tf# 创建slim对象
slim tf.contrib.slimdef vgg_16(inputs,num_classes1000,is_trainingTrue,dropout_keep_prob0.5,spatial_squeezeTrue,scopevgg_16):with tf.variable_scope(scope, vgg_16, [inputs]):# 建立vgg_16的网络# conv1两次[3,3]卷积网络输出的特征层为64输出为(224,224,64)net slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scopeconv1)# 2X2最大池化输出net为(112,112,64)net slim.max_pool2d(net, [2, 2], scopepool1)# conv2两次[3,3]卷积网络输出的特征层为128输出net为(112,112,128)net slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scopeconv2)# 2X2最大池化输出net为(56,56,128)net slim.max_pool2d(net, [2, 2], scopepool2)# conv3三次[3,3]卷积网络输出的特征层为256输出net为(56,56,256)net slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scopeconv3)# 2X2最大池化输出net为(28,28,256)net slim.max_pool2d(net, [2, 2], scopepool3)# conv3三次[3,3]卷积网络输出的特征层为256输出net为(28,28,512)net slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scopeconv4)# 2X2最大池化输出net为(14,14,512)net slim.max_pool2d(net, [2, 2], scopepool4)# conv3三次[3,3]卷积网络输出的特征层为256输出net为(14,14,512)net slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scopeconv5)# 2X2最大池化输出net为(7,7,512)net slim.max_pool2d(net, [2, 2], scopepool5)# 利用卷积的方式模拟全连接层效果等同输出net为(1,1,4096)net slim.conv2d(net, 4096, [7, 7], paddingVALID, scopefc6)net slim.dropout(net, dropout_keep_prob, is_trainingis_training,scopedropout6)# 利用卷积的方式模拟全连接层效果等同输出net为(1,1,4096)net slim.conv2d(net, 4096, [1, 1], scopefc7)net slim.dropout(net, dropout_keep_prob, is_trainingis_training,scopedropout7)# 利用卷积的方式模拟全连接层效果等同输出net为(1,1,1000)net slim.conv2d(net, num_classes, [1, 1],activation_fnNone,normalizer_fnNone,scopefc8)# 由于用卷积的方式模拟全连接层所以输出需要平铺if spatial_squeeze:net tf.squeeze(net, [1, 2], namefc8/squeezed)return net图像预处理部分utils.py
import matplotlib.image as mpimg
import numpy as np
import tensorflow as tf
from tensorflow.python.ops import array_opsdef load_image(path):# 读取图片rgbimg mpimg.imread(path)# 将图片修剪成中心的正方形short_edge min(img.shape[:2])yy int((img.shape[0] - short_edge) / 2)xx int((img.shape[1] - short_edge) / 2)crop_img img[yy: yy short_edge, xx: xx short_edge]return crop_imgdef resize_image(image, size,methodtf.image.ResizeMethod.BILINEAR,align_cornersFalse):with tf.name_scope(resize_image):image tf.expand_dims(image, 0)image tf.image.resize_images(image, size,method, align_corners)image tf.reshape(image, tf.stack([-1,size[0], size[1], 3]))return imagedef print_prob(prob, file_path):synset [l.strip() for l in open(file_path).readlines()]# 将概率从大到小排列的结果的序号存入predpred np.argsort(prob)[::-1]# 取最大的1个、5个。top1 synset[pred[0]]print((Top1: , top1, prob[pred[0]]))top5 [(synset[pred[i]], prob[pred[i]]) for i in range(5)]print((Top5: , top5))return top1
预测主体部分demo.py
from nets import vgg16
import tensorflow as tf
import numpy as np
import utils# 读取图片
img1 utils.load_image(./test_data/table.jpg)# 对输入的图片进行resize使其shape满足(-1,224,224,3)
inputs tf.placeholder(tf.float32,[None,None,3])
resized_img utils.resize_image(inputs, (224, 224))# 建立网络结构
prediction vgg16.vgg_16(resized_img)# 载入模型
sess tf.Session()
ckpt_filename ./model/vgg_16.ckpt
sess.run(tf.global_variables_initializer())
saver tf.train.Saver()
saver.restore(sess, ckpt_filename)# 最后结果进行softmax预测
pro tf.nn.softmax(prediction)
pre sess.run(pro,feed_dict{inputs:img1})# 打印预测结果
print(result: )
utils.print_prob(pre[0], ./synset.txt)