test_image_classification_train.py 7.9 KB
Newer Older
1
import numpy as np
Q
Qiao Longfei 已提交
2
import paddle.v2 as paddle
Q
Qiao Longfei 已提交
3 4 5 6 7 8 9
import paddle.v2.fluid.core as core
import paddle.v2.fluid.layers as layers
import paddle.v2.fluid.nets as nets
import paddle.v2.fluid.optimizer as optimizer
from paddle.v2.fluid.executor import Executor
from paddle.v2.fluid.framework import g_startup_program, g_main_program
from paddle.v2.fluid.initializer import XavierInitializer
Q
Qiao Longfei 已提交
10 11


12
def resnet_cifar10(input, depth=32, main_program=None, startup_program=None):
Q
Qiao Longfei 已提交
13 14 15 16 17 18
    def conv_bn_layer(input,
                      ch_out,
                      filter_size,
                      stride,
                      padding,
                      act='relu',
19 20
                      main_program=None,
                      startup_program=None):
Q
Qiao Longfei 已提交
21 22 23 24 25 26 27 28
        tmp = layers.conv2d(
            input=input,
            filter_size=filter_size,
            num_filters=ch_out,
            stride=stride,
            padding=padding,
            act=None,
            bias_attr=False,
29 30
            main_program=main_program,
            startup_program=startup_program)
Q
Qiao Longfei 已提交
31
        return layers.batch_norm(
32 33 34 35
            input=tmp,
            act=act,
            main_program=main_program,
            startup_program=startup_program)
Q
Qiao Longfei 已提交
36 37 38 39 40 41 42 43 44 45 46 47

    def shortcut(input, ch_in, ch_out, stride, program, init_program):
        if ch_in != ch_out:
            return conv_bn_layer(input, ch_out, 1, stride, 0, None, program,
                                 init_program)
        else:
            return input

    def basicblock(input,
                   ch_in,
                   ch_out,
                   stride,
48 49
                   main_program=main_program,
                   startup_program=startup_program):
Q
Qiao Longfei 已提交
50 51 52 53 54 55
        tmp = conv_bn_layer(
            input,
            ch_out,
            3,
            stride,
            1,
56 57
            main_program=main_program,
            startup_program=startup_program)
Q
Qiao Longfei 已提交
58 59 60 61 62 63 64
        tmp = conv_bn_layer(
            tmp,
            ch_out,
            3,
            1,
            1,
            act=None,
65 66 67 68
            main_program=main_program,
            startup_program=startup_program)
        short = shortcut(input, ch_in, ch_out, stride, main_program,
                         startup_program)
Q
Qiao Longfei 已提交
69 70 71 72
        return layers.elementwise_add(
            x=tmp,
            y=short,
            act='relu',
73 74
            main_program=main_program,
            startup_program=startup_program)
Q
Qiao Longfei 已提交
75 76

    def layer_warp(block_func, input, ch_in, ch_out, count, stride, program,
77 78
                   startup_program):
        tmp = block_func(input, ch_in, ch_out, stride, program, startup_program)
Q
Qiao Longfei 已提交
79
        for i in range(1, count):
80
            tmp = block_func(tmp, ch_out, ch_out, 1, program, startup_program)
Q
Qiao Longfei 已提交
81 82 83 84 85 86 87 88 89 90
        return tmp

    assert (depth - 2) % 6 == 0
    n = (depth - 2) / 6
    conv1 = conv_bn_layer(
        input=input,
        ch_out=16,
        filter_size=3,
        stride=1,
        padding=1,
91 92
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
93 94 95 96 97 98 99
    res1 = layer_warp(
        basicblock,
        conv1,
        16,
        16,
        n,
        1,
100 101
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
102 103 104 105 106 107 108
    res2 = layer_warp(
        basicblock,
        res1,
        16,
        32,
        n,
        2,
109 110
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
111 112 113 114 115 116 117
    res3 = layer_warp(
        basicblock,
        res2,
        32,
        64,
        n,
        2,
118 119
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
120 121 122 123 124
    pool = layers.pool2d(
        input=res3,
        pool_size=8,
        pool_type='avg',
        pool_stride=1,
125 126
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
127 128 129
    return pool


130
def vgg16_bn_drop(input, main_program=None, startup_program=None):
Q
Qiao Longfei 已提交
131 132 133 134
    def conv_block(input,
                   num_filter,
                   groups,
                   dropouts,
135 136
                   main_program=None,
                   startup_program=None):
Q
Qiao Longfei 已提交
137 138 139 140 141 142 143 144 145 146
        return 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',
147 148
            main_program=main_program,
            startup_program=startup_program)
Q
Qiao Longfei 已提交
149

150 151 152 153 154 155 156 157
    conv1 = conv_block(input, 64, 2, [0.3, 0], main_program, startup_program)
    conv2 = conv_block(conv1, 128, 2, [0.4, 0], main_program, startup_program)
    conv3 = conv_block(conv2, 256, 3, [0.4, 0.4, 0], main_program,
                       startup_program)
    conv4 = conv_block(conv3, 512, 3, [0.4, 0.4, 0], main_program,
                       startup_program)
    conv5 = conv_block(conv4, 512, 3, [0.4, 0.4, 0], main_program,
                       startup_program)
Q
Qiao Longfei 已提交
158 159

    drop = layers.dropout(
160 161 162 163
        x=conv5,
        dropout_prob=0.5,
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
164 165 166
    fc1 = layers.fc(input=drop,
                    size=512,
                    act=None,
167
                    param_attr={"initializer": XavierInitializer()},
168 169
                    main_program=main_program,
                    startup_program=startup_program)
Q
Qiao Longfei 已提交
170 171 172
    reshape1 = layers.reshape(
        x=fc1,
        shape=list(fc1.shape + (1, 1)),
173 174
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
175
    bn = layers.batch_norm(
176 177 178 179
        input=reshape1,
        act='relu',
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
180
    drop2 = layers.dropout(
181 182 183 184
        x=bn,
        dropout_prob=0.5,
        main_program=main_program,
        startup_program=startup_program)
Q
Qiao Longfei 已提交
185 186 187
    fc2 = layers.fc(input=drop2,
                    size=512,
                    act=None,
188
                    param_attr={"initializer": XavierInitializer()},
189 190
                    main_program=main_program,
                    startup_program=startup_program)
Q
Qiao Longfei 已提交
191 192 193 194 195 196
    return fc2


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

197 198
images = layers.data(name='pixel', shape=data_shape, data_type='float32')
label = layers.data(name='label', shape=[1], data_type='int64')
Q
Qiao Longfei 已提交
199 200 201

# Add neural network config
# option 1. resnet
202
# net = resnet_cifar10(images, 32)
Q
Qiao Longfei 已提交
203
# option 2. vgg
204
net = vgg16_bn_drop(images)
Q
Qiao Longfei 已提交
205 206 207

# print(program)

208 209 210 211
predict = layers.fc(input=net, size=classdim, act='softmax')
cost = layers.cross_entropy(input=predict, label=label)
avg_cost = layers.mean(x=cost)
accuracy = layers.accuracy(input=predict, label=label)
Q
Qiao Longfei 已提交
212

213 214 215
# optimizer = optimizer.SGDOptimizer(learning_rate=0.001)
optimizer = optimizer.AdamOptimizer(learning_rate=0.001)
opts = optimizer.minimize(avg_cost)
Q
Qiao Longfei 已提交
216 217 218 219 220 221 222 223 224 225 226 227

BATCH_SIZE = 128
PASS_NUM = 1

train_reader = paddle.batch(
    paddle.reader.shuffle(
        paddle.dataset.cifar.train10(), buf_size=128 * 10),
    batch_size=BATCH_SIZE)

place = core.CPUPlace()
exe = Executor(place)

228
exe.run(g_startup_program, feed={}, fetch_list=[])
Q
Qiao Longfei 已提交
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

for pass_id in range(PASS_NUM):
    batch_id = 0
    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])

        tensor_img = core.LoDTensor()
        tensor_y = core.LoDTensor()
        tensor_img.set(img_data, place)
        tensor_y.set(y_data, place)

246
        outs = exe.run(g_main_program,
Q
Qiao Longfei 已提交
247 248
                       feed={"pixel": tensor_img,
                             "label": tensor_y},
249
                       fetch_list=[avg_cost, accuracy])
Q
Qiao Longfei 已提交
250 251

        loss = np.array(outs[0])
252
        acc = np.array(outs[1])
Q
Qiao Longfei 已提交
253
        print("pass_id:" + str(pass_id) + " batch_id:" + str(batch_id) +
254
              " loss:" + str(loss) + " acc:" + str(acc))
Q
Qiao Longfei 已提交
255 256 257 258 259 260
        batch_id = batch_id + 1

        if batch_id > 1:
            # this model is slow, so if we can train two mini batch, we think it works properly.
            exit(0)
exit(1)