±à¼ÍƼö: |
±¾ÎÄÀ´Ô´Charlotte77£¬±¾ÎĽ«¼òµ¥½éÉÜͨ¹ýËõС¾í»ýºË´óСÀ´¹¹½¨¸üÉîµÄÍøÂ磬ϣÍû¶ÔÄúµÄѧϰÓаïÖú¡£ |
|
VggÍøÂç½á¹¹
VGGnetÊÇOxfordµÄVisual Geometry GroupµÄteam£¬ÔÚILSVRC
2014ÉϵÄÖ÷Òª¹¤×÷ÊÇÖ¤Ã÷ÁËÔö¼ÓÍøÂçµÄÉî¶ÈÄܹ»ÔÚÒ»¶¨³Ì¶ÈÉÏÓ°ÏìÍøÂç×îÖÕµÄÐÔÄÜ£¬ÈçÏÂͼ£¬ÎÄÕÂͨ¹ýÖð²½Ôö¼ÓÍøÂçÉî¶ÈÀ´Ìá¸ßÐÔÄÜ£¬ËäÈ»¿´ÆðÀ´ÓÐÒ»µãС±©Á¦£¬Ã»ÓÐÌØ±ð¶àÈ¡Çɵ쬵«ÊÇȷʵÓÐЧ£¬ºÜ¶àpretrainedµÄ·½·¨¾ÍÊÇʹÓÃVGGµÄmodel£¨Ö÷ÒªÊÇ16ºÍ19£©£¬VGGÏà¶ÔÆäËûµÄ·½·¨£¬²ÎÊý¿Õ¼äºÜ´ó£¬ËùÒÔtrainÒ»¸övggÄ£ÐÍͨ³£Òª»¨·Ñ¸ü³¤µÄʱ¼ä£¬²»¹ý¹«¿ªµÄpretrained
modelÈÃÎÒÃǺܷ½±ãµÄʹÓã¬paperÖеļ¸ÖÖÄ£ÐÍÈçÏ£º

ͼ1 vggÍøÂç½á¹¹
ͼÖÐDºÍE·Ö±ðΪVGG-16ºÍVGG-19£¬²ÎÊý·Ö±ðÊÇ138mºÍ144m£¬ÊÇÎÄÖÐÁ½¸öЧ¹û×îºÃµÄÍøÂç½á¹¹£¬VGGÍøÂç½á¹¹¿ÉÒÔ¿´×öÊÇAlexNetµÄ¼ÓÉî°æ£¬VGGÔÚͼÏñ¼ì²âÖÐЧ¹ûºÜºÃ£¨È磺Faster-RCNN£©£¬ÕâÖÖ´«Í³½á¹¹Ïà¶Ô½ÏºÃµÄ±£´æÁËͼƬµÄ¾Ö²¿Î»ÖÃÐÅÏ¢£¨²»ÏñGoogLeNetÖÐÒýÈëInception¿ÉÄܵ¼ÖÂλÖÃÐÅÏ¢µÄ´íÂÒ£©¡£
ÎÒÃÇÀ´×Ðϸ¿´Ò»ÏÂvgg16µÄÍøÂç½á¹¹£º

ͼ2 vgg16ÍøÂç½á¹¹
´ÓͼÖпÉÒÔ¿´µ½£¬Ã¿¸ö¾í»ý²ã¶¼Ê¹ÓøüСµÄ3¡Á3¾í»ýºË¶ÔͼÏñ½øÐоí»ý£¬²¢°ÑÕâЩСµÄ¾í»ýºËÅÅÁÐÆðÀ´×÷Ϊһ¸ö¾í»ýÐòÁС£Í¨Ë×µãÀ´½²¾ÍÊǶÔÔʼͼÏñ½øÐÐ3¡Á3¾í»ý£¬È»ºóÔÙ½øÐÐ3¡Á3¾í»ý£¬Á¬ÐøÊ¹ÓÃСµÄ¾í»ýºË¶ÔͼÏñ½øÐжà´Î¾í»ý¡£
ÔÚalexnetÀïÎÒÃÇÒ»¿ªÊ¼µÄʱºòÊÇÓÃ11*11µÄ´ó¾í»ýºËÍøÂ磬ΪʲôÔÚÕâÀïÒªÓÃ3*3µÄС¾í»ýºËÀ´¶ÔͼÏñ½øÐоí»ýÄØ£¿²¢ÇÒ»¹ÊÇʹÓÃÁ¬ÐøµÄС¾í»ýºË£¿VGGÒ»¿ªÊ¼Ìá³öµÄʱºò¸ÕºÃÓëLeNetµÄÉè¼ÆÔÔòÏàÎ¥±³£¬ÒòΪLeNetÏàÐÅ´óµÄ¾í»ýºËÄܹ»²¶»ñͼÏñµ±ÖÐÏàËÆµÄÌØÕ÷£¨È¨Öµ¹²Ïí£©¡£AlexNetÔÚdz²ãÍøÂ翪ʼµÄʱºòÒ²ÊÇʹÓÃ9¡Á9¡¢11¡Á11¾í»ýºË£¬²¢ÇÒ¾¡Á¿ÔÚdz²ãÍøÂçµÄʱºò±ÜÃâʹÓÃ1¡Á1µÄ¾í»ýºË¡£µ«ÊÇVGGµÄÉñÆæÖ®´¦¾ÍÊÇÔÚÓÚʹÓöà¸ö3¡Á3¾í»ýºË¿ÉÒÔÄ£·Â½Ï´ó¾í»ýºËÄÇÑù¶ÔͼÏñ½øÐоֲ¿¸ÐÖª¡£ºóÀ´¶à¸öСµÄ¾í»ýºË´®ÁªÕâһ˼Ïë±»GoogleNetºÍResNetµÈÎüÊÕ¡£
´Óͼ1µÄʵÑé½á¹ûÒ²¿ÉÒÔ¿´µ½£¬VGGʹÓöà¸ö3x3¾í»ýÀ´¶Ô¸ßÎ¬ÌØÕ÷½øÐÐÌáÈ¡¡£ÒòΪÈç¹ûʹÓýϴóµÄ¾í»ýºË£¬²ÎÊý¾Í»á´óÁ¿µØÔö¼Ó¡¢ÔËËãʱ¼äÒ²»á³É±¶µÄÌáÉý¡£ÀýÈç3x3µÄ¾í»ýºËÖ»ÓÐ9¸öȨֵ²ÎÊý£¬Ê¹ÓÃ7*7µÄ¾í»ýºËȨֵ²ÎÊý¾Í»áÔö¼Óµ½49¸ö¡£ÒòΪȱ·¦Ò»¸öÄ£ÐÍÈ¥¶Ô´óÁ¿µÄ²ÎÊý½øÐйéÒ»»¯¡¢Ô¼¼õ£¬»òÕß˵ÊÇÏÞÖÆ´ó¹æÄ£µÄ²ÎÊý³öÏÖ£¬Òò´ËѵÁ·ºËÊý¸ü´óµÄ¾í»ýÍøÂç¾Í±äµÃ·Ç³£À§ÄÑÁË¡£
VGGÏàÐÅÈç¹ûʹÓôóµÄ¾í»ýºË½«»áÔì³ÉºÜ´óµÄʱ¼äÀË·Ñ£¬¼õÉٵľí»ýºËÄܹ»¼õÉÙ²ÎÊý£¬½ÚÊ¡ÔËË㿪Ïú¡£ËäȻѵÁ·µÄʱ¼ä±ä³¤ÁË£¬µ«ÊÇ×ÜÌåÀ´ËµÔ¤²âµÄʱ¼äºÍ²ÎÊý¶¼ÊǼõÉÙµÄÁË¡£
VggµÄÓÅÊÆ
ÓëAlexNetÏà±È£º
Ïàͬµã
1.ÕûÌå·Ö5²ã
2.³ýsoftmax²ãÍ⣬×îºó¼¸²ãΪȫÁ¬½Ó²ã£»
3.Îå²ãÖ®¼äͨ¹ýmax poolingÁ¬½Ó¡£
²»Í¬µã
1.ʹÓÃ3¡Á3µÄС¾í»ýºË´úÌæ7¡Á7´ó¾í»ýºË£¬ÍøÂç¹¹½¨µÄ±È½ÏÉ
2.ÓÉÓÚLRNÌ«ºÄ·Ñ¼ÆËã×ÊÔ´£¬ÐԼ۱Ȳ»¸ß£¬ËùÒÔ±»È¥µô£»
3.²ÉÓÃÁ˸ü¶àµÄfeature map£¬Äܹ»ÌáÈ¡¸ü¶àµÄÌØÕ÷£¬´Ó¶øÄܹ»×ö¸ü¶àÌØÕ÷µÄ×éºÏ¡£¡¡¡¡
ÓÃPaddlePaddleʵÏÖVgg
1.ÍøÂç½á¹¹
1 #coding:utf-8
2 '''
3 Created by huxiaoman 2017.12.12
4 vggnet.py:ÓÃvggÍøÂçʵÏÖcifar-10·ÖÀà
5 '''
6
7 import paddle.v2 as paddle
8
9 def vgg(input):
10 def conv_block(ipt, num_filter, groups, dropouts,
num_channels=None):
11 return paddle.networks.img_conv_group(
12 input=ipt,
13 num_channels=num_channels,
14 pool_size=2,
15 pool_stride=2,
16 conv_num_filter=[num_filter] * groups,
17 conv_filter_size=3,
18 conv_act=paddle.activation.Relu(),
19 conv_with_batchnorm=True,
20 conv_batchnorm_drop_rate=dropouts,
21 pool_type=paddle.pooling.Max())
22
23 conv1 = conv_block(input, 64, 2, [0.3, 0],
3)
24 conv2 = conv_block(conv1, 128, 2, [0.4, 0])
25 conv3 = conv_block(conv2, 256, 3, [0.4, 0.4,
0])
26 conv4 = conv_block(conv3, 512, 3, [0.4, 0.4,
0])
27 conv5 = conv_block(conv4, 512, 3, [0.4, 0.4,
0])
28
29 drop = paddle.layer.dropout(input=conv5,
dropout_rate=0.5)
30 fc1 = paddle.layer.fc(input=drop, size=512,
act=paddle.activation.Linear())
31 bn = paddle.layer.batch_norm(
32 input=fc1,
33 act=paddle.activation.Relu(),
34 layer_attr=paddle.attr.Extra(drop_rate=0.5))
35 fc2 = paddle.layer.fc(input=bn, size=512,
act=paddle.activation.Linear())
36 return fc2 |
2.ѵÁ·Ä£ÐÍ
1 #coding:utf-8
2 '''
3 Created by huxiaoman 2017.12.12
4 train_vgg.py:ѵÁ·vgg16¶Ôcifar10Êý¾Ý¼¯½øÐзÖÀà
5 '''
6
7 import sys, os
8 import paddle.v2 as paddle
9 from vggnet import vgg
10
11 with_gpu = os.getenv('WITH_GPU', '0') !=
'1'
12
13 def main():
14 datadim = 3 * 32 * 32
15 classdim = 10
16
17 # PaddlePaddle init
18 paddle.init(use_gpu=with_gpu, trainer
_count=8)
19
20 image = paddle.layer.data(
21 name="image", type=paddle.data_type.
dense_vector(datadim))
22
23 net = vgg(image)
24
25 out = paddle.layer.fc(
26 input=net, size=classdim, act=paddle.
activation.Softmax())
27
28 lbl = paddle.layer.data(
29 name="label", type=paddle.data_type.integer_value(classdim))
30 cost = paddle.layer.classification_cost
(input=out, label=lbl)
31
32 # Create parameters
33 parameters = paddle.parameters.create(cost)
34
35 # Create optimizer
36 momentum_optimizer = paddle.optimizer.
Momentum(
37 momentum=0.9,
38 regularization=paddle.optimizer.L2Regular
ization(rate=0.0002
* 128),
39 learning_rate=0.1 / 128.0,
40 learning_rate_decay_a=0.1,
41 learning_rate_decay_b=50000 * 100,
42 learning_rate_schedule='discexp')
43
44 # End batch and end pass event handler
45 def event_handler(event):
46 if isinstance(event, paddle.event.EndIteration):
47 if event.batch_id % 100 == 0:
48 print "\nPass %d, Batch %d, Cost %f,
%s" % (
49 event.pass_id, event.batch_id, event.cost,
event.metrics)
50 else:
51 sys.stdout.write('.')
52 sys.stdout.flush()
53 if isinstance(event, paddle.event.EndPass):
54 # save parameters
55 with open('params_pass_%d.tar' % event.pass
_id, 'w') as f:
56 parameters.to_tar(f)
57
58 result = trainer.test(
59 reader=paddle.batch(
60 paddle.dataset.cifar.test10(), batch_size=128),
61 feeding={'image': 0,
62 'label': 1})
63 print "\nTest with Pass %d, %s"
% (event.pass_id, result.metrics)
64
65 # Create trainer
66 trainer = paddle.trainer.SGD(
67 cost=cost, parameters=parameters, update_equation=momentum_optimizer)
68
69 # Save the inference topology to protobuf.
70 inference_topology = paddle.topology.Topology
(layers=out)
71 with open("inference_topology.pkl",
'wb') as f:
72 inference_topology.serialize_for_inference(f)
73
74 trainer.train(
75 reader=paddle.batch(
76 paddle.reader.shuffle(
77 paddle.dataset.cifar.train10(), buf_size
=50000),
78 batch_size=128),
79 num_passes=200,
80 event_handler=event_handler,
81 feeding={'image': 0,
82 'label': 1})
83
84 # inference
85 from PIL import Image
86 import numpy as np
87 import os
88
89 def load_image(file):
90 im = Image.open(file)
91 im = im.resize((32, 32), Image.ANTIALIAS)
92 im = np.array(im).astype(np.float32)
93 im = im.transpose((2, 0, 1)) # CHW
94 im = im[(2, 1, 0), :, :] # BGR
95 im = im.flatten()
96 im = im / 255.0
97 return im
98
99 test_data = []
100 cur_dir = os.path.dirname(os.path.realpath
(__file__))
101 test_data.append((load_image(cur_dir + '/
image/dog.png'),
))
102
103 probs = paddle.infer(
104 output_layer=out, parameters=parameters,
input=test_data)
105 lab = np.argsort(-probs) # probs and lab
are the results
of one batch data
106 print "Label of image/dog.png is: %d"
%
lab[0][0]
107
108
109 if __name__ == '__main__':
110 main() |
3.ѵÁ·½á¹û
View Code
´ÓѵÁ·½á¹ûÀ´¿´£¬¿ªÁË7¸öỊ̈߳¬8¸öTesla K80£¬µü´ú200´Î£¬ºÄʱ16h21min£¬Ïà±ÈÓÚ֮ǰѵÁ·µÄlenetºÍalexnetµÄ¼¸¸öСʱÀ´Ëµ£¬Ê±¼äÏûºÄºÜ¸ß£¬µ«Êǽá¹ûºÜºÃ£¬×¼È·ÂÊÊÇ89.11%£¬ÔÚͬÉ豸ºÍµü´ú´ÎÊýÇé¿öÏ£¬±ÈlenetµÄºÍalexnetµÄ¾«¶È¶¼Òª¸ß¡£
ÓÃTensorflowʵÏÖvgg
1.ÍøÂç½á¹¹
1 def inference_op(input_op, keep_prob):
2 p = []
3 # µÚÒ»¿é conv1_1-conv1_2-pool1
4 conv1_1 = conv_op(input_op, name='conv1_1',
kh=3, kw=3,
5 n_out = 64, dh = 1, dw = 1, p = p)
6 conv1_2 = conv_op(conv1_1, name='conv1_2',
kh=3, kw=3,
7 n_out = 64, dh = 1, dw = 1, p = p)
8 pool1 = mpool_op(conv1_2, name = 'pool1',
kh = 2, kw = 2,
9 dw = 2, dh = 2)
10 # µÚ¶þ¿é conv2_1-conv2_2-pool2
11 conv2_1 = conv_op(pool1, name='conv2_1',
kh=3, kw=3,
12 n_out = 128, dh = 1, dw = 1, p = p)
13 conv2_2 = conv_op(conv2_1, name='conv2_2',
kh=3, kw=3,
14 n_out = 128, dh = 1, dw = 1, p = p)
15 pool2 = mpool_op(conv2_2, name = 'pool2',
kh = 2, kw = 2,
16 dw = 2, dh = 2)
17 # µÚÈý¿é conv3_1-conv3_2-conv3_3-pool3
18 conv3_1 = conv_op(pool2, name='conv3_1',
kh=3, kw=3,
19 n_out = 256, dh = 1, dw = 1, p = p)
20 conv3_2 = conv_op(conv3_1, name='conv3_2',
kh=3, kw=3,
21 n_out = 256, dh = 1, dw = 1, p = p)
22 conv3_3 = conv_op(conv3_2, name='conv3_3',
kh=3, kw=3,
23 n_out = 256, dh = 1, dw = 1, p = p)
24 pool3 = mpool_op(conv3_3, name = 'pool3',
kh = 2, kw = 2,
25 dw = 2, dh = 2)
26 # µÚËÄ¿é conv4_1-conv4_2-conv4_3-pool4
27 conv4_1 = conv_op(pool3, name='conv4_1',
kh=3, kw=3,
28 n_out = 512, dh = 1, dw = 1, p = p)
29 conv4_2 = conv_op(conv4_1, name='conv4_2',
kh=3, kw=3,
30 n_out = 512, dh = 1, dw = 1, p = p)
31 conv4_3 = conv_op(conv4_2, name='conv4_3',
kh=3, kw=3,
32 n_out = 512, dh = 1, dw = 1, p = p)
33 pool4 = mpool_op(conv4_3, name = 'pool4',
kh = 2, kw = 2,
34 dw = 2, dh = 2)
35 # µÚÎå¿é conv5_1-conv5_2-conv5_3-pool5
36 conv5_1 = conv_op(pool4, name='conv5_1',
kh=3, kw=3,
37 n_out = 512, dh = 1, dw = 1, p = p)
38 conv5_2 = conv_op(conv5_1, name='conv5_2',
kh=3, kw=3,
39 n_out = 512, dh = 1, dw = 1, p = p)
40 conv5_3 = conv_op(conv5_2, name='conv5_3',
kh=3, kw=3,
41 n_out = 512, dh = 1, dw = 1, p = p)
42 pool5 = mpool_op(conv5_3, name = 'pool5',
kh = 2, kw = 2,
43 dw = 2, dh = 2)
44 # °Ñpool5 ( [7, 7, 512] ) À³ÉÏòÁ¿
45 shp = pool5.get_shape()
46 flattened_shape = shp[1].value * shp[2].value
* shp[3].value
47 resh1 = tf.reshape(pool5, [-1, flattened_shape],
name = 'resh1')
48
49 # È«Á¬½Ó²ã1 Ìí¼ÓÁË DroputÀ´·ÀÖ¹¹ýÄâºÏ
50 fc1 = fc_op(resh1, name = 'fc1', n_out =
2048, p = p)
51 fc1_drop = tf.nn.dropout(fc1, keep_prob,
name = 'fc1_drop')
52
53 # È«Á¬½Ó²ã2 Ìí¼ÓÁË DroputÀ´·ÀÖ¹¹ýÄâºÏ
54 fc2 = fc_op(fc1_drop, name = 'fc2', n_out
= 2048, p = p)
55 fc2_drop = tf.nn.dropout(fc2, keep_prob,
name = 'fc2_drop')
56
57 # È«Á¬½Ó²ã3 ¼ÓÒ»¸ösoftmaxÇó¸øÀà±ðµÄ¸ÅÂÊ
58 fc3 = fc_op(fc2_drop, name = 'fc3', n_out
= 1000, p = p)
59 softmax = tf.nn.softmax(fc3)
60 predictions = tf.argmax(softmax, 1)
61 return predictions, softmax, fc3, p
¸´ÖÆ´úÂë |
2.ѵÁ·ÍøÂç½á¹¹
1 # -*- coding: utf-8 -*-
2 """
3 Created by huxiaoman 2017.12.12
4 vgg_tf.py:ѵÁ·tensorflow°æµÄvgg16ÍøÂ磬¶Ôcifar-10shuju½øÐзÖÀà
5 """
6 from datetime import datetime
7 import math
8 import time
9 import tensorflow as tf
10 import cifar10
11
12 batch_size = 128
13 num_batches = 200
14
15 # ¶¨Ò庯Êý¶Ô¾í»ý²ã½øÐгõʼ»¯
16 # input_op : ÊäÈëÊý¾Ý
17 # name : ¸Ã¾í»ý²ãµÄÃû×Ö£¬ÓÃtf.name_scope()À´ÃüÃû
18 # kh,kw : ·Ö±ðÊǾí»ýºËµÄ¸ßºÍ¿í
19 # n_out : Êä³öͨµÀÊý
20 # dh,dw : ²½³¤µÄ¸ßºÍ¿í
21 # p £º ÊDzÎÊýÁÐ±í£¬´æ´¢VGGËùÓõ½µÄ²ÎÊý
22 # ²ÉÓÃxavier·½·¨¶Ô¾í»ýºËȨֵ½øÐгõʼ»¯
23 def conv_op(input_op, name, kh, kw, n_out,
dh, dw, p):
24 n_in = input_op.get_shape()[-1].value # »ñµÃÊäÈëͼÏñµÄͨµÀÊý
25 with tf.name_scope(name) as scope:
26 kernel = tf.get_variable(scope+'w',
27 shape = [kh, kw, n_in, n_out], dtype = tf.float32,
28 initializer = tf.contrib.layers.xavier_initializer_conv2d())
29 # ¾í»ý²ã¼ÆËã
30 conv = tf.nn.conv2d(input_op, kernel, (1,
dh, dw, 1), padding = 'SAME')
31 bias_init_val = tf.constant(0.0, shape =
[n_out], dtype = tf.float32)
32 biases = tf.Variable(bias_init_val, trainable
= True, name = 'b')
33 z = tf.nn.bias_add(conv, biases)
34 activation = tf.nn.relu(z, name = scope)
35 p += [kernel, biases]
36 return activation
37
38 # ¶¨Ò庯Êý¶ÔÈ«Á¬½Ó²ã½øÐгõʼ»¯
39 # input_op : ÊäÈëÊý¾Ý
40 # name : ¸ÃÈ«Á¬½Ó²ãµÄÃû×Ö
41 # n_out : Êä³öµÄͨµÀÊý
42 # p : ²ÎÊýÁбí
43 # ³õʼ»¯·½·¨Óà xavier·½·¨
44 def fc_op(input_op, name, n_out, p):
45 n_in = input_op.get_shape()[-1].value
46
47 with tf.name_scope(name) as scope:
48 kernel = tf.get_variable(scope+'w',
49 shape = [n_in, n_out], dtype = tf.float32,
50 initializer = tf.contrib.layers.xavier_initializer())
51 biases = tf.Variable(tf.constant(0.1, shape
= [n_out],
52 dtype = tf.float32), name = 'b')
53 activation = tf.nn.relu_layer(input_op, kernel,
# ???????????????
54 biases, name = scope)
55 p += [kernel, biases]
56 return activation
57
58 # ¶¨Ò庯Êý ´´½¨ maxpool²ã
59 # input_op : ÊäÈëÊý¾Ý
60 # name : ¸Ã¾í»ý²ãµÄÃû×Ö£¬ÓÃtf.name_scope()À´ÃüÃû
61 # kh,kw : ·Ö±ðÊǾí»ýºËµÄ¸ßºÍ¿í
62 # dh,dw : ²½³¤µÄ¸ßºÍ¿í
63 def mpool_op(input_op, name, kh, kw, dh,
dw):
64 return tf.nn.max_pool(input_op, ksize = [1,kh,kw,1],
65 strides = [1, dh, dw, 1], padding = 'SAME',
name = name)
66
67 #---------------´´½¨ VGG-16------------------
68
69 def inference_op(input_op, keep_prob):
70 p = []
71 # µÚÒ»¿é conv1_1-conv1_2-pool1
72 conv1_1 = conv_op(input_op, name='conv1_1',
kh=3, kw=3,
73 n_out = 64, dh = 1, dw = 1, p = p)
74 conv1_2 = conv_op(conv1_1, name='conv1_2',
kh=3, kw=3,
75 n_out = 64, dh = 1, dw = 1, p = p)
76 pool1 = mpool_op(conv1_2, name = 'pool1',
kh = 2, kw = 2,
77 dw = 2, dh = 2)
78 # µÚ¶þ¿é conv2_1-conv2_2-pool2
79 conv2_1 = conv_op(pool1, name='conv2_1',
kh=3, kw=3,
80 n_out = 128, dh = 1, dw = 1, p = p)
81 conv2_2 = conv_op(conv2_1, name='conv2_2',
kh=3, kw=3,
82 n_out = 128, dh = 1, dw = 1, p = p)
83 pool2 = mpool_op(conv2_2, name = 'pool2',
kh = 2, kw = 2,
84 dw = 2, dh = 2)
85 # µÚÈý¿é conv3_1-conv3_2-conv3_3-pool3
86 conv3_1 = conv_op(pool2, name='conv3_1',
kh=3, kw=3,
87 n_out = 256, dh = 1, dw = 1, p = p)
88 conv3_2 = conv_op(conv3_1, name='conv3_2',
kh=3, kw=3,
89 n_out = 256, dh = 1, dw = 1, p = p)
90 conv3_3 = conv_op(conv3_2, name='conv3_3',
kh=3, kw=3,
91 n_out = 256, dh = 1, dw = 1, p = p)
92 pool3 = mpool_op(conv3_3, name = 'pool3',
kh = 2, kw = 2,
93 dw = 2, dh = 2)
94 # µÚËÄ¿é conv4_1-conv4_2-conv4_3-pool4
95 conv4_1 = conv_op(pool3, name='conv4_1',
kh=3, kw=3,
96 n_out = 512, dh = 1, dw = 1, p = p)
97 conv4_2 = conv_op(conv4_1, name='conv4_2',
kh=3, kw=3,
98 n_out = 512, dh = 1, dw = 1, p = p)
99 conv4_3 = conv_op(conv4_2, name='conv4_3',
kh=3, kw=3,
100 n_out = 512, dh = 1, dw = 1, p = p)
101 pool4 = mpool_op(conv4_3, name = 'pool4',
kh = 2, kw = 2,
102 dw = 2, dh = 2)
103 # µÚÎå¿é conv5_1-conv5_2-conv5_3-pool5
104 conv5_1 = conv_op(pool4, name='conv5_1',
kh=3, kw=3,
105 n_out = 512, dh = 1, dw = 1, p = p)
106 conv5_2 = conv_op(conv5_1, name='conv5_2',
kh=3, kw=3,
107 n_out = 512, dh = 1, dw = 1, p = p)
108 conv5_3 = conv_op(conv5_2, name='conv5_3',
kh=3, kw=3,
109 n_out = 512, dh = 1, dw = 1, p = p)
110 pool5 = mpool_op(conv5_3, name = 'pool5',
kh = 2, kw = 2,
111 dw = 2, dh = 2)
112 # °Ñpool5 ( [7, 7, 512] ) À³ÉÏòÁ¿
113 shp = pool5.get_shape()
114 flattened_shape = shp[1].value * shp[2].value
* shp[3].value
115 resh1 = tf.reshape(pool5, [-1, flattened_shape],
name = 'resh1')
116
117 # È«Á¬½Ó²ã1 Ìí¼ÓÁË DroputÀ´·ÀÖ¹¹ýÄâºÏ
118 fc1 = fc_op(resh1, name = 'fc1', n_out =
2048, p = p)
119 fc1_drop = tf.nn.dropout(fc1, keep_prob,
name = 'fc1_drop')
120
121 # È«Á¬½Ó²ã2 Ìí¼ÓÁË DroputÀ´·ÀÖ¹¹ýÄâºÏ
122 fc2 = fc_op(fc1_drop, name = 'fc2', n_out
= 2048, p = p)
123 fc2_drop = tf.nn.dropout(fc2, keep_prob,
name = 'fc2_drop')
124
125 # È«Á¬½Ó²ã3 ¼ÓÒ»¸ösoftmaxÇó¸øÀà±ðµÄ¸ÅÂÊ
126 fc3 = fc_op(fc2_drop, name = 'fc3', n_out
= 1000, p = p)
127 softmax = tf.nn.softmax(fc3)
128 predictions = tf.argmax(softmax, 1)
129 return predictions, softmax, fc3, p
130
131 # ¶¨ÒåÆÀ²âº¯Êý
132
133 def time_tensorflow_run(session, target,
feed, info_string):
134 num_steps_burn_in = 10
135 total_duration = 0.0
136 total_duration_squared = 0.0
137
138 for i in range(num_batches + num_steps_burn_in):
139 start_time = time.time()
140 _ = session.run(target, feed_dict = feed)
141 duration = time.time() - start_time
142 if i >= num_steps_burn_in:
143 if not i % 10:
144 print('%s: step %d, duration = %.3f' %
145 (datetime.now(), i-num_steps_burn_in, duration))
146 total_duration += duration
147 total_duration_squared += duration * duration
148 mean_dur = total_duration / num_batches
149 var_dur = total_duration_squared / num_batches
- mean_dur * mean_dur
150 std_dur = math.sqrt(var_dur)
151 print('%s: %s across %d steps, %.3f +/-
%.3f sec / batch' %(datetime.now(), info_string,
num_batches, mean_dur, std_dur))
152
153
154 def train_vgg16():
155 with tf.Graph().as_default():
156 image_size = 224 # ÊäÈëͼÏñ³ß´ç
157 # Éú³ÉËæ»úÊý²âÊÔÊÇ·ñÄÜÅÜͨ
158 #images = tf.Variable(tf.random_normal([batch_size,
image_size, image_size, 3], dtype=tf.float32,
stddev=1e-1))
159 with tf.device('/cpu:0'):
160 images, labels = cifar10.distorted_inputs()
161 keep_prob = tf.placeholder(tf.float32)
162 prediction,softmax,fc8,p = inference_op(images,keep_prob)
163 init = tf.global_variables_initializer()
164 sess = tf.Session()
165 sess.run(init)
166 time_tensorflow_run(sess, prediction,{keep_prob:1.0},
"Forward")
167 # ÓÃÒÔÄ£ÄâѵÁ·µÄ¹ý³Ì
168 objective = tf.nn.l2_loss(fc8) # ¸øÒ»¸öloss
169 grad = tf.gradients(objective, p) # Ïà¶ÔÓÚlossµÄ
ËùÓÐÄ£ÐͲÎÊýµÄÌݶÈ
170 time_tensorflow_run(sess, grad, {keep_prob:0.5},"Forward-backward")
171
172
173
174
175 if __name__ == '__main__':
176 train_vgg16() |
µ±È»£¬ÎÒÃÇÒ²¿ÉÒÔÓÃtf.slimÀ´¼ò»¯Ò»ÏÂÍøÂç½á¹¹
1 def vgg16(inputs):
2 with slim.arg_scope([slim.conv2d, slim.fully_connected],
3 activation_fn=tf.nn.relu,
4 weights_initializer=tf.truncated_normal_
initializer(0.0,
0.01),
5 weights_regularizer=slim.l2_regularizer
(0.0005)):
6 net = slim.repeat(inputs, 2, slim.conv2d,
64, [3, 3], scope='conv1')
7 net = slim.max_pool2d(net, [2, 2], scope='
pool1')
8 net = slim.repeat(net, 2, slim.conv2d, 128,
[3, 3], scope='conv2')
9 net = slim.max_pool2d(net, [2, 2], scope='
pool2')
10 net = slim.repeat(net, 3, slim.conv2d, 256,
[3, 3], scope='conv3')
11 net = slim.max_pool2d(net, [2, 2], scope='
pool3')
12 net = slim.repeat(net, 3, slim.conv2d, 512,
[3, 3], scope='conv4')
13 net = slim.max_pool2d(net, [2, 2], scope=
'pool4')
14 net = slim.repeat(net, 3, slim.conv2d, 512,
[3, 3], scope='conv5')
15 net = slim.max_pool2d(net, [2, 2], scope='
pool5')
16 net = slim.fully_connected(net, 4096,
scope='fc6')
17 net = slim.dropout(net, 0.5, scope='
dropout6')
18 net = slim.fully_connected(net, 4096,
scope='fc7')
19 net = slim.dropout(net, 0.5, scope='
dropout7')
20 net = slim.fully_connected(net, 1000, activation_fn=None,
scope='fc8') |
¶Ô±ÈѵÁ·½á¹û£¬ÔÚͬµÈÉ豸ºÍ»·¾³Ï£¬µü´ú200tensorflowµÄѵÁ·½á¹ûÊÇ89.18%£¬ºÄʱ18h12min£¬¶Ô±ÈpaddlepaddleµÄЧ¹û£¬¾«¶È²î²»¶à£¬Ê±¼äÂýÒ»µã¡£Æäʵ¿ÉÒÔ¶ÔÊý¾Ý½øÐд¦ÀíºóÔÙ½øÐÐѵÁ·£¬×ª»»³Étfrecord¶àÏß³ÌÊäÈëÔÚѵÁ·£¬Ê±¼äÓ¦¸Ã»á¿ìºÜ¶à¡£
×ܽá
ͨ¹ýÂÛÎĵķÖÎöºÍʵÑéµÄ½á¹û£¬ÎÒ×ܽáÁ˼¸µã£º
1.LRN²ãÌ«ºÄ·Ñ¼ÆËã×ÊÔ´£¬×÷Óò»´ó£¬¿ÉÒÔÉáÈ¥¡£
2.´ó¾í»ýºË¿ÉÒÔѧϰ¸ü´óµÄ¿Õ¼äÌØÕ÷£¬µ«ÊÇÐèÒªµÄ²ÎÊý¿Õ¼äÒ²¸ü¶à£¬Ð¡¾í»ýºËËäȻѧϰµÄ¿Õ¼äÌØÕ÷ÓÐÏÞ£¬µ«ËùÐè²ÎÊý¿Õ¼ä¸üС£¬¶à²ãµþ¼ÓѵÁ·¿ÉÄÜЧ¹û¸üºÃ¡£
3.Ô½ÉîµÄÍøÂçЧ¹ûÔ½ºÃ£¬µ«ÊÇÒª±ÜÃâÌݶÈÏûʧµÄÎÊÌ⣬ѡȡreluµÄ¼¤»îº¯Êý¡¢batch_normalizationµÈ¶¼¿ÉÒÔ´ÓÒ»¶¨³Ì¶ÈÉϱÜÃâ¡£
4.С¾í»ýºË+Éî²ãÍøÂçµÄЧ¹û£¬ÔÚµü´úÏàͬ´ÎÊýʱ£¬±È´ó¾í»ýºË+dz²ãÍøÂçЧ¹û¸üºÃ£¬¶ÔÓÚÎÒÃÇ×Ô¼ºÉè¼ÆÍøÂçʱ¿ÉÒÔÓÐ½è¼ø×÷Óᣵ«ÊÇǰÕßµÄѵÁ·Ê±¼ä¿ÉÄܸü³¤£¬²»¹ý¿ÉÄܱȺóÕßÊÕÁ²Ëٶȸü¿ì£¬¾«È·¶È¸üºÃ¡£ |