vgg.py 5.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#   Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""VGG16 benchmark in Fluid"""
from __future__ import print_function

import sys
import time
import numpy as np
import paddle
import paddle.fluid as fluid
import paddle.fluid.core as core
import argparse
import functools
Y
yi.wu 已提交
25
import os
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56


def vgg16_bn_drop(input):
    def conv_block(input, num_filter, groups, dropouts):
        return fluid.nets.img_conv_group(
            input=input,
            pool_size=2,
            pool_stride=2,
            conv_num_filter=[num_filter] * groups,
            conv_filter_size=3,
            conv_act='relu',
            conv_with_batchnorm=True,
            conv_batchnorm_drop_rate=dropouts,
            pool_type='max')

    conv1 = conv_block(input, 64, 2, [0.3, 0])
    conv2 = conv_block(conv1, 128, 2, [0.4, 0])
    conv3 = conv_block(conv2, 256, 3, [0.4, 0.4, 0])
    conv4 = conv_block(conv3, 512, 3, [0.4, 0.4, 0])
    conv5 = conv_block(conv4, 512, 3, [0.4, 0.4, 0])

    drop = fluid.layers.dropout(x=conv5, dropout_prob=0.5)
    fc1 = fluid.layers.fc(input=drop, size=512, act=None)
    bn = fluid.layers.batch_norm(input=fc1, act='relu')
    drop2 = fluid.layers.dropout(x=bn, dropout_prob=0.5)
    fc2 = fluid.layers.fc(input=drop2, size=512, act=None)
    return fc2


def get_model(args):
    if args.data_set == "cifar10":
S
sneaxiy 已提交
57 58
        underlying_train_reader = paddle.dataset.cifar.train10()
        underlying_test_reader = paddle.dataset.cifar.test10()
59 60 61 62 63 64
        classdim = 10
        if args.data_format == 'NCHW':
            data_shape = [3, 32, 32]
        else:
            data_shape = [32, 32, 3]
    else:
S
sneaxiy 已提交
65 66
        underlying_train_reader = paddle.dataset.flowers.train()
        underlying_test_reader = paddle.dataset.flowers.test()
67 68 69 70 71 72
        classdim = 102
        if args.data_format == 'NCHW':
            data_shape = [3, 224, 224]
        else:
            data_shape = [224, 224, 3]

Y
yi.wu 已提交
73 74 75 76 77 78 79 80 81
    if args.use_reader_op:
        filelist = [
            os.path.join(args.data_path, f) for f in os.listdir(args.data_path)
        ]
        data_file = fluid.layers.open_files(
            filenames=filelist,
            shapes=[[-1] + data_shape, (-1, 1)],
            lod_levels=[0, 0],
            dtypes=["float32", "int64"],
Y
yi.wu 已提交
82 83
            thread_num=args.gpus,
            pass_num=args.pass_num)
Y
yi.wu 已提交
84 85 86 87
        data_file = fluid.layers.double_buffer(
            fluid.layers.batch(
                data_file, batch_size=args.batch_size))
        images, label = fluid.layers.read_file(data_file)
S
sneaxiy 已提交
88 89 90 91 92 93 94 95 96 97
    elif args.use_py_reader_op:
        data_file, feed_queue = fluid.layers.py_array_reader(
            capacity=args.feed_queue_capacity,
            shapes=[[-1] + data_shape, [-1, 1]],
            lod_levels=[0, 0],
            dtypes=["float32", "int64"])
        data_file = fluid.layers.double_buffer(
            fluid.layers.batch(
                data_file, batch_size=args.batch_size))
        images, label = fluid.layers.read_file(data_file)
Y
yi.wu 已提交
98
    else:
S
sneaxiy 已提交
99 100
        images = fluid.layers.data(
            name='data', shape=data_shape, dtype='float32')
Y
yi.wu 已提交
101
        label = fluid.layers.data(name='label', shape=[1], dtype='int64')
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    # Train program
    net = vgg16_bn_drop(images)
    predict = fluid.layers.fc(input=net, size=classdim, act='softmax')
    cost = fluid.layers.cross_entropy(input=predict, label=label)
    avg_cost = fluid.layers.mean(x=cost)

    # Evaluator
    batch_size_tensor = fluid.layers.create_tensor(dtype='int64')
    batch_acc = fluid.layers.accuracy(
        input=predict, label=label, total=batch_size_tensor)

    # inference program
    inference_program = fluid.default_main_program().clone()
    with fluid.program_guard(inference_program):
        inference_program = fluid.io.get_inference_program(
            target_vars=[batch_acc, batch_size_tensor])

    # Optimization
    optimizer = fluid.optimizer.Adam(learning_rate=args.learning_rate)

    # data reader
    train_reader = paddle.batch(
        paddle.reader.shuffle(
S
sneaxiy 已提交
126
            underlying_train_reader, buf_size=5120),
Y
yi.wu 已提交
127
        batch_size=args.batch_size * args.gpus)
128
    test_reader = paddle.batch(
S
sneaxiy 已提交
129
        underlying_test_reader, batch_size=args.batch_size)
130

S
sneaxiy 已提交
131 132 133 134 135 136
    if not args.use_reader_op and args.use_py_reader_op:
        return avg_cost, inference_program, optimizer, train_reader, test_reader, batch_acc, \
                      feed_queue, underlying_train_reader, underlying_test_reader, \
                      (data_shape, [1])
    else:
        return avg_cost, inference_program, optimizer, train_reader, test_reader, batch_acc