东方耀AI技术分享

标题: 02、VGG16预训练好的参数加载与模型网络构建_笔记 [打印本页]

作者: 东方耀    时间: 2019-3-12 16:44
标题: 02、VGG16预训练好的参数加载与模型网络构建_笔记


02、VGG16预训练好的参数加载与模型网络构建_笔记

vgg16与vgg19预训练好的参数文件下载【回复本帖可见】:

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2019/3/12 下午5:19'
  4. __product__ = 'PyCharm'
  5. __filename__ = '1_vgg16_content'


  6. import numpy as np

  7. vgg16_data = np.load('vgg16.npy', encoding='latin1')

  8. print(type(vgg16_data))
  9. data_dict = vgg16_data.item()
  10. print(type(data_dict))
  11. print(data_dict.keys())
  12. print(len(data_dict))

  13. conv1_1 = data_dict['conv1_1']
  14. print(len(conv1_1))
  15. w, b = conv1_1
  16. print(w.shape)
  17. print(b.shape)

  18. conv3_1 = data_dict['conv3_1']
  19. print(len(conv3_1))
  20. w, b = conv3_1
  21. print(w.shape)
  22. print(b.shape)

  23. fc6 = data_dict['fc6']
  24. w, b = fc6
  25. print(w.shape)
  26. print(b.shape)

  27. fc8 = data_dict['fc8']
  28. w, b = fc8
  29. print(w.shape)
  30. print(b.shape)




复制代码


  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2019/3/12 下午5:33'
  4. __product__ = 'PyCharm'
  5. __filename__ = '2_image_style_con'

  6. import tensorflow as tf
  7. from tensorflow import logging
  8. import os
  9. import time
  10. import numpy as np


  11. logging.set_verbosity(logging.INFO)

  12. # logging.info('dfy_88888')
  13. # vgg net 中写死的 归一化的数据预处理
  14. VGG_MEAN = [103.939, 116.779, 123.68]


  15. class VGGNet:
  16.     """
  17.     构建VGG16的网络结构 并从预训练好的模型提取参数 加载
  18.     """
  19.     def __init__(self, data_dict):
  20.         self.data_dict = data_dict

  21.     def get_conv_kernel(self, name):
  22.         # 卷积核的参数:w 0  b 1
  23.         return tf.constant(self.data_dict[name][0], name='conv')

  24.     def get_fc_weight(self, name):
  25.         return tf.constant(self.data_dict[name][0], name='fc')

  26.     def get_bias(self, name):
  27.         return tf.constant(self.data_dict[name][1], name='bias')

  28.     def conv_layer(self, inputs, name):
  29.         """
  30.         构建一个卷积计算层
  31.         :param inputs: 输入的feature_map
  32.         :param name: 卷积层的名字 也是获得参数的key 不能出错
  33.         :return:
  34.         """
  35.         with tf.name_scope(name):
  36.             """
  37.             多使用name_scope的好处:1、防止参数命名冲突 2、tensorboard可视化时很规整
  38.             如果scope里面有变量需要训练时则用tf.variable_scope
  39.             """
  40.             conv_w = self.get_conv_kernel(name)
  41.             conv_b = self.get_bias(name)
  42.             # tf.layers.conv2d() 这是一个封装更高级的api
  43.             # 里面并没有提供接口来输入卷积核参数 这里不能用 平时训练cnn网络时非常好用
  44.             result = tf.nn.conv2d(input=inputs, filter=conv_w, strides=[1, 1, 1, 1], padding='SAME', name=name)
  45.             result = tf.nn.bias_add(result, conv_b)
  46.             result = tf.nn.relu(result)
  47.             return result

  48.     def pooling_layer(self, inputs, name):
  49.         # tf.layers.max_pooling2d()
  50.         # tf.nn.max_pool 这里的池化层没有参数 两套api都可以用
  51.         return tf.nn.max_pool(inputs, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME', name=name)

  52.     def fc_layer(self, inputs, name, activation=tf.nn.relu):
  53.         """
  54.         构建全连接层
  55.         :param inputs: 输入
  56.         :param name:
  57.         :param activation: 是否有激活函数的封装
  58.         :return:
  59.         """
  60.         with tf.name_scope(name):
  61.             fc_w = self.get_fc_weight(name)
  62.             fc_b = self.get_bias(name)
  63.             # fc: wx+b 线性变换
  64.             result = tf.nn.bias_add(tf.matmul(inputs, fc_w), fc_b)
  65.             if activation is None:
  66.                 # vgg16的最后是不需relu激活的
  67.                 return result
  68.             else:
  69.                 return activation(result)

  70.     def flatten_op(self, inputs, name):
  71.         # 展平操作 为了后续的fc层必须将维度展平
  72.         with tf.name_scope(name):
  73.             # [NHWC]---> [N, H*W*C]

  74.             x_shape = inputs.get_shape().as_list()
  75.             dim = 1
  76.             for d in x_shape[1:]:
  77.                 dim *= d
  78.             inputs = tf.reshape(inputs, shape=[-1, dim])
  79.             # 直接用现成api也是可以的
  80.             # return tf.layers.flatten(inputs)
  81.             return inputs

  82.     def build(self, input_rgb):
  83.         """
  84.         构建vgg16网络结构 抽取特征 FP过程
  85.         :param input_rgb: [1, 224, 224, 3]
  86.         :return:
  87.         """
  88.         start_time = time.time()
  89.         logging.info('building start...')

  90.         # 在通道维度上分离 深度可分离卷积中也需要用到这个api
  91.         r, g, b = tf.split(input_rgb, num_or_size_splits=3, axis=3)
  92.         # 在通道维度上拼接
  93.         # 输入vgg网络的图像是bgr的(与OpenCV一样 倒序的)而不是rgb
  94.         x_bgr = tf.concat(values=[
  95.             b - VGG_MEAN[0],
  96.             g - VGG_MEAN[1],
  97.             r - VGG_MEAN[2],
  98.         ], axis=3)

  99.         assert x_bgr.get_shape().as_list()[1:] == [224, 224, 3]

  100.         # 构建网络
  101.         # stage 1
  102.         self.conv1_1 = self.conv_layer(x_bgr, 'conv1_1')
  103.         self.conv1_2 = self.conv_layer(self.conv1_1, 'conv1_2')
  104.         self.pool1 = self.pooling_layer(self.conv1_2, 'pool1')

  105.         # stage 2
  106.         self.conv2_1 = self.conv_layer(self.pool1, 'conv2_1')
  107.         self.conv2_2 = self.conv_layer(self.conv2_1, 'conv2_2')
  108.         self.pool2 = self.pooling_layer(self.conv2_2, 'pool2')

  109.         # stage 3
  110.         self.conv3_1 = self.conv_layer(self.pool2, 'conv3_1')
  111.         self.conv3_2 = self.conv_layer(self.conv3_1, 'conv3_2')
  112.         self.conv3_3 = self.conv_layer(self.conv3_2, 'conv3_3')
  113.         self.pool3 = self.pooling_layer(self.conv3_3, 'pool3')

  114.         # stage 4
  115.         self.conv4_1 = self.conv_layer(self.pool3, 'conv4_1')
  116.         self.conv4_2 = self.conv_layer(self.conv4_1, 'conv4_2')
  117.         self.conv4_3 = self.conv_layer(self.conv4_2, 'conv4_3')
  118.         self.pool4 = self.pooling_layer(self.conv4_3, 'pool4')

  119.         # stage 5
  120.         self.conv5_1 = self.conv_layer(self.pool4, 'conv5_1')
  121.         self.conv5_2 = self.conv_layer(self.conv5_1, 'conv5_2')
  122.         self.conv5_3 = self.conv_layer(self.conv5_2, 'conv5_3')
  123.         self.pool5 = self.pooling_layer(self.conv5_3, 'pool5')

  124.         # flatten_op
  125.         self.flatten = self.flatten_op(self.pool5, 'flatten_op')

  126.         # fc
  127.         self.fc6 = self.fc_layer(self.flatten, 'fc6')
  128.         self.fc7 = self.fc_layer(self.fc6, 'fc7')
  129.         self.fc8 = self.fc_layer(self.fc7, 'fc8', activation=None)
  130.         self.logits = tf.nn.softmax(self.fc8, name='logits')
  131.         logging.info('building end... 耗时%3d秒' % (time.time() - start_time))


  132. vgg16_npy_path = './vgg16.npy'
  133. vgg16_data = np.load(vgg16_npy_path, encoding='latin1')

  134. print(type(vgg16_data))
  135. data_dict = vgg16_data.item()

  136. vgg16_for_result = VGGNet(data_dict)
  137. image_rgb = tf.placeholder(dtype=tf.float32, shape=[1, 224, 224, 3], name='image_rgb')
  138. vgg16_for_result.build(image_rgb)
  139. print(vgg16_for_result.conv1_1)
  140. print(vgg16_for_result.fc6)





复制代码








作者: 虎宝宝    时间: 2019-3-13 19:58
fdsafsadf
作者: weiguangnixia    时间: 2019-3-19 22:49
fsdfasdfdsa
作者: 水水水水    时间: 2019-4-14 22:03
ssssssssssss
作者: 谭浩良    时间: 2019-4-17 09:39
看看大神莫i噢噢噢噢噢噢噢噢
作者: hmiao04    时间: 2019-4-23 09:58
飞得高奋斗过
作者: yqchilde    时间: 2019-4-29 08:58
跟着东方老师学习
作者: 阳阳11    时间: 2019-5-26 17:40
谢谢楼主分享
作者: jlbu    时间: 2019-5-29 14:54
111
作者: 何马    时间: 2019-7-17 12:04
12121
作者: 小小猿    时间: 2019-12-11 09:11
666666
作者: ai111cjs    时间: 2020-1-10 09:23
zanzanzanzan
作者: 老人与海    时间: 2020-1-16 14:45
好好看,学习下
作者: asdfghjkl    时间: 2020-3-11 07:44
qwwwwwwwww
作者: 七七绯    时间: 2020-3-11 21:05
12323333333333332226
作者: xiang    时间: 2020-3-20 16:59
21313fdasasfasd
作者: 415263    时间: 2020-3-23 15:18
66666666666666

作者: a905710420    时间: 2020-3-26 20:04
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
作者: judson    时间: 2020-4-8 14:13
1
作者: 1732077205    时间: 2020-4-8 15:10
666666666666666666666666
作者: 胖达儿    时间: 2020-4-12 19:13
努力学习

作者: 许鸭梨    时间: 2020-4-13 15:04
会根据数据库和
作者: 361822697    时间: 2020-4-15 11:16
来学习啦
作者: 叶子    时间: 2020-4-17 17:53
学习一下
作者: parkyu    时间: 2020-4-24 10:42
gdfhdfhgfhhg
作者: 小白1    时间: 2020-4-29 08:34
哈哈哈哈哈哈哈哈哈
作者: fzp    时间: 2020-5-18 15:45
klklkllklklklklk
作者: 朱轩    时间: 2020-5-23 17:34
想看++++++++++++++++
作者: 万物皆虚    时间: 2020-5-26 14:47
111111111111
作者: balabala    时间: 2020-6-1 11:01
youxiu66666
作者: Honiyo    时间: 2020-6-6 18:58
谢谢分享
作者: Kacehorry    时间: 2020-6-9 15:26
顶顶!!!!!!!!!!!!

作者: 热血斌    时间: 2020-6-10 23:50
东哥讲得好棒
作者: 吧卟啊吧卟    时间: 2020-6-11 19:49
666
作者: tj_Aiden    时间: 2020-7-8 01:05
谢谢,非常感谢!
作者: 冰冰李    时间: 2020-7-8 16:15
感谢分享
作者: polly    时间: 2020-7-11 17:35
赞赞赞赞赞赞赞赞赞赞赞赞赞
作者: Mallika    时间: 2020-7-18 22:18
谢谢耀耀

作者: Mallika    时间: 2020-7-18 22:19
谢谢谢谢十分感谢!!!
作者: 懒虫不懒    时间: 2020-7-28 16:22
bilibili_vgg16
作者: woodcss    时间: 2020-8-18 16:11
asadasdasd
作者: 新疆小王子    时间: 2020-8-27 23:00
rrfdsfsasdasdasdasdasd
作者: 阿森    时间: 2020-8-31 17:12
感谢分享
作者: zkq0519    时间: 2020-9-2 15:33
11
作者: xinxin342    时间: 2020-9-11 17:21
大声膜拜膜拜
作者: 码云家的大外甥    时间: 2020-9-13 20:02
111111111111111111111111111
作者: 唐小龙    时间: 2020-10-20 15:53
正好现在要用到迁移学习
作者: illsysm    时间: 2020-10-24 15:12

作者: shmiwtgy    时间: 2020-10-28 19:05
hgjgkufhjg
作者: 小叮当    时间: 2020-11-2 21:54
回复本贴可见
作者: 记得吃饭    时间: 2020-11-25 22:45
123风格的司法部搜索
作者: ZhouYez    时间: 2020-12-2 22:05
s'f'w'fsffewfsfwef
作者: 肖鹏飞    时间: 2020-12-9 09:57
牛逼牛逼
作者: 286123    时间: 2020-12-12 09:29
1111111111

作者: 666666    时间: 2020-12-14 15:25
wehwehhhhhhhhhhhhhhhhh
作者: 1160314841    时间: 2021-1-6 12:12
谢谢分享
作者: 海大小科比    时间: 2021-1-12 21:19
很好,非常实用,very good
作者: puppy    时间: 2021-1-20 14:17
ggssssssssssssssssss
作者: user_wu    时间: 2021-1-24 17:44
新手来学习

作者: AlotBina    时间: 2021-1-31 13:30
123213123123
作者: bling    时间: 2021-2-20 13:05
下载资料来了
作者: Gruiaaaa    时间: 2021-2-21 16:27
sasasasasas
作者: litty    时间: 2021-3-3 17:05
可以的,跟着学习
作者: ssss_jy    时间: 2021-3-21 12:37
谢谢大佬!
作者: 王天    时间: 2021-3-23 09:13
sssssssssssssss
作者: 安全毕业    时间: 2021-3-25 21:11
需要资料
作者: 17608506138    时间: 2021-4-5 13:05
qweqewqeqewqwe
作者: htczfy    时间: 2021-4-7 12:42
11111111111111111
作者: 菜鸟1号    时间: 2021-4-11 01:07
ssssssgugugug
作者: hangzhoulzt    时间: 2021-4-14 09:01
asdfsdfgkjn,l
作者: vivalaconda    时间: 2021-4-14 14:28
为了学习,冲鸭
作者: 戚学通    时间: 2021-4-28 13:37
VGG16VGGG16
作者: sakura    时间: 2021-5-2 18:58
laillail来俩俩了俩
作者: 郭靖南风    时间: 2021-5-14 10:17
非常不错呢,非常不错呢。
作者: AIstudy    时间: 2021-5-17 18:07
222222222222222222222
作者: tulip    时间: 2021-5-18 16:10
111111111111111111111111111111
作者: qASDSAD    时间: 2021-7-1 14:24
sdaadasdsadgrg

作者: liangsai    时间: 2021-7-6 10:27
老师讲课知识点很新,讲的也很详细
作者: 北叶梦雨    时间: 2021-8-4 11:11
666666666666
作者: DMM    时间: 2021-8-8 15:52
chaolihaide yaolaoshi
作者: carrot_66    时间: 2021-8-18 16:31
666666666666

作者: shishuinianhua    时间: 2021-8-29 16:08
studydsadsa
作者: 123456.    时间: 2021-9-16 20:22
123456safdafdafs
作者: 傅拉师徒的手稿    时间: 2021-10-8 09:21
111111111111

作者: Cynthia    时间: 2021-10-19 15:35
jgjhaswghafgmjd
作者: wangteng    时间: 2021-10-31 17:29
xuexiwedrefr
作者: daodaomomo    时间: 2021-11-4 16:52
赞赞赞赞赞赞赞赞赞赞赞
作者: wolf_DNJJ    时间: 2021-11-12 22:03
大神牛皮

作者: wolf_DNJJ    时间: 2021-11-12 22:04
大神666,哔站跑过来学习一手
作者: peijian    时间: 2021-11-29 15:10
VGG16预训练好的参数加载与模型网络构建_笔记
作者: xzr123    时间: 2021-11-30 10:03
11111122233111
作者: 学徒xt    时间: 2022-1-5 23:41
学习学习
作者: 飞翔的土豆    时间: 2022-1-7 15:41
飞翔的土豆到此处一游
作者: tan99518    时间: 2022-1-9 11:17
T55UUUUUUUUUUU
作者: 1554294651    时间: 2022-2-16 18:14
受益匪浅
作者: wanmeirongyan    时间: 2022-2-27 15:45
xuexixuexi
作者: 19955430637    时间: 2022-3-9 17:55
老师好厉害
作者: wanghuiru    时间: 2022-3-19 22:47
哇哦,牛牛牛666666666666
作者: 12345qaz    时间: 2022-3-22 14:49

作者: 可口可乐    时间: 2022-3-29 21:54
666666666666666666666666666




欢迎光临 东方耀AI技术分享 (http://www.ai111.vip/) Powered by Discuz! X3.4