test_image_classification_train.py 4.5 KB
Newer Older
1
from __future__ import print_function
2
import numpy as np
Q
Qiao Longfei 已提交
3
import paddle.v2 as paddle
4
import paddle.v2.fluid as fluid
Q
Qiao Longfei 已提交
5 6


7
def resnet_cifar10(input, depth=32):
Q
Qiao Longfei 已提交
8
    def conv_bn_layer(input, ch_out, filter_size, stride, padding, act='relu'):
9
        tmp = fluid.layers.conv2d(
Q
Qiao Longfei 已提交
10 11 12 13 14 15
            input=input,
            filter_size=filter_size,
            num_filters=ch_out,
            stride=stride,
            padding=padding,
            act=None,
16
            bias_attr=False)
17
        return fluid.layers.batch_norm(input=tmp, act=act)
Q
Qiao Longfei 已提交
18

19
    def shortcut(input, ch_in, ch_out, stride):
Q
Qiao Longfei 已提交
20
        if ch_in != ch_out:
21
            return conv_bn_layer(input, ch_out, 1, stride, 0, None)
Q
Qiao Longfei 已提交
22 23 24
        else:
            return input

Q
Qiao Longfei 已提交
25 26 27
    def basicblock(input, ch_in, ch_out, stride):
        tmp = conv_bn_layer(input, ch_out, 3, stride, 1)
        tmp = conv_bn_layer(tmp, ch_out, 3, 1, 1, act=None)
28
        short = shortcut(input, ch_in, ch_out, stride)
29
        return fluid.layers.elementwise_add(x=tmp, y=short, act='relu')
Q
Qiao Longfei 已提交
30

31 32
    def layer_warp(block_func, input, ch_in, ch_out, count, stride):
        tmp = block_func(input, ch_in, ch_out, stride)
Q
Qiao Longfei 已提交
33
        for i in range(1, count):
34
            tmp = block_func(tmp, ch_out, ch_out, 1)
Q
Qiao Longfei 已提交
35 36 37 38 39
        return tmp

    assert (depth - 2) % 6 == 0
    n = (depth - 2) / 6
    conv1 = conv_bn_layer(
Q
Qiao Longfei 已提交
40 41 42 43
        input=input, ch_out=16, filter_size=3, stride=1, padding=1)
    res1 = layer_warp(basicblock, conv1, 16, 16, n, 1)
    res2 = layer_warp(basicblock, res1, 16, 32, n, 2)
    res3 = layer_warp(basicblock, res2, 32, 64, n, 2)
44
    pool = fluid.layers.pool2d(
Q
Qiao Longfei 已提交
45
        input=res3, pool_size=8, pool_type='avg', pool_stride=1)
Q
Qiao Longfei 已提交
46 47 48
    return pool


49
def vgg16_bn_drop(input):
Q
Qiao Longfei 已提交
50
    def conv_block(input, num_filter, groups, dropouts):
51
        return fluid.nets.img_conv_group(
Q
Qiao Longfei 已提交
52 53 54 55 56 57 58 59
            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,
60
            pool_type='max')
Q
Qiao Longfei 已提交
61

62 63 64 65 66
    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])
Q
Qiao Longfei 已提交
67

68 69 70 71 72 73
    drop = fluid.layers.dropout(x=conv5, dropout_prob=0.5)
    fc1 = fluid.layers.fc(input=drop, size=512, act=None)
    reshape1 = fluid.layers.reshape(x=fc1, shape=list(fc1.shape + (1, 1)))
    bn = fluid.layers.batch_norm(input=reshape1, act='relu')
    drop2 = fluid.layers.dropout(x=bn, dropout_prob=0.5)
    fc2 = fluid.layers.fc(input=drop2, size=512, act=None)
Q
Qiao Longfei 已提交
74 75 76 77 78 79
    return fc2


classdim = 10
data_shape = [3, 32, 32]

80 81
images = fluid.layers.data(name='pixel', shape=data_shape, dtype='float32')
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
Q
Qiao Longfei 已提交
82 83 84

# Add neural network config
# option 1. resnet
85
# net = resnet_cifar10(images, 32)
Q
Qiao Longfei 已提交
86
# option 2. vgg
87
net = vgg16_bn_drop(images)
Q
Qiao Longfei 已提交
88

89 90 91
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)
Q
Qiao Longfei 已提交
92

93
optimizer = fluid.optimizer.Adam(learning_rate=0.001)
94
opts = optimizer.minimize(avg_cost)
Q
Qiao Longfei 已提交
95

96
accuracy = fluid.evaluator.Accuracy(input=predict, label=label)
F
fengjiayi 已提交
97

Q
Qiao Longfei 已提交
98 99 100 101 102
BATCH_SIZE = 128
PASS_NUM = 1

train_reader = paddle.batch(
    paddle.reader.shuffle(
Y
Yu Yang 已提交
103
        paddle.dataset.cifar.train10(), buf_size=128 * 10),
Q
Qiao Longfei 已提交
104 105
    batch_size=BATCH_SIZE)

106 107
place = fluid.CPUPlace()
exe = fluid.Executor(place)
Q
Qiao Longfei 已提交
108

109
exe.run(fluid.default_startup_program())
Q
Qiao Longfei 已提交
110 111

for pass_id in range(PASS_NUM):
F
fengjiayi 已提交
112
    accuracy.reset(exe)
Q
Qiao Longfei 已提交
113 114 115 116 117 118 119 120 121
    for data in train_reader():
        img_data = np.array(map(lambda x: x[0].reshape(data_shape),
                                data)).astype("float32")
        y_data = np.array(map(lambda x: x[1], data)).astype("int64")
        batch_size = 1
        for i in y_data.shape:
            batch_size = batch_size * i
        y_data = y_data.reshape([batch_size, 1])

122 123 124 125
        loss, acc = exe.run(fluid.default_main_program(),
                            feed={"pixel": img_data,
                                  "label": y_data},
                            fetch_list=[avg_cost] + accuracy.metrics)
F
fengjiayi 已提交
126
        pass_acc = accuracy.eval(exe)
127 128 129 130
        print("loss:" + str(loss) + " acc:" + str(acc) + " pass_acc:" + str(
            pass_acc))
        # this model is slow, so if we can train two mini batch, we think it works properly.
        exit(0)
Q
Qiao Longfei 已提交
131
exit(1)