【深度学习】使用tensorflow实现VGG19网络

2024-02-17 21:12

本文主要是介绍【深度学习】使用tensorflow实现VGG19网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【深度学习】使用tensorflow实现VGG19网络

 

 

 

本文章向大家介绍【深度学习】使用tensorflow实现VGG19网络,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 

 

 

 

VGG网络与AlexNet类似,也是一种CNN,VGG在2014年的 ILSVRC localization and classification 两个问题上分别取得了第一名和第二名。VGG网络非常深,通常有16-19层,卷积核大小为 3 x 3,16和19层的区别主要在于后面三个卷积部分卷积层的数量。第二个用tensorflow独立完成的小玩意儿......

 

 

模型结构

可以看到VGG的前几层为卷积和maxpool的交替,每个卷积包含多个卷积层,后面紧跟三个全连接层。激活函数采用Relu,训练采用了dropout,但并没有像AlexNet一样采用LRN(论文给出的理由是加LRN实验效果不好)。

模型定义

def maxPoolLayer(x, kHeight, kWidth, strideX, strideY, name, padding = "SAME"):"""max-pooling"""return tf.nn.max_pool(x, ksize = [1, kHeight, kWidth, 1],strides = [1, strideX, strideY, 1], padding = padding, name = name)def dropout(x, keepPro, name = None):"""dropout"""return tf.nn.dropout(x, keepPro, name)def fcLayer(x, inputD, outputD, reluFlag, name):"""fully-connect"""with tf.variable_scope(name) as scope:w = tf.get_variable("w", shape = [inputD, outputD], dtype = "float")b = tf.get_variable("b", [outputD], dtype = "float")out = tf.nn.xw_plus_b(x, w, b, name = scope.name)if reluFlag:return tf.nn.relu(out)else:return outdef convLayer(x, kHeight, kWidth, strideX, strideY,featureNum, name, padding = "SAME"):"""convlutional"""channel = int(x.get_shape()[-1]) #获取channel数with tf.variable_scope(name) as scope:w = tf.get_variable("w", shape = [kHeight, kWidth, channel, featureNum])b = tf.get_variable("b", shape = [featureNum])featureMap = tf.nn.conv2d(x, w, strides = [1, strideY, strideX, 1], padding = padding)out = tf.nn.bias_add(featureMap, b)return tf.nn.relu(tf.reshape(out, featureMap.get_shape().as_list()), name = scope.name)

定义了卷积、pooling、dropout、全连接五个模块,使用了上一篇AlexNet中的代码,其中卷积模块去除了group参数,因为网络没有像AlexNet一样分成两部分。接下来定义VGG19。

class VGG19(object):"""VGG model"""def __init__(self, x, keepPro, classNum, skip, modelPath = "vgg19.npy"):self.X = xself.KEEPPRO = keepProself.CLASSNUM = classNumself.SKIP = skipself.MODELPATH = modelPath#build CNNself.buildCNN()def buildCNN(self):"""build model"""conv1_1 = convLayer(self.X, 3, 3, 1, 1, 64, "conv1_1" )conv1_2 = convLayer(conv1_1, 3, 3, 1, 1, 64, "conv1_2")pool1 = maxPoolLayer(conv1_2, 2, 2, 2, 2, "pool1")conv2_1 = convLayer(pool1, 3, 3, 1, 1, 128, "conv2_1")conv2_2 = convLayer(conv2_1, 3, 3, 1, 1, 128, "conv2_2")pool2 = maxPoolLayer(conv2_2, 2, 2, 2, 2, "pool2")conv3_1 = convLayer(pool2, 3, 3, 1, 1, 256, "conv3_1")conv3_2 = convLayer(conv3_1, 3, 3, 1, 1, 256, "conv3_2")conv3_3 = convLayer(conv3_2, 3, 3, 1, 1, 256, "conv3_3")conv3_4 = convLayer(conv3_3, 3, 3, 1, 1, 256, "conv3_4")pool3 = maxPoolLayer(conv3_4, 2, 2, 2, 2, "pool3")conv4_1 = convLayer(pool3, 3, 3, 1, 1, 512, "conv4_1")conv4_2 = convLayer(conv4_1, 3, 3, 1, 1, 512, "conv4_2")conv4_3 = convLayer(conv4_2, 3, 3, 1, 1, 512, "conv4_3")conv4_4 = convLayer(conv4_3, 3, 3, 1, 1, 512, "conv4_4")pool4 = maxPoolLayer(conv4_4, 2, 2, 2, 2, "pool4")conv5_1 = convLayer(pool4, 3, 3, 1, 1, 512, "conv5_1")conv5_2 = convLayer(conv5_1, 3, 3, 1, 1, 512, "conv5_2")conv5_3 = convLayer(conv5_2, 3, 3, 1, 1, 512, "conv5_3")conv5_4 = convLayer(conv5_3, 3, 3, 1, 1, 512, "conv5_4")pool5 = maxPoolLayer(conv5_4, 2, 2, 2, 2, "pool5")fcIn = tf.reshape(pool5, [-1, 7*7*512])fc6 = fcLayer(fcIn, 7*7*512, 4096, True, "fc6")dropout1 = dropout(fc6, self.KEEPPRO)fc7 = fcLayer(dropout1, 4096, 4096, True, "fc7")dropout2 = dropout(fc7, self.KEEPPRO)self.fc8 = fcLayer(dropout2, 4096, self.CLASSNUM, True, "fc8")def loadModel(self, sess):"""load model"""wDict = np.load(self.MODELPATH, encoding = "bytes").item()#for layers in modelfor name in wDict:if name not in self.SKIP:with tf.variable_scope(name, reuse = True):for p in wDict[name]:if len(p.shape) == 1:#bias 只有一维sess.run(tf.get_variable('b', trainable = False).assign(p))else:#weightssess.run(tf.get_variable('w', trainable = False).assign(p)) 

buildCNN函数完全按照VGG的结构搭建网络。

loadModel函数从模型文件中读取参数,采用的模型文件见github上的readme说明。 至此,我们定义了完整的模型,下面开始测试模型。

模型测试

ImageNet训练的VGG有很多类,几乎包含所有常见的物体,因此我们随便从网上找几张图片测试。比如我直接用了之前做项目的图片,为了避免审美疲劳,我们不只用渣土车,还要用挖掘机、采沙船:

然后编写测试代码:

parser = argparse.ArgumentParser(description='Classify some images.')
parser.add_argument('mode', choices=['folder', 'url'], default='folder')
parser.add_argument('path', help='Specify a path [e.g. testModel]')
args = parser.parse_args(sys.argv[1:])if args.mode == 'folder': #测试方式为本地文件夹#get testImagewithPath = lambda f: '{}/{}'.format(args.path,f)testImg = dict((f,cv2.imread(withPath(f))) for f in os.listdir(args.path) if os.path.isfile(withPath(f)))
elif args.mode == 'url': #测试方式为URLdef url2img(url): #获取URL图像'''url to image'''resp = urllib.request.urlopen(url)image = np.asarray(bytearray(resp.read()), dtype="uint8")image = cv2.imdecode(image, cv2.IMREAD_COLOR)return imagetestImg = {args.path:url2img(args.path)}if testImg.values():#some paramsdropoutPro = 1classNum = 1000skip = []imgMean = np.array([104, 117, 124], np.float)x = tf.placeholder("float", [1, 224, 224, 3])model = vgg19.VGG19(x, dropoutPro, classNum, skip)score = model.fc8softmax = tf.nn.softmax(score)with tf.Session() as sess:sess.run(tf.global_variables_initializer())model.loadModel(sess) #加载模型for key,img in testImg.items():#img preprocessresized = cv2.resize(img.astype(np.float), (224, 224)) - imgMean #去均值maxx = np.argmax(sess.run(softmax, feed_dict = {x: resized.reshape((1, 224, 224, 3))})) #网络输入为224*224res = caffe_classes.class_names[maxx]font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, res, (int(img.shape[0]/3), int(img.shape[1]/3)), font, 1, (0, 255, 0), 2) #在图像上绘制结果print("{}: {}n----".format(key,res)) #输出测试结果cv2.imshow("demo", img)cv2.waitKey(0)

如果你看完了我AlexNet的博客,那么一定会发现我这里的测试代码做了一些小的修改,增加了URL测试的功能,可以测试网上的图像 ,测试结果如下:

 

这篇关于【深度学习】使用tensorflow实现VGG19网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/719001

相关文章

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互