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

转载出处:http://blog.csdn.net/accepthjp/article/details/70170217

本文讲述使用tensorflow实现VGG19网络。

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

同样先放上我的代码,由AlexNet的代码改过来的:https://github.com/hjptriplebee/VGG19_with_tensorflow

如果想运行代码,详细的配置要求都在上面链接的readme文件中了。本文建立在一定的tensorflow基础上,不会对太细的点进行说明。

模型结构


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


模型定义

[python]  view plain  copy
  1. def maxPoolLayer(x, kHeight, kWidth, strideX, strideY, name, padding = "SAME"):  
  2.     """max-pooling"""  
  3.     return tf.nn.max_pool(x, ksize = [1, kHeight, kWidth, 1],  
  4.                           strides = [1, strideX, strideY, 1], padding = padding, name = name)  
  5.   
  6. def dropout(x, keepPro, name = None):  
  7.     """dropout"""  
  8.     return tf.nn.dropout(x, keepPro, name)  
  9.   
  10. def fcLayer(x, inputD, outputD, reluFlag, name):  
  11.     """fully-connect"""  
  12.     with tf.variable_scope(name) as scope:  
  13.         w = tf.get_variable("w", shape = [inputD, outputD], dtype = "float")  
  14.         b = tf.get_variable("b", [outputD], dtype = "float")  
  15.         out = tf.nn.xw_plus_b(x, w, b, name = scope.name)  
  16.         if reluFlag:  
  17.             return tf.nn.relu(out)  
  18.         else:  
  19.             return out  
  20.   
  21. def convLayer(x, kHeight, kWidth, strideX, strideY,  
  22.               featureNum, name, padding = "SAME"):  
  23.     """convlutional"""  
  24.     channel = int(x.get_shape()[-1]) #获取channel数  
  25.     with tf.variable_scope(name) as scope:  
  26.         w = tf.get_variable("w", shape = [kHeight, kWidth, channel, featureNum])  
  27.         b = tf.get_variable("b", shape = [featureNum])  
  28.         featureMap = tf.nn.conv2d(x, w, strides = [1, strideY, strideX, 1], padding = padding)  
  29.         out = tf.nn.bias_add(featureMap, b)  
  30.         return tf.nn.relu(tf.reshape(out, featureMap.get_shape().as_list()), name = scope.name)  

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

[python]  view plain  copy
  1. class VGG19(object):  
  2.     """VGG model"""  
  3.     def __init__(self, x, keepPro, classNum, skip, modelPath = "vgg19.npy"):  
  4.         self.X = x  
  5.         self.KEEPPRO = keepPro  
  6.         self.CLASSNUM = classNum  
  7.         self.SKIP = skip  
  8.         self.MODELPATH = modelPath  
  9.         #build CNN  
  10.         self.buildCNN()  
  11.   
  12.     def buildCNN(self):  
  13.         """build model"""  
  14.         conv1_1 = convLayer(self.X, 331164"conv1_1" )  
  15.         conv1_2 = convLayer(conv1_1, 331164"conv1_2")  
  16.         pool1 = maxPoolLayer(conv1_2, 2222"pool1")  
  17.   
  18.         conv2_1 = convLayer(pool1, 3311128"conv2_1")  
  19.         conv2_2 = convLayer(conv2_1, 3311128"conv2_2")  
  20.         pool2 = maxPoolLayer(conv2_2, 2222"pool2")  
  21.   
  22.         conv3_1 = convLayer(pool2, 3311256"conv3_1")  
  23.         conv3_2 = convLayer(conv3_1, 3311256"conv3_2")  
  24.         conv3_3 = convLayer(conv3_2, 3311256"conv3_3")  
  25.         conv3_4 = convLayer(conv3_3, 3311256"conv3_4")  
  26.         pool3 = maxPoolLayer(conv3_4, 2222"pool3")  
  27.   
  28.         conv4_1 = convLayer(pool3, 3311512"conv4_1")  
  29.         conv4_2 = convLayer(conv4_1, 3311512"conv4_2")  
  30.         conv4_3 = convLayer(conv4_2, 3311512"conv4_3")  
  31.         conv4_4 = convLayer(conv4_3, 3311512"conv4_4")  
  32.         pool4 = maxPoolLayer(conv4_4, 2222"pool4")  
  33.   
  34.         conv5_1 = convLayer(pool4, 3311512"conv5_1")  
  35.         conv5_2 = convLayer(conv5_1, 3311512"conv5_2")  
  36.         conv5_3 = convLayer(conv5_2, 3311512"conv5_3")  
  37.         conv5_4 = convLayer(conv5_3, 3311512"conv5_4")  
  38.         pool5 = maxPoolLayer(conv5_4, 2222"pool5")  
  39.   
  40.         fcIn = tf.reshape(pool5, [-17*7*512])  
  41.         fc6 = fcLayer(fcIn, 7*7*5124096True"fc6")  
  42.         dropout1 = dropout(fc6, self.KEEPPRO)  
  43.   
  44.         fc7 = fcLayer(dropout1, 40964096True"fc7")  
  45.         dropout2 = dropout(fc7, self.KEEPPRO)  
  46.   
  47.         self.fc8 = fcLayer(dropout2, 4096self.CLASSNUM, True"fc8")  
  48.   
  49.     def loadModel(self, sess):  
  50.         """load model"""  
  51.         wDict = np.load(self.MODELPATH, encoding = "bytes").item()  
  52.         #for layers in model  
  53.         for name in wDict:  
  54.             if name not in self.SKIP:  
  55.                 with tf.variable_scope(name, reuse = True):  
  56.                     for p in wDict[name]:  
  57.                         if len(p.shape) == 1:  
  58.                             #bias 只有一维  
  59.                             sess.run(tf.get_variable('b', trainable = False).assign(p))  
  60.                         else:  
  61.                             #weights  
  62.                             sess.run(tf.get_variable('w', trainable = False).assign(p))   

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

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

模型测试

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

然后编写测试代码:

[python]  view plain  copy
  1. parser = argparse.ArgumentParser(description='Classify some images.')  
  2. parser.add_argument('mode', choices=['folder''url'], default='folder')  
  3. parser.add_argument('path', help='Specify a path [e.g. testModel]')  
  4. args = parser.parse_args(sys.argv[1:])  
  5.   
  6. if args.mode == 'folder'#测试方式为本地文件夹  
  7.     #get testImage  
  8.     withPath = lambda f: '{}/{}'.format(args.path,f)  
  9.     testImg = dict((f,cv2.imread(withPath(f))) for f in os.listdir(args.path) if os.path.isfile(withPath(f)))  
  10. elif args.mode == 'url'#测试方式为URL  
  11.     def url2img(url): #获取URL图像  
  12.         '''''url to image'''  
  13.         resp = urllib.request.urlopen(url)  
  14.         image = np.asarray(bytearray(resp.read()), dtype="uint8")  
  15.         image = cv2.imdecode(image, cv2.IMREAD_COLOR)  
  16.         return image  
  17.     testImg = {args.path:url2img(args.path)}  
  18.   
  19. if testImg.values():  
  20.     #some params  
  21.     dropoutPro = 1  
  22.     classNum = 1000  
  23.     skip = []  
  24.   
  25.     imgMean = np.array([104117124], np.float)  
  26.     x = tf.placeholder("float", [12242243])  
  27.   
  28.     model = vgg19.VGG19(x, dropoutPro, classNum, skip)  
  29.     score = model.fc8  
  30.     softmax = tf.nn.softmax(score)  
  31.   
  32.     with tf.Session() as sess:  
  33.         sess.run(tf.global_variables_initializer())  
  34.         model.loadModel(sess) #加载模型  
  35.   
  36.         for key,img in testImg.items():  
  37.             #img preprocess  
  38.             resized = cv2.resize(img.astype(np.float), (224224)) - imgMean #去均值  
  39.             maxx = np.argmax(sess.run(softmax, feed_dict = {x: resized.reshape((12242243))})) #网络输入为224*224  
  40.             res = caffe_classes.class_names[maxx]  
  41.   
  42.             font = cv2.FONT_HERSHEY_SIMPLEX  
  43.             cv2.putText(img, res, (int(img.shape[0]/3), int(img.shape[1]/3)), font, 1, (02550), 2#在图像上绘制结果  
  44.             print("{}: {}\n----".format(key,res)) #输出测试结果  
  45.             cv2.imshow("demo", img)  
  46.             cv2.waitKey(0)  

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VGG19卷积网络实现需要使用TensorFlow或Keras等深度学习框架。可以参考一些网上的教程,比如TensorFlow官网上的教程:https://www.tensorflow.org/tutorials/images/deep_cnn ### 回答2: 要实现VGG19卷积网络,首先需要了解VGG19的结构和参数设置。VGG19是一种经典的卷积神经网络,由19个卷积层和3个全连接层组成。其主要特点是深度较深,网络结构简单。 我们可以使用Python中的深度学习库,如TensorFlow或PyTorch,来实现VGG19。 首先,我们需要引入所需的库和模块。然后,创建一个空的神经网络模型。 接下来,我们定义VGG19网络结构。可以使用不同的函数或层来构建不同的卷积层和全连接层。在VGG19中,卷积层的核大小通常为3x3,激活函数为ReLU。在每两个卷积层之间,我们可以添加一个池化层,如最大池化或平均池化。 在实现网络结构时,需要根据VGG19的定义添加适当数量的卷积层、池化层和全连接层。最后一层的输出根据问题的要求可以是不同的,如分类、回归等。 在定义网络结构后,我们需要在训练数据上训练该模型。可以使用反向传播算法和优化器来更新网络的权重和偏置。训练过程中,我们可以定义合适的损失函数和评估指标。 最后,我们可以使用训练好的VGG19网络来进行预测。将测试数据输入网络,得到输出结果。 总之,实现VGG19卷积网络的步骤包括定义网络结构、训练模型和进行预测。通过合理选择网络层和参数设置,我们可以根据具体问题进行适当的调整和优化。 ### 回答3: 实现VGG19卷积网络的编写过程包括以下几个步骤: 1.导入所需的Python库和模块,如tensorflow和keras等。 2.定义VGG19网络结构,根据VGG19网络的特点,可以采用堆叠多个卷积层和池化层的方式来构建。 3.构建卷积层,可以通过调用keras中的Conv2D函数来实现。设置卷积核数目、卷积核大小、填充方式和激活函数等参数。 4.构建池化层,通过调用keras中的MaxPooling2D函数来实现。设置池化核大小和步长等参数。 5.按照VGG19网络的结构,逐层添加卷积层和池化层。 6.添加全连接层,将卷积层输出的高维特征降维,并连接到输出层以得出最终的分类结果。 7.设置损失函数,选择适当的优化算法和学习率,并编译模型。 8.通过调用keras中的fit函数对模型进行训练,设置合适的训练参数。 9.评估模型的性能,可以调用keras中的evaluate函数来计算模型在测试集上的准确率等指标。 10.保存模型参数,将训练得到的模型权重保存到文件中,以备后续使用。 总结起来,实现VGG19卷积网络的编写过程主要包括导入所需库和模块、定义网络结构、构建卷积层和池化层、添加全连接层、设置损失函数和优化算法、进行模型训练和评估、保存模型参数等步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值