Keras框架:VGG网络代码实现
VGG概念:
VGG之所以經(jīng)典,在于它首次將深度學(xué)習(xí)做得非常“深”,達 到了16-19層,同時,它用了非常“小”的卷積核(3X3)。
網(wǎng)絡(luò)框架:
VGG的結(jié)構(gòu):
1、一張原始圖片被resize到(224,224,3)。
2、conv1兩次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為64,輸出為(224,224,64),再2X2最大池化,輸出net為 (112,112,64)。
3、conv2兩次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為128,輸出net為(112,112,128),再2X2最大池化,輸出 net為(56,56,128)。
4、conv3三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為256,輸出net為(56,56,256),再2X2最大池化,輸出net 為(28,28,256)。
5、conv3三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為256,輸出net為(28,28,512),再2X2最大池化,輸出net 為(14,14,512)。
6、conv3三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為256,輸出net為(14,14,512),再2X2最大池化,輸出net 為(7,7,512)。
7、利用卷積的方式模擬全連接層,效果等同,輸出net為(1,1,4096)。共進行兩次。
8、利用卷積的方式模擬全連接層,效果等同,輸出net為(1,1,1000)。 最后輸出的就是每個類的預(yù)測。
VGG16代碼實現(xiàn):
網(wǎng)絡(luò)主體部分:(vgg16.py)
#-------------------------------------------------------------# # vgg16的網(wǎng)絡(luò)部分 #-------------------------------------------------------------# import tensorflow as tf# 創(chuàng)建slim對象 slim = tf.contrib.slimdef vgg_16(inputs,num_classes=1000,is_training=True,dropout_keep_prob=0.5,spatial_squeeze=True,scope='vgg_16'):with tf.variable_scope(scope, 'vgg_16', [inputs]):# 建立vgg_16的網(wǎng)絡(luò)# conv1兩次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為64,輸出為(224,224,64)net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')# 2X2最大池化,輸出net為(112,112,64)net = slim.max_pool2d(net, [2, 2], scope='pool1')# conv2兩次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為128,輸出net為(112,112,128)net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')# 2X2最大池化,輸出net為(56,56,128)net = slim.max_pool2d(net, [2, 2], scope='pool2')# conv3三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為256,輸出net為(56,56,256)net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')# 2X2最大池化,輸出net為(28,28,256)net = slim.max_pool2d(net, [2, 2], scope='pool3')# conv3三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為256,輸出net為(28,28,512)net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')# 2X2最大池化,輸出net為(14,14,512)net = slim.max_pool2d(net, [2, 2], scope='pool4')# conv3三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為256,輸出net為(14,14,512)net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')# 2X2最大池化,輸出net為(7,7,512)net = slim.max_pool2d(net, [2, 2], scope='pool5')# 利用卷積的方式模擬全連接層,效果等同,輸出net為(1,1,4096)net = slim.conv2d(net, 4096, [7, 7], padding='VALID', scope='fc6')net = slim.dropout(net, dropout_keep_prob, is_training=is_training,scope='dropout6')# 利用卷積的方式模擬全連接層,效果等同,輸出net為(1,1,4096)net = slim.conv2d(net, 4096, [1, 1], scope='fc7')net = slim.dropout(net, dropout_keep_prob, is_training=is_training,scope='dropout7')# 利用卷積的方式模擬全連接層,效果等同,輸出net為(1,1,1000)net = slim.conv2d(net, num_classes, [1, 1],activation_fn=None,normalizer_fn=None,scope='fc8')# 由于用卷積的方式模擬全連接層,所以輸出需要平鋪if spatial_squeeze:net = tf.squeeze(net, [1, 2], name='fc8/squeezed')return net圖像預(yù)處理部分:(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,method=tf.image.ResizeMethod.BILINEAR,align_corners=False):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()]# 將概率從大到小排列的結(jié)果的序號存入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預(yù)測主體部分:(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))# 建立網(wǎng)絡(luò)結(jié)構(gòu) 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)# 最后結(jié)果進行softmax預(yù)測 pro = tf.nn.softmax(prediction) pre = sess.run(pro,feed_dict={inputs:img1})# 打印預(yù)測結(jié)果 print("result: ") utils.print_prob(pre[0], './synset.txt')總結(jié)
以上是生活随笔為你收集整理的Keras框架:VGG网络代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周公解梦做梦梦到死人是什么征兆
- 下一篇: Keras框架:resent50代码实现