东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3758|回复: 3
打印 上一主题 下一主题

[课堂笔记] 51、经典CNN网络VGGNet比赛:17种花的图片识别_笔记

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14429
QQ
跳转到指定楼层
楼主
发表于 2019-1-12 17:15:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


51、经典CNN网络VGGNet比赛:17种花的图片识别_笔记

如果报错:OOM when allocating tensor with shape
If you want to see a list of allocated tensors when OOM happens
tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape
errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape
是因为:OOM内存溢出 修改代码中 卷积层的深度(核数目调小) 计算指标时传入的训练集数据与测试集数据都需要调小

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2019/1/12 下午5:34'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'tf28'
  6. """
  7. 17种花数据分类,是VGG网络初赛时候的数据集,现在网上没有下载;现在唯一一份数据集在tflearn这个框架中默认自带
  8. tflearn这个框架起始是在tensorflow基础上的一个封装,API比较简单(如果代码功底比较好,建议用tensorflow)
  9. tensorflow的执行速度比tflearn要快  
  10. 基于tensorflow的框架有很多:tflearn  Keras 速度上有区别
  11. Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。
  12. Keras 为支持快速实验而生,能够把你的idea迅速转换为结果

  13. tflearn安装:pip install tflearn

  14. """

  15. from tflearn.datasets import oxflower17
  16. from tflearn.datasets import mnist
  17. from tflearn.datasets import cifar10
  18. import tensorflow as tf
  19. from sklearn.model_selection import train_test_split
  20. # import tflearn as tfl
  21. # incoming, nb_filter, filter_size, strides=1, padding='same'
  22. # tfl.conv_2d()

  23. # 第一步:导入数据
  24. X, Y = oxflower17.load_data(dirname="17flowers", one_hot=True)
  25. print(X.shape)  # sample_number,224,224,3
  26. print(Y.shape)  # sample_number,17

  27. ## 数据分割
  28. train_img, test_img, train_label, test_label = train_test_split(X, Y, test_size=0.2, random_state=0)

  29. print("训练数据-图片shape:{};目标属性shape:{}" .format(train_img.shape, train_label.shape))
  30. print("测试数据-图片shape:{};目标属性shape:{}" .format(test_img.shape, test_label.shape))

  31. train_sample_number = train_img.shape[0]
  32. print('训练数据样本总数:{}'.format(train_sample_number))

  33. # 第二步:设置超参并定义学习率调整策略
  34. # 学习率,一般学习率设置的比较小
  35. learn_rate_base = 0.1
  36. # 每次迭代的训练样本数量
  37. batch_size = 32
  38. # 展示信息的间隔大小
  39. display_step = 1


  40. def learn_rate_func(epoch):
  41.     """
  42.     根据给定的迭代批次,更新产生一个学习率的值 均匀分布策略
  43.     :param epoch:
  44.     :return:
  45.     """
  46.     return max(0.001, learn_rate_base * (0.9 ** int(epoch / 10)))


  47. # 第三步:开始构建模型 设置输入数据的占位符
  48. # 输出的维度大小信息
  49. n_classes = train_label.shape[1]
  50. x = tf.placeholder(tf.float32, shape=[None, 224, 224, 3], name='x')
  51. y = tf.placeholder(tf.float32, shape=[None, n_classes], name='y')
  52. learn_rate = tf.placeholder(tf.float32, name='learn_rate')


  53. # 第四步:构建VGG Net网络(直接将网络结构翻译成为这个代码)
  54. def get_variable(name, shape=None, dtype=tf.float32, initializer=tf.random_normal_initializer(mean=0, stddev=0.1)):
  55.     """
  56.     返回一个对应的变量
  57.     :param name:
  58.     :param shape:
  59.     :param dtype:
  60.     :param initializer:
  61.     :return:
  62.     """
  63.     return tf.get_variable(name, shape, dtype, initializer)


  64. def vgg_network(x, y):
  65.     layer1_kernel_size = 8
  66.     layer3_kernel_size = 16
  67.     layer5_kernal_size_1 = 32
  68.     layer5_kernal_size_2 = 32
  69.     layer7_kernal_size_1 = 64
  70.     layer7_kernal_size_2 = 64
  71.     layer9_kernal_size_1 = 64
  72.     layer9_kernal_size_2 = 64
  73.     layer11_unit_size = 120
  74.     layer12_unit_size = 120
  75.     layer13_unit_size = 17

  76.     # cov3-64 LRN局部响应归一化
  77.     with tf.variable_scope('layer1'):
  78.         net = tf.nn.conv2d(x, filter=get_variable('w', [3, 3, 3, layer1_kernel_size]), strides=[1, 1, 1, 1],
  79.                            padding='SAME')
  80.         net = tf.nn.bias_add(net, get_variable('b', [layer1_kernel_size]))
  81.         net = tf.nn.relu(net)
  82.         # lrn(input, depth_radius=5, bias=1, alpha=1, beta=0.5, name=None)
  83.         # LRN, 局部响应归一化),主要是对ReLU激活函数的输出进行局部归一化操作 而NB层是对样本进行归一化
  84.         # depth_radius ==> 对应公式上的n,bias => 对应公式上的k, alpha => 对应公式上的α, beta=>对应公式上的β
  85.         net = tf.nn.lrn(net)
  86.         print('layer1之后的shape:{}'.format(net.shape))
  87.     # maxpool
  88.     with tf.variable_scope('layer2'):
  89.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  90.         print('layer2之后的shape:{}'.format(net.shape))
  91.     # conv3-128
  92.     with tf.variable_scope('layer3'):
  93.         net = tf.nn.conv2d(net, filter=get_variable('w', [3, 3, layer1_kernel_size, layer3_kernel_size]),
  94.                            strides=[1, 1, 1, 1],
  95.                            padding='SAME')
  96.         net = tf.nn.bias_add(net, get_variable('b', [layer3_kernel_size]))
  97.         net = tf.nn.relu(net)
  98.         print('layer3之后的shape:{}'.format(net.shape))
  99.     # maxpool
  100.     with tf.variable_scope('layer4'):
  101.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  102.         print('layer4之后的shape:{}'.format(net.shape))
  103.     # conv3-256 conv3-256
  104.     with tf.variable_scope('layer5'):
  105.         net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, layer3_kernel_size, layer5_kernal_size_1]),
  106.                            strides=[1, 1, 1, 1],
  107.                            padding='SAME')
  108.         net = tf.nn.bias_add(net, get_variable('b1', [layer5_kernal_size_1]))
  109.         net = tf.nn.relu(net)

  110.         net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, layer5_kernal_size_1, layer5_kernal_size_2]),
  111.                            strides=[1, 1, 1, 1],
  112.                            padding='SAME')
  113.         net = tf.nn.bias_add(net, get_variable('b2', [layer5_kernal_size_2]))
  114.         net = tf.nn.relu(net)
  115.         print('layer5之后的shape:{}'.format(net.shape))
  116.     # maxpool
  117.     with tf.variable_scope('layer6'):
  118.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  119.         print('layer6之后的shape:{}'.format(net.shape))
  120.     # conv3-512 conv3-512
  121.     with tf.variable_scope('layer7'):
  122.         net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, layer5_kernal_size_2, layer7_kernal_size_1]),
  123.                            strides=[1, 1, 1, 1],
  124.                            padding='SAME')
  125.         net = tf.nn.bias_add(net, get_variable('b1', [layer7_kernal_size_1]))
  126.         net = tf.nn.relu(net)

  127.         net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, layer7_kernal_size_1, layer7_kernal_size_2]),
  128.                            strides=[1, 1, 1, 1],
  129.                            padding='SAME')
  130.         net = tf.nn.bias_add(net, get_variable('b2', [layer7_kernal_size_2]))
  131.         net = tf.nn.relu(net)
  132.         print('layer7之后的shape:{}'.format(net.shape))
  133.     # maxpool
  134.     with tf.variable_scope('layer8'):
  135.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  136.         print('layer8之后的shape:{}'.format(net.shape))
  137.     # conv3-512 conv3-512
  138.     with tf.variable_scope('layer9'):
  139.         net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, layer7_kernal_size_2, layer9_kernal_size_1]),
  140.                            strides=[1, 1, 1, 1],
  141.                            padding='SAME')
  142.         net = tf.nn.bias_add(net, get_variable('b1', [layer9_kernal_size_1]))
  143.         net = tf.nn.relu(net)

  144.         net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, layer9_kernal_size_1, layer9_kernal_size_2]),
  145.                            strides=[1, 1, 1, 1],
  146.                            padding='SAME')
  147.         net = tf.nn.bias_add(net, get_variable('b2', [layer9_kernal_size_2]))
  148.         net = tf.nn.relu(net)
  149.         print('layer9之后的shape:{}'.format(net.shape))
  150.     # maxpool
  151.     with tf.variable_scope('layer10'):
  152.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  153.         print('layer10之后的shape:{}'.format(net.shape))
  154.     # fc-4096
  155.     with tf.variable_scope('layer11'):
  156.         # 将四维的数据转换为两维的数据
  157.         shape = net.get_shape()
  158.         feature_number = shape[1] * shape[2] * shape[3]
  159.         net = tf.reshape(net, shape=[-1, feature_number])
  160.         # 全连接
  161.         net = tf.add(tf.matmul(net, get_variable('w', [feature_number, layer11_unit_size])),
  162.                      get_variable('b', [layer11_unit_size]))
  163.         net = tf.nn.relu(net)
  164.         print('layer11之后的shape:{}'.format(net.shape))
  165.     # fc - 4096
  166.     with tf.variable_scope('layer12'):
  167.         # 全连接
  168.         net = tf.add(tf.matmul(net, get_variable('w', [layer11_unit_size, layer12_unit_size])),
  169.                      get_variable('b', [layer12_unit_size]))
  170.         net = tf.nn.relu(net)
  171.         print('layer12之后的shape:{}'.format(net.shape))
  172.     # fc - 1000
  173.     with tf.variable_scope('layer13'):
  174.         # 全连接
  175.         net = tf.add(tf.matmul(net, get_variable('w', [layer12_unit_size, layer13_unit_size])),
  176.                      get_variable('b', [layer13_unit_size]))
  177.         print('layer13之后的shape:{}'.format(net.shape))
  178.     return net

  179. act = vgg_network(x, y)

  180. # 第五步:构建模型的损失函数
  181. # softmax_cross_entropy_with_logits: 计算softmax中的每个样本的交叉熵,logits指定预测值,labels指定实际值
  182. cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=act, labels=y))
  183. # 第六步:构建梯度下降的优化方法(一般用Adam 动量GD)
  184. # 使用Adam优化方式比较多 动量GD
  185. # learning_rate: 要注意,不要过大,过大可能不收敛,也不要过小,过小收敛速度比较慢
  186. train = tf.train.AdadeltaOptimizer(learning_rate=learn_rate).minimize(cost)
  187. # 第七步:计算模型正确率

  188. # tf.argmax:对矩阵按行或列计算最大值对应的下标,和numpy中的一样
  189. # tf.equal:是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的
  190. pred = tf.equal(tf.argmax(act, axis=1), tf.argmax(y, axis=1))
  191. # 正确率(True转换为1,False转换为0)
  192. acc = tf.reduce_mean(tf.cast(pred, tf.float32))
  193. # 第八步:会话中执行阶段(模型的训练与迭代)

  194. # 初始化
  195. init = tf.global_variables_initializer()


  196. with tf.Session() as sess:
  197.     # 进行数据初始化
  198.     sess.run(init)

  199.     # 模型保存、持久化
  200.     saver = tf.train.Saver()
  201.     epoch = 0
  202.     while True:
  203.         avg_cost = 0
  204.         # 计算出总的批次
  205.         total_batch = int(train_sample_number / batch_size)
  206.         # 迭代更新
  207.         for i in range(total_batch):
  208.             # 获取x和y
  209.             batch_xs = train_img[i * batch_size:(i+1) * batch_size]
  210.             batch_ys = train_label[i * batch_size:(i+1) * batch_size]
  211.             feeds = {x: batch_xs, y: batch_ys, learn_rate: learn_rate_func(epoch)}
  212.             # 模型训练
  213.             sess.run(train, feed_dict=feeds)
  214.             # 获取损失函数值
  215.             avg_cost += sess.run(cost, feed_dict=feeds)

  216.         # 重新计算平均损失(相当于计算每个样本的损失值)
  217.         avg_cost = avg_cost / total_batch

  218.         # DISPLAY  显示误差率和训练集的正确率以此测试集的正确率
  219.         if (epoch + 1) % display_step == 0:
  220.             print("批次: %03d 损失函数值: %.9f" % (epoch, avg_cost))
  221.             # 这里之所以使用train_img[:30]和train_label[:30],是因为我使用train_img会出现内存不够的情况,直接就会退出
  222.             feeds = {x: train_img[:30], y: train_label[:30], learn_rate: learn_rate_func(epoch)}
  223.             train_acc = sess.run(acc, feed_dict=feeds)
  224.             print("训练集准确率: %.3f" % train_acc)
  225.             feeds = {x: test_img[:30], y: test_label[:30], learn_rate: learn_rate_func(epoch)}
  226.             test_acc = sess.run(acc, feed_dict=feeds)
  227.             print("测试准确率: %.3f" % test_acc)

  228.             if train_acc >= 0.99 and test_acc >= 0.98:
  229.                 saver.save(sess, './data/vggnet/model_{}_{}'.format(train_acc, test_acc), global_step=epoch)
  230.                 break
  231.         epoch += 1

  232.     # 模型可视化输出
  233.     writer = tf.summary.FileWriter('./data/vggnet/graph', tf.get_default_graph())
  234.     writer.close()

  235. print("end....")





复制代码



17种花的图片识别1.png (839.18 KB, 下载次数: 205)

17种花的图片识别1.png

17种花的图片识别2.png (46.68 KB, 下载次数: 200)

17种花的图片识别2.png

17种花的图片识别3.png (128.57 KB, 下载次数: 205)

17种花的图片识别3.png

17种花的图片识别4.png (468.65 KB, 下载次数: 195)

17种花的图片识别4.png

画板 1.png (1.44 MB, 下载次数: 208)

画板 1.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14429
QQ
沙发
 楼主| 发表于 2019-1-12 18:41:02 | 只看该作者
  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2019/1/12 下午5:34'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'tf28'

  6. import tensorflow as tf
  7. import tflearn as tfl
  8. from tflearn.datasets import oxflower17
  9. from tflearn.datasets import mnist
  10. from tflearn.datasets import cifar10
  11. from sklearn.model_selection import train_test_split


  12. # 第一步:导入数据 tflearn
  13. # tfl.conv_2d()
  14. X, Y = oxflower17.load_data(dirname='17flowers', one_hot=True)
  15. print(X.shape)
  16. print(Y.shape)

  17. train_img, test_img, train_label, test_label = train_test_split(X, Y, test_size=0.2, random_state=0)

  18. print(train_img.shape)
  19. print(train_label.shape)
  20. train_sample_number = train_img.shape[0]


  21. # 第二步:设置超参并定义学习率调整策略
  22. learn_rate_base = 0.1
  23. batch_size = 32
  24. display_step = 1


  25. def learn_rate_func(epoch):
  26.     return max(0.001, learn_rate_base * (0.9 ** int(epoch / 10)))
  27. # 第三步:开始构建模型 设置输入数据的占位符
  28. n_classes = train_label.shape[1]

  29. x = tf.placeholder(tf.float32, shape=[None, 224, 224, 3], name='x')
  30. y = tf.placeholder(tf.float32, shape=[None, n_classes], name='y')
  31. learn_rate = tf.placeholder(tf.float32, name='learn_rate')
  32. # 第四步:构建VGGNet网络(直接将网络结构翻译成为这个代码)


  33. def get_variable(name, shape=None, dtype=tf.float32, initializer=tf.random_normal_initializer(mean=0, stddev=0.1)):
  34.     return tf.get_variable(name, shape, dtype, initializer)


  35. def vgg_network(x, y):
  36.     layer1_kernel_size = 8
  37.     layer3_kernel_size = 16
  38.     layer5_kernel_size_1 = 32
  39.     layer5_kernel_size_2 = 32
  40.     layer7_kernel_size_1 = 64
  41.     layer7_kernel_size_2 = 64
  42.     layer9_kernel_size_1 = 64
  43.     layer9_kernel_size_2 = 64
  44.     layer11_unit_size = 120
  45.     layer12_unit_size = 120
  46.     layer13_unit_size = 17

  47.     # conv3-64 lrn
  48.     with tf.variable_scope('layer1'):
  49.         net = tf.nn.conv2d(x, filter=get_variable('w', shape=[3, 3, 3, layer1_kernel_size]), strides=[1, 1, 1, 1],
  50.                      padding='SAME')
  51.         net = tf.nn.bias_add(net, get_variable('b', shape=[layer1_kernel_size]))
  52.         net = tf.nn.relu(net)
  53.         # lrn(input, depth_radius=5, bias=1, alpha=1, beta=0.5, name=None):
  54.         net = tf.nn.lrn(net)
  55.         print('layer1之后的shape:{}'.format(net.shape))
  56.     # maxpool
  57.     with tf.variable_scope('layer2'):
  58.         net = tf.nn.max_pool(value=net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', data_format='NHWC')
  59.         print('layer2之后的shape:{}'.format(net.shape))
  60.     with tf.variable_scope('layer3'):
  61.         net = tf.nn.conv2d(net, filter=get_variable('w', shape=[3, 3, layer1_kernel_size, layer3_kernel_size]), strides=[1, 1, 1, 1],
  62.                      padding='SAME')
  63.         net = tf.nn.bias_add(net, get_variable('b', shape=[layer3_kernel_size]))
  64.         net = tf.nn.relu(net)
  65.         print('layer3之后的shape:{}'.format(net.shape))
  66.     # maxpool
  67.     with tf.variable_scope('layer4'):
  68.         net = tf.nn.max_pool(value=net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  69.         print('layer4之后的shape:{}'.format(net.shape))
  70.     with tf.variable_scope('layer5'):
  71.         net = tf.nn.conv2d(net, filter=get_variable('w1', shape=[3, 3, layer3_kernel_size, layer5_kernel_size_1]), strides=[1, 1, 1, 1],
  72.                      padding='SAME')
  73.         net = tf.nn.bias_add(net, get_variable('b1', shape=[layer5_kernel_size_1]))
  74.         net = tf.nn.relu(net)

  75.         net = tf.nn.conv2d(net, filter=get_variable('w2', shape=[3, 3, layer5_kernel_size_1, layer5_kernel_size_2]),
  76.                            strides=[1, 1, 1, 1],
  77.                            padding='SAME')
  78.         net = tf.nn.bias_add(net, get_variable('b2', shape=[layer5_kernel_size_2]))
  79.         net = tf.nn.relu(net)
  80.         print('layer5之后的shape:{}'.format(net.shape))
  81.     # maxpool
  82.     with tf.variable_scope('layer6'):
  83.         net = tf.nn.max_pool(value=net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  84.         print('layer6之后的shape:{}'.format(net.shape))
  85.     with tf.variable_scope('layer7'):
  86.         net = tf.nn.conv2d(net, filter=get_variable('w1', shape=[3, 3, layer5_kernel_size_2, layer7_kernel_size_1]), strides=[1, 1, 1, 1],
  87.                      padding='SAME')
  88.         net = tf.nn.bias_add(net, get_variable('b1', shape=[layer7_kernel_size_1]))
  89.         net = tf.nn.relu(net)

  90.         net = tf.nn.conv2d(net, filter=get_variable('w2', shape=[3, 3, layer7_kernel_size_1, layer7_kernel_size_2]),
  91.                            strides=[1, 1, 1, 1],
  92.                            padding='SAME')
  93.         net = tf.nn.bias_add(net, get_variable('b2', shape=[layer7_kernel_size_2]))
  94.         net = tf.nn.relu(net)
  95.         print('layer7之后的shape:{}'.format(net.shape))
  96.     # maxpool
  97.     with tf.variable_scope('layer8'):
  98.         net = tf.nn.max_pool(value=net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  99.         print('layer8之后的shape:{}'.format(net.shape))
  100.     with tf.variable_scope('layer9'):
  101.         net = tf.nn.conv2d(net, filter=get_variable('w1', shape=[3, 3, layer7_kernel_size_2, layer9_kernel_size_1]), strides=[1, 1, 1, 1],
  102.                      padding='SAME')
  103.         net = tf.nn.bias_add(net, get_variable('b1', shape=[layer9_kernel_size_1]))
  104.         net = tf.nn.relu(net)

  105.         net = tf.nn.conv2d(net, filter=get_variable('w2', shape=[3, 3, layer9_kernel_size_1, layer9_kernel_size_2]),
  106.                            strides=[1, 1, 1, 1],
  107.                            padding='SAME')
  108.         net = tf.nn.bias_add(net, get_variable('b2', shape=[layer9_kernel_size_2]))
  109.         net = tf.nn.relu(net)
  110.         print('layer9之后的shape:{}'.format(net.shape))

  111.     # maxpool
  112.     with tf.variable_scope('layer10'):
  113.         net = tf.nn.max_pool(value=net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  114.         print('layer10之后的shape:{}'.format(net.shape))
  115.     # fc-4096
  116.     with tf.variable_scope('layer11'):
  117.         shape = net.get_shape()
  118.         feature_number = shape[1] * shape[2] * shape[3]
  119.         net = tf.reshape(net, shape=[-1, feature_number])
  120.         # FC
  121.         net = tf.add(tf.matmul(net, get_variable('w', shape=[feature_number, layer11_unit_size])), get_variable('b', shape=[layer11_unit_size]))
  122.         net = tf.nn.relu(net)
  123.         print('layer11之后的shape:{}'.format(net.shape))
  124.     with tf.variable_scope('layer12'):

  125.         # FC
  126.         net = tf.add(tf.matmul(net, get_variable('w', shape=[layer11_unit_size, layer12_unit_size])), get_variable('b', shape=[layer12_unit_size]))
  127.         net = tf.nn.relu(net)
  128.         print('layer12之后的shape:{}'.format(net.shape))
  129.     with tf.variable_scope('layer13'):
  130.         # FC
  131.         net = tf.add(tf.matmul(net, get_variable('w', shape=[layer12_unit_size, layer13_unit_size])),
  132.                      get_variable('b', shape=[layer13_unit_size]))
  133.         print('layer13之后的shape:{}'.format(net.shape))
  134.     return net

  135. act = vgg_network(x, y)

  136. # 第五步:构建模型的损失函数
  137. cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=act, labels=y))
  138. # 第六步:构建梯度下降的优化方法(一般用Adam 动量GD)
  139. train = tf.train.AdadeltaOptimizer(learning_rate=learn_rate).minimize(cost)
  140. # 第七步:计算模型正确率
  141. pred = tf.equal(tf.argmax(act, axis=1), tf.argmax(y, axis=1))
  142. acc = tf.reduce_mean(tf.cast(pred, dtype=tf.float32))
  143. # 第八步:会话中执行阶段(模型的训练与迭代)
  144. init_op = tf.global_variables_initializer()

  145. with tf.Session() as sess:
  146.     sess.run(init_op)

  147.     saver = tf.train.Saver()
  148.     epoch = 0
  149.     while True:
  150.         avg_cost = 0
  151.         total_batch = int(train_sample_number / batch_size)
  152.         for i in range(total_batch):
  153.             # batch_xs, batch_ys = mnist.train.next_batch(batch_size)
  154.             batch_xs = train_img[i*batch_size: (i+1)*batch_size]
  155.             batch_ys = train_label[i*batch_size: (i+1)*batch_size]
  156.             feeds = {x: batch_xs, y: batch_ys, learn_rate: learn_rate_func(epoch)}
  157.             sess.run(train, feed_dict=feeds)
  158.             avg_cost += sess.run(cost, feed_dict=feeds)

  159.         avg_cost = avg_cost / total_batch

  160.         if (epoch + 1) % display_step == 0:
  161.             print('批次: %03d 损失函数值:%.9f' % (epoch, avg_cost))
  162.             train_acc = sess.run(acc, feed_dict={x: train_img, y: train_label, learn_rate: learn_rate_func(epoch)})
  163.             print('训练集的准确率:%0.3f' % train_acc)
  164.             test_acc = sess.run(acc, feed_dict={x: test_img, y: test_label, learn_rate: learn_rate_func(epoch)})
  165.             print('测试集的准确率:%0.3f' % test_acc)

  166.             if train_acc > 0.99 and test_acc > 0.98:
  167.                 saver.save(sess, './data/vggnet/model_{}_{}'.format(train_acc, test_acc), global_step=epoch)
  168.                 break
  169.         epoch += 1
  170.     writer = tf.summary.FileWriter('./data/vggnet/graph', tf.get_default_graph())
  171.     writer.close()

  172. print('end....')



复制代码
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14429
QQ
板凳
 楼主| 发表于 2019-1-12 21:31:11 | 只看该作者
另外一种写法 大家看看
  1. # -- encoding:utf-8 --


  2. from tflearn.datasets import oxflower17
  3. import tensorflow as tf

  4. # 读取数据
  5. X, Y = oxflower17.load_data(dirname="17flowers", one_hot=True)
  6. print(X.shape)  # sample_number,224,224,3
  7. print(Y.shape)  # sample_number,17

  8. # 相关的参数、超参数的设置
  9. # 学习率,一般学习率设置的比较小
  10. learn_rate = 0.1
  11. # 每次迭代的训练样本数量
  12. batch_size = 32
  13. # 训练迭代次数(每个迭代次数中必须训练完一次所有的数据集)
  14. train_epoch = 10000
  15. # 样本数量
  16. total_sample_number = X.shape[0]

  17. # 模型构建
  18. # 1. 设置数据输入的占位符
  19. x = tf.placeholder(tf.float32, shape=[None, 224, 224, 3], name='x')
  20. y = tf.placeholder(tf.float32, shape=[None, 17], name='y')


  21. def get_variable(name, shape=None, dtype=tf.float32, initializer=tf.random_normal_initializer(mean=0, stddev=0.1)):
  22.     """
  23.     返回一个对应的变量
  24.     :param name:
  25.     :param shape:
  26.     :param dtype:
  27.     :param initializer:
  28.     :return:
  29.     """
  30.     return tf.get_variable(name, shape, dtype, initializer)


  31. # 网络的构建
  32. def vgg_network(x, y):
  33.     net1_kernel_size = 8
  34.     net3_kernel_size = 16
  35.     net5_kernal_size_1 = 32
  36.     net5_kernal_size_2 = 32
  37.     net7_kernal_size_1 = 64
  38.     net7_kernal_size_2 = 64
  39.     net9_kernal_size_1 = 64
  40.     net9_kernal_size_2 = 64
  41.     net11_unit_size = 120
  42.     net12_unit_size = 120
  43.     net13_unit_size = 17

  44.     # cov3-64 lrn
  45.     with tf.variable_scope('net1'):
  46.         net = tf.nn.conv2d(x, filter=get_variable('w', [3, 3, 3, net1_kernel_size]), strides=[1, 1, 1, 1],
  47.                            padding='SAME')
  48.         net = tf.nn.bias_add(net, get_variable('b', [net1_kernel_size]))
  49.         net = tf.nn.relu(net)
  50.         net = tf.nn.lrn(net)
  51.     # maxpool
  52.     with tf.variable_scope('net2'):
  53.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  54.     # conv3-128
  55.     with tf.variable_scope('net3'):
  56.         net = tf.nn.conv2d(net, filter=get_variable('w', [3, 3, net1_kernel_size, net3_kernel_size]),
  57.                            strides=[1, 1, 1, 1],
  58.                            padding='SAME')
  59.         net = tf.nn.bias_add(net, get_variable('b', [net3_kernel_size]))
  60.         net = tf.nn.relu(net)
  61.     # maxpool
  62.     with tf.variable_scope('net4'):
  63.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  64.     # conv3-256 conv3-256
  65.     with tf.variable_scope('net5'):
  66.         net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, net3_kernel_size, net5_kernal_size_1]),
  67.                            strides=[1, 1, 1, 1],
  68.                            padding='SAME')
  69.         net = tf.nn.bias_add(net, get_variable('b1', [net5_kernal_size_1]))
  70.         net = tf.nn.relu(net)

  71.         net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, net5_kernal_size_1, net5_kernal_size_2]),
  72.                            strides=[1, 1, 1, 1],
  73.                            padding='SAME')
  74.         net = tf.nn.bias_add(net, get_variable('b2', [net5_kernal_size_2]))
  75.         net = tf.nn.relu(net)
  76.     # maxpool
  77.     with tf.variable_scope('net6'):
  78.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  79.     # conv3-512 conv3-512
  80.     with tf.variable_scope('net7'):
  81.         net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, net5_kernal_size_2, net7_kernal_size_1]),
  82.                            strides=[1, 1, 1, 1],
  83.                            padding='SAME')
  84.         net = tf.nn.bias_add(net, get_variable('b1', [net7_kernal_size_1]))
  85.         net = tf.nn.relu(net)

  86.         net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, net7_kernal_size_1, net7_kernal_size_2]),
  87.                            strides=[1, 1, 1, 1],
  88.                            padding='SAME')
  89.         net = tf.nn.bias_add(net, get_variable('b2', [net7_kernal_size_2]))
  90.         net = tf.nn.relu(net)
  91.     # maxpool
  92.     with tf.variable_scope('net8'):
  93.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  94.     # conv3-512 conv3-512
  95.     with tf.variable_scope('net9'):
  96.         net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, net7_kernal_size_2, net9_kernal_size_1]),
  97.                            strides=[1, 1, 1, 1],
  98.                            padding='SAME')
  99.         net = tf.nn.bias_add(net, get_variable('b1', [net9_kernal_size_1]))
  100.         net = tf.nn.relu(net)

  101.         net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, net9_kernal_size_1, net9_kernal_size_2]),
  102.                            strides=[1, 1, 1, 1],
  103.                            padding='SAME')
  104.         net = tf.nn.bias_add(net, get_variable('b2', [net9_kernal_size_2]))
  105.         net = tf.nn.relu(net)
  106.     # maxpool
  107.     with tf.variable_scope('net10'):
  108.         net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  109.     # fc
  110.     with tf.variable_scope('net11'):
  111.         # 将四维的数据转换为两维的数据
  112.         shape = net.get_shape()
  113.         feature_number = shape[1] * shape[2] * shape[3]
  114.         net = tf.reshape(net, shape=[-1, feature_number])
  115.         # 全连接
  116.         net = tf.add(tf.matmul(net, get_variable('w', [feature_number, net11_unit_size])),
  117.                      get_variable('b', [net11_unit_size]))
  118.         net = tf.nn.relu(net)
  119.     # fc
  120.     with tf.variable_scope('net12'):
  121.         # 全连接
  122.         net = tf.add(tf.matmul(net, get_variable('w', [net11_unit_size, net12_unit_size])),
  123.                      get_variable('b', [net12_unit_size]))
  124.         net = tf.nn.relu(net)
  125.     # fc
  126.     with tf.variable_scope('net13'):
  127.         # 全连接
  128.         net = tf.add(tf.matmul(net, get_variable('w', [net12_unit_size, net13_unit_size])),
  129.                      get_variable('b', [net13_unit_size]))

  130.     return net


  131. # 获取网络
  132. act = vgg_network(x, y)

  133. # 构建损失函数,优化器,准确率评估
  134. cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=act))  # 损失函数

  135. # 优化器
  136. # AdamOptimizer通过使用动量(参数的移动平均数)来改善传统梯度下降,促进超参数动态调整。
  137. # 我们可以通过创建标签错误率的摘要标量来跟踪丢失和错误率
  138. # 一个寻找全局最优点的优化算法,引入了二次方梯度校正。
  139. # 相比于基础SGD算法,1.不容易陷于局部优点。2.速度更快
  140. train = tf.train.GradientDescentOptimizer(learning_rate=learn_rate).minimize(cost)

  141. # 正确率
  142. # y [[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]] ->arg_max(y,1)->[0,1]
  143. # net  y [[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],[0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ]
  144. correct_pred = tf.equal(tf.argmax(y, axis=1), tf.argmax(act, axis=1))
  145. acc = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

  146. # 训练
  147. with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
  148.     # 2.初始化所有的变量(一定在变量构建之后调用初始化操作)
  149.     tf.global_variables_initializer().run()
  150.     # 3.迭代训练
  151.     for epoch in range(train_epoch):
  152.         # 4.计算一次迭代batch执行的次数
  153.         total_batch = int(total_sample_number / batch_size) - 5
  154.         # 迭代更新
  155.         for step in range(total_batch):
  156.             # 获取当前批次的数据
  157.             train_x = X[step * batch_size:step * batch_size + batch_size]
  158.             train_y = Y[step * batch_size:step * batch_size + batch_size]
  159.             # 模型训练
  160.             sess.run(train, feed_dict={x: train_x, y: train_y})

  161.             # 每更新10次,输出一下
  162.             if step % 10 == 0:
  163.                 loss, accuracy = sess.run([cost, acc], feed_dict={x: train_x, y: train_y})
  164.                 print('迭代次数:{}, 步骤:{}, 训练集损失函数:{}, 训练集准确率:{}'.format(epoch, step, loss, accuracy))

  165.         # 展示一下
  166.         if epoch % 2 == 0:
  167.             # 获取测试集数据
  168.             test_x = X[step * batch_size:]
  169.             test_y = Y[step * batch_size:]
  170.             loss, accuracy = sess.run([cost, acc], feed_dict={x: test_x, y: test_y})
  171.             print('*' * 100)
  172.             print('步骤:', epoch)
  173.             print('测试集损失函数值:{},测试集准确率:{}'.format(loss, accuracy))
  174.             loss, accuracy = sess.run([cost, acc], feed_dict={x: train_x, y: train_y})
  175.             print('训练集损失函数:{}, 训练集准确率:{}'.format(loss, accuracy))

  176. print("End!!")





复制代码
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

18

帖子

56

积分

注册会员

Rank: 2

积分
56
地板
发表于 2020-5-30 11:25:34 | 只看该作者
学习 学习 厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-19 11:32 , Processed in 0.208139 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表