From fb495c0b28890234ea7a7a994aa588dcf303e2d0 Mon Sep 17 00:00:00 2001 From: wuzewu Date: Thu, 18 Apr 2019 11:42:25 +0800 Subject: [PATCH] update finetune api and demo --- demo/image-classification/create_module.py | 80 -- demo/image-classification/create_module.sh | 38 - demo/image-classification/finetune.sh | 9 - demo/image-classification/img_classifier.py | 122 ++ demo/image-classification/infer.sh | 1 - demo/image-classification/nets/__init__.py | 4 - .../image-classification/nets/mobilenet_v2.py | 170 --- demo/image-classification/nets/resnet.py | 162 --- demo/image-classification/processor.py | 128 --- .../resources/download.sh | 35 - .../resources/label_list.txt | 1000 ----------------- .../resources/module_info.yml | 6 - demo/image-classification/retrain.py | 31 - demo/image-classification/run_classifier.sh | 31 + demo/image-classification/run_predict.sh | 25 + .../test/test.csv => test/test.txt} | 0 .../{resources => }/test/test.yml | 0 .../{resources => }/test/test_img_bird.jpg | Bin .../{resources => }/test/test_img_cat.jpg | Bin .../test/test_img_daisy.jpg | Bin 0 -> 49171 bytes .../test/test_img_roses.jpg | Bin 0 -> 94323 bytes .../{resources => }/test/test_img_sheep.jpg | Bin demo/image-classification/utility.py | 63 -- demo/sequence-labeling/sequence_label.py | 76 +- demo/text-classification/predict.py | 12 +- demo/text-classification/text_classifier.py | 64 +- paddlehub/finetune/evaluate.py | 8 +- paddlehub/finetune/task.py | 251 +++-- paddlehub/reader/cv_reader.py | 63 +- paddlehub/version.py | 2 +- 30 files changed, 440 insertions(+), 1941 deletions(-) delete mode 100644 demo/image-classification/create_module.py delete mode 100644 demo/image-classification/create_module.sh delete mode 100644 demo/image-classification/finetune.sh create mode 100644 demo/image-classification/img_classifier.py delete mode 100644 demo/image-classification/infer.sh delete mode 100644 demo/image-classification/nets/__init__.py delete mode 100644 demo/image-classification/nets/mobilenet_v2.py delete mode 100644 demo/image-classification/nets/resnet.py delete mode 100644 demo/image-classification/processor.py delete mode 100644 demo/image-classification/resources/download.sh delete mode 100644 demo/image-classification/resources/label_list.txt delete mode 100644 demo/image-classification/resources/module_info.yml delete mode 100644 demo/image-classification/retrain.py create mode 100644 demo/image-classification/run_classifier.sh create mode 100644 demo/image-classification/run_predict.sh rename demo/image-classification/{resources/test/test.csv => test/test.txt} (100%) rename demo/image-classification/{resources => }/test/test.yml (100%) rename demo/image-classification/{resources => }/test/test_img_bird.jpg (100%) rename demo/image-classification/{resources => }/test/test_img_cat.jpg (100%) create mode 100644 demo/image-classification/test/test_img_daisy.jpg create mode 100644 demo/image-classification/test/test_img_roses.jpg rename demo/image-classification/{resources => }/test/test_img_sheep.jpg (100%) delete mode 100644 demo/image-classification/utility.py diff --git a/demo/image-classification/create_module.py b/demo/image-classification/create_module.py deleted file mode 100644 index 522786a4..00000000 --- a/demo/image-classification/create_module.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import os -import functools -import argparse - -import paddle -import paddle.fluid as fluid - -import nets -import paddlehub as hub -import processor -from utility import add_arguments, print_arguments -parser = argparse.ArgumentParser(description=__doc__) -add_arg = functools.partial(add_arguments, argparser=parser) -# yapf: disable -add_arg('model', str, "ResNet50", "Set the network to use.") -add_arg('pretrained_model', str, None, "Whether to use pretrained model.") -# yapf: enable - - -def build_program(args): - image_shape = [3, 224, 224] - model_name = args.model - model = nets.__dict__[model_name]() - image = fluid.layers.data(name="image", shape=image_shape, dtype="float32") - predition, feature_map = model.net(input=image, class_dim=1000) - - return image, predition, feature_map - - -def create_module(args): - # parameters from arguments - model_name = args.model - pretrained_model = args.pretrained_model - - image, predition, feature_map = build_program(args) - - place = fluid.CPUPlace() - exe = fluid.Executor(place) - exe.run(fluid.default_startup_program()) - - # load pretrained model param - def if_exist(var): - return os.path.exists(os.path.join(pretrained_model, var.name)) - - fluid.io.load_vars(exe, pretrained_model, predicate=if_exist) - - # create paddle hub module - assets = ["resources/label_list.txt"] - sign1 = hub.create_signature( - "classification", inputs=[image], outputs=[predition], for_predict=True) - sign2 = hub.create_signature( - "feature_map", inputs=[image], outputs=[feature_map]) - hub.create_module( - sign_arr=[sign1, sign2], - module_dir=args.model + ".hub_module", - module_info="resources/module_info.yml", - processor=processor.Processor, - assets=assets, - extra_info={ - 'excepted_image_width': 224, - 'excepted_image_height': 224, - 'pretrained_images_mean': [0.485, 0.456, 0.406], - 'pretrained_images_std': [0.229, 0.224, 0.225], - 'image_channel_order': 'RGB' - }) - - -def main(): - args = parser.parse_args() - assert args.model in nets.__all__, "model is not in list %s" % nets.__all__ - print_arguments(args) - create_module(args) - - -if __name__ == '__main__': - main() diff --git a/demo/image-classification/create_module.sh b/demo/image-classification/create_module.sh deleted file mode 100644 index cd288406..00000000 --- a/demo/image-classification/create_module.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -set -o nounset -set -o errexit - -model_name="ResNet50" - -while getopts "m:" options -do - case "$options" in - m) - model_name=$OPTARG;; - ?) - echo "unknown options" - exit 1;; - esac -done - -script_path=$(cd `dirname $0`; pwd) -module_path=${model_name}.hub_module - -if [ -d $script_path/$module_path ] -then - echo "$module_path already existed!" - exit 0 -fi - -cd $script_path/resources/ - -if [ ! -d ${model_name}_pretrained ] -then - sh download.sh $model_name -fi - -cd $script_path/ - -python create_module.py --pretrained_model=resources/${model_name}_pretrained --model ${model_name} - -echo "Successfully create $module_path" diff --git a/demo/image-classification/finetune.sh b/demo/image-classification/finetune.sh deleted file mode 100644 index 9c9783f3..00000000 --- a/demo/image-classification/finetune.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -o nounset -set -o errexit - -script_path=$(cd `dirname $0`; pwd) -cd $script_path - -sh create_module.sh -python retrain.py diff --git a/demo/image-classification/img_classifier.py b/demo/image-classification/img_classifier.py new file mode 100644 index 00000000..e087d5e2 --- /dev/null +++ b/demo/image-classification/img_classifier.py @@ -0,0 +1,122 @@ +import argparse +import os + +import paddle.fluid as fluid +import paddlehub as hub +import numpy as np + +# yapf: disable +parser = argparse.ArgumentParser(__doc__) +parser.add_argument("--target", type=str, default="finetune", help="Number of epoches for fine-tuning.") +parser.add_argument("--num_epoch", type=int, default=3, help="Number of epoches for fine-tuning.") +parser.add_argument("--use_gpu", type=bool, default=False, help="Whether use GPU for finetuning or predict") +parser.add_argument("--checkpoint_dir", type=str, default="paddlehub_finetune_ckpt", help="Path to training data.") +parser.add_argument("--batch_size", type=int, default=16, help="Total examples' number in batch for training.") +parser.add_argument("--module", type=str, default="resnet50", help="Total examples' number in batch for training.") +# yapf: enable. + +module_map = { + "resnet50": "resnet_v2_50_imagenet", + "resnet101": "resnet_v2_101_imagenet", + "resnet152": "resnet_v2_152_imagenet", + "mobilenet": "mobilenet_v2_imagenet", + "nasnet": "nasnet_imagenet", + "pnasnet": "pnasnet_imagenet" +} + + +def get_reader(module, dataset=None): + return hub.reader.ImageClassificationReader( + image_width=module.get_expected_image_width(), + image_height=module.get_expected_image_height(), + images_mean=module.get_pretrained_images_mean(), + images_std=module.get_pretrained_images_std(), + dataset=dataset) + + +def get_task(module, num_classes): + input_dict, output_dict, program = module.context(trainable=True) + with fluid.program_guard(program): + img = input_dict["image"] + feature_map = output_dict["feature_map"] + task = hub.create_img_cls_task( + feature=feature_map, num_classes=num_classes) + return task + + +def finetune(args): + module = hub.Module(name=args.module) + input_dict, output_dict, program = module.context(trainable=True) + dataset = hub.dataset.Flowers() + data_reader = get_reader(module, dataset) + task = get_task(module, dataset.num_labels) + img = input_dict["image"] + feed_list = [img.name, task.variable('label').name] + config = hub.RunConfig( + use_cuda=args.use_gpu, + num_epoch=args.num_epoch, + batch_size=args.batch_size, + enable_memory_optim=False, + checkpoint_dir=args.checkpoint_dir, + strategy=hub.finetune.strategy.DefaultFinetuneStrategy()) + + hub.finetune_and_eval( + task, feed_list=feed_list, data_reader=data_reader, config=config) + + +def predict(args): + module = hub.Module(name=args.module) + input_dict, output_dict, program = module.context(trainable=True) + data_reader = get_reader(module) + task = get_task(module, 5) + img = input_dict["image"] + feed_list = [img.name] + + label_map = { + 0: "roses", + 1: "tulips", + 2: "daisy", + 3: "sunflowers", + 4: "dandelion" + } + + with fluid.program_guard(task.inference_program()): + place = fluid.CUDAPlace(0) if args.use_gpu else fluid.CPUPlace() + exe = fluid.Executor(place) + pretrained_model_dir = os.path.join(args.checkpoint_dir, "best_model") + if not os.path.exists(pretrained_model_dir): + hub.logger.error( + "pretrained model dir %s didn't exist" % pretrained_model_dir) + exit(1) + fluid.io.load_persistables(exe, pretrained_model_dir) + feeder = fluid.DataFeeder(feed_list=feed_list, place=place) + data = ["test/test_img_roses.jpg", "test/test_img_daisy.jpg"] + + predict_reader = data_reader.data_generator( + phase="predict", batch_size=1, data=data) + for index, batch in enumerate(predict_reader()): + result, = exe.run( + feed=feeder.feed(batch), fetch_list=[task.variable('probs')]) + predict_result = label_map[np.argsort(result[0])[::-1][0]] + print("input %i is %s, and the predict result is %s" % + (index, data[index], predict_result)) + + +def main(args): + if args.target == "finetune": + finetune(args) + elif args.target == "predict": + predict(args) + else: + hub.logger.error("target should in %s" % ["finetune", "predict"]) + exit(1) + + +if __name__ == "__main__": + args = parser.parse_args() + if not args.module in module_map: + hub.logger.error("module should in %s" % module_map.keys()) + exit(1) + args.module = module_map[args.module] + + main(args) diff --git a/demo/image-classification/infer.sh b/demo/image-classification/infer.sh deleted file mode 100644 index 2f36d86a..00000000 --- a/demo/image-classification/infer.sh +++ /dev/null @@ -1 +0,0 @@ -python ../../paddlehub/commands/hub.py run ResNet50.hub_module/ --signature classification --config resources/test/test.yml --dataset resources/test/test.csv diff --git a/demo/image-classification/nets/__init__.py b/demo/image-classification/nets/__init__.py deleted file mode 100644 index 67b32daa..00000000 --- a/demo/image-classification/nets/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .mobilenet_v2 import MobileNetV2 -from .resnet import ResNet50, ResNet101, ResNet152 - -__all__ = ["MobileNetV2", "ResNet50", "ResNet101", "ResNet152"] diff --git a/demo/image-classification/nets/mobilenet_v2.py b/demo/image-classification/nets/mobilenet_v2.py deleted file mode 100644 index a881217e..00000000 --- a/demo/image-classification/nets/mobilenet_v2.py +++ /dev/null @@ -1,170 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -import paddle.fluid as fluid -from paddle.fluid.initializer import MSRA -from paddle.fluid.param_attr import ParamAttr - -__all__ = ["MobileNetV2"] - -train_parameters = { - "input_size": [3, 224, 224], - "input_mean": [0.485, 0.456, 0.406], - "input_std": [0.229, 0.224, 0.225], - "learning_strategy": { - "name": "piecewise_decay", - "batch_size": 256, - "epochs": [30, 60, 90], - "steps": [0.1, 0.01, 0.001, 0.0001] - } -} - - -class MobileNetV2(): - def __init__(self): - self.params = train_parameters - - def net(self, input, class_dim=1000, scale=1.0): - - bottleneck_params_list = [ - (1, 16, 1, 1), - (6, 24, 2, 2), - (6, 32, 3, 2), - (6, 64, 4, 2), - (6, 96, 3, 1), - (6, 160, 3, 2), - (6, 320, 1, 1), - ] - - input = self.conv_bn_layer( - input, - num_filters=int(32 * scale), - filter_size=3, - stride=2, - padding=1, - if_act=True) - - in_c = int(32 * scale) - for layer_setting in bottleneck_params_list: - t, c, n, s = layer_setting - input = self.invresi_blocks( - input=input, - in_c=in_c, - t=t, - c=int(c * scale), - n=n, - s=s, - ) - in_c = int(c * scale) - - input = self.conv_bn_layer( - input=input, - num_filters=int(1280 * scale) if scale > 1.0 else 1280, - filter_size=1, - stride=1, - padding=0, - if_act=True) - - input = fluid.layers.pool2d( - input=input, - pool_size=7, - pool_stride=1, - pool_type='avg', - global_pooling=True) - - output = fluid.layers.fc( - input=input, - size=class_dim, - param_attr=ParamAttr(initializer=MSRA())) - return output, input - - def conv_bn_layer(self, - input, - filter_size, - num_filters, - stride, - padding, - channels=None, - num_groups=1, - use_cudnn=True, - if_act=True): - conv = fluid.layers.conv2d( - input=input, - num_filters=num_filters, - filter_size=filter_size, - stride=stride, - padding=padding, - groups=num_groups, - act=None, - use_cudnn=use_cudnn, - param_attr=ParamAttr(initializer=MSRA()), - bias_attr=False) - bn = fluid.layers.batch_norm(input=conv) - if if_act: - return fluid.layers.relu6(bn) - else: - return bn - - def shortcut(self, input, data_residual): - return fluid.layers.elementwise_add(input, data_residual) - - def inverted_residual_unit(self, input, num_in_filter, num_filters, - ifshortcut, stride, filter_size, padding, - expansion_factor): - num_expfilter = int(round(num_in_filter * expansion_factor)) - channel_expand = self.conv_bn_layer( - input=input, - num_filters=num_expfilter, - filter_size=1, - stride=1, - padding=0, - num_groups=1, - if_act=True) - bottleneck_conv = self.conv_bn_layer( - input=channel_expand, - num_filters=num_expfilter, - filter_size=filter_size, - stride=stride, - padding=padding, - num_groups=num_expfilter, - if_act=True, - use_cudnn=False) - linear_out = self.conv_bn_layer( - input=bottleneck_conv, - num_filters=num_filters, - filter_size=1, - stride=1, - padding=0, - num_groups=1, - if_act=False) - if ifshortcut: - out = self.shortcut(input=input, data_residual=linear_out) - return out - else: - return linear_out - - def invresi_blocks(self, input, in_c, t, c, n, s): - first_block = self.inverted_residual_unit( - input=input, - num_in_filter=in_c, - num_filters=c, - ifshortcut=False, - stride=s, - filter_size=3, - padding=1, - expansion_factor=t) - - last_residual_block = first_block - last_c = c - - for i in range(1, n): - last_residual_block = self.inverted_residual_unit( - input=last_residual_block, - num_in_filter=last_c, - num_filters=c, - ifshortcut=True, - stride=1, - filter_size=3, - padding=1, - expansion_factor=t) - return last_residual_block diff --git a/demo/image-classification/nets/resnet.py b/demo/image-classification/nets/resnet.py deleted file mode 100644 index e0f4abc6..00000000 --- a/demo/image-classification/nets/resnet.py +++ /dev/null @@ -1,162 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -import paddle -import paddle.fluid as fluid -import math -from paddle.fluid.param_attr import ParamAttr - -__all__ = ["ResNet", "ResNet50", "ResNet101", "ResNet152"] - -train_parameters = { - "input_size": [3, 224, 224], - "input_mean": [0.485, 0.456, 0.406], - "input_std": [0.229, 0.224, 0.225], - "learning_strategy": { - "name": "piecewise_decay", - "batch_size": 256, - "epochs": [30, 60, 90], - "steps": [0.1, 0.01, 0.001, 0.0001] - } -} - - -class ResNet(): - def __init__(self, layers=50): - self.params = train_parameters - self.layers = layers - - def net(self, input, class_dim=1000): - layers = self.layers - supported_layers = [50, 101, 152] - assert layers in supported_layers, \ - "supported layers are {} but input layer is {}".format(supported_layers, layers) - - if layers == 50: - depth = [3, 4, 6, 3] - elif layers == 101: - depth = [3, 4, 23, 3] - elif layers == 152: - depth = [3, 8, 36, 3] - num_filters = [64, 128, 256, 512] - - conv = self.conv_bn_layer( - input=input, - num_filters=64, - filter_size=7, - stride=2, - act='relu', - name="conv1") - conv = fluid.layers.pool2d( - input=conv, - pool_size=3, - pool_stride=2, - pool_padding=1, - pool_type='max') - - for block in range(len(depth)): - for i in range(depth[block]): - if layers in [101, 152] and block == 2: - if i == 0: - conv_name = "res" + str(block + 2) + "a" - else: - conv_name = "res" + str(block + 2) + "b" + str(i) - else: - conv_name = "res" + str(block + 2) + chr(97 + i) - conv = self.bottleneck_block( - input=conv, - num_filters=num_filters[block], - stride=2 if i == 0 and block != 0 else 1, - name=conv_name) - - pool = fluid.layers.pool2d( - input=conv, pool_size=7, pool_type='avg', global_pooling=True) - stdv = 1.0 / math.sqrt(pool.shape[1] * 1.0) - out = fluid.layers.fc( - input=pool, - size=class_dim, - param_attr=fluid.param_attr.ParamAttr( - initializer=fluid.initializer.Uniform(-stdv, stdv))) - return out, pool - - def conv_bn_layer(self, - input, - num_filters, - filter_size, - stride=1, - groups=1, - act=None, - name=None): - conv = fluid.layers.conv2d( - input=input, - num_filters=num_filters, - filter_size=filter_size, - stride=stride, - padding=(filter_size - 1) // 2, - groups=groups, - act=None, - param_attr=ParamAttr(name=name + "_weights"), - bias_attr=False, - name=name + '.conv2d.output.1') - if name == "conv1": - bn_name = "bn_" + name - else: - bn_name = "bn" + name[3:] - return fluid.layers.batch_norm( - input=conv, - act=act, - name=bn_name + '.output.1', - param_attr=ParamAttr(name=bn_name + '_scale'), - bias_attr=ParamAttr(bn_name + '_offset'), - moving_mean_name=bn_name + '_mean', - moving_variance_name=bn_name + '_variance', - ) - - def shortcut(self, input, ch_out, stride, name): - ch_in = input.shape[1] - if ch_in != ch_out or stride != 1: - return self.conv_bn_layer(input, ch_out, 1, stride, name=name) - else: - return input - - def bottleneck_block(self, input, num_filters, stride, name): - conv0 = self.conv_bn_layer( - input=input, - num_filters=num_filters, - filter_size=1, - act='relu', - name=name + "_branch2a") - conv1 = self.conv_bn_layer( - input=conv0, - num_filters=num_filters, - filter_size=3, - stride=stride, - act='relu', - name=name + "_branch2b") - conv2 = self.conv_bn_layer( - input=conv1, - num_filters=num_filters * 4, - filter_size=1, - act=None, - name=name + "_branch2c") - - short = self.shortcut( - input, num_filters * 4, stride, name=name + "_branch1") - - return fluid.layers.elementwise_add( - x=short, y=conv2, act='relu', name=name + ".add.output.5") - - -def ResNet50(): - model = ResNet(layers=50) - return model - - -def ResNet101(): - model = ResNet(layers=101) - return model - - -def ResNet152(): - model = ResNet(layers=152) - return model diff --git a/demo/image-classification/processor.py b/demo/image-classification/processor.py deleted file mode 100644 index 66ff7e44..00000000 --- a/demo/image-classification/processor.py +++ /dev/null @@ -1,128 +0,0 @@ -import os - -import paddle -import numpy as np -from PIL import Image - -from paddlehub import BaseProcessor -import paddlehub as hub - -DATA_DIM = 224 -img_mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1)) -img_std = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1)) - - -def softmax(x): - orig_shape = x.shape - - if len(x.shape) > 1: - tmp = np.max(x, axis=1) - x -= tmp.reshape((x.shape[0], 1)) - x = np.exp(x) - tmp = np.sum(x, axis=1) - x /= tmp.reshape((x.shape[0], 1)) - else: - tmp = np.max(x) - x -= tmp - x = np.exp(x) - tmp = np.sum(x) - x /= tmp - return x - - -def resize_short(img, target_size): - percent = float(target_size) / min(img.size[0], img.size[1]) - resized_width = int(round(img.size[0] * percent)) - resized_height = int(round(img.size[1] * percent)) - img = img.resize((resized_width, resized_height), Image.LANCZOS) - return img - - -def crop_image(img, target_size, center): - width, height = img.size - size = target_size - if center == True: - w_start = (width - size) / 2 - h_start = (height - size) / 2 - else: - w_start = np.random.randint(0, width - size + 1) - h_start = np.random.randint(0, height - size + 1) - w_end = w_start + size - h_end = h_start + size - img = img.crop((w_start, h_start, w_end, h_end)) - return img - - -def process_image(img): - img = resize_short(img, target_size=256) - img = crop_image(img, target_size=DATA_DIM, center=True) - - if img.mode != 'RGB': - img = img.convert('RGB') - - img = np.array(img).astype('float32').transpose((2, 0, 1)) / 255 - img -= img_mean - img /= img_std - - return img - - -class Processor(BaseProcessor): - def __init__(self, module): - self.module = module - label_list_file = os.path.join(self.module.helper.assets_path(), - "label_list.txt") - with open(label_list_file, "r") as file: - content = file.read() - self.label_list = content.split("\n") - - def build_config(self, **kwargs): - self.top_only = kwargs.get("top_only", None) - try: - self.top_only = bool(self.top_only) - except: - self.top_only = False - - def preprocess(self, sign_name, data_dict): - result = {'image': []} - for path in data_dict['image']: - result_i = {} - result_i['processed'] = process_image(Image.open(path)) - result['image'].append(result_i) - return result - - def postprocess(self, sign_name, data_out, data_info, **kwargs): - self.build_config(**kwargs) - if sign_name == "classification": - results = np.array(data_out[0]) - output = [] - for index, result in enumerate(results): - result_i = softmax(result) - if self.top_only: - index = np.argsort(result_i)[::-1][:1][0] - label = self.label_list[index] - output.append({label: result_i[index]}) - else: - output.append({ - self.label_list[index]: value - for index, value in enumerate(result_i) - }) - return [output] - elif sign_name == "feature_map": - return np.array(results) - - def data_format(self, sign_name): - if sign_name == "classification": - return { - "image": { - 'type': hub.DataType.IMAGE, - 'feed_key': self.module.signatures[sign_name].inputs[0].name - } - } - elif sign_name == "feature_map": - return { - "image": { - 'type': hub.DataType.IMAGE, - 'feed_key': self.module.signatures[sign_name].inputs[0].name - } - } diff --git a/demo/image-classification/resources/download.sh b/demo/image-classification/resources/download.sh deleted file mode 100644 index 28fe7258..00000000 --- a/demo/image-classification/resources/download.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -set -o nounset -set -o errexit - -script_path=$(cd `dirname $0`; pwd) - -if [ $# -ne 1 ] -then - echo "usage: sh $0 {PRETRAINED_MODEL_NAME}" - exit 1 -fi - -if [ $1 != "ResNet50" -a $1 != "ResNet101" -a $1 != "ResNet152" -a $1 != "MobileNetV2" ] -then - echo "only suppory pretrained model in {ResNet50, ResNet101, ResNet152, MobileNetV2}" - exit 1 -fi - -model_name=${1}_pretrained -model=${model_name}.zip -cd ${script_path} - -if [ -d ${model_name} ] -then - echo "model file ${model_name} is already existed" - exit 0 -fi - -if [ ! -f ${model} ] -then - wget http://paddle-imagenet-models-name.bj.bcebos.com/${model} -fi -unzip ${model} -rm ${model} -rm -rf __MACOSX diff --git a/demo/image-classification/resources/label_list.txt b/demo/image-classification/resources/label_list.txt deleted file mode 100644 index 52baabc6..00000000 --- a/demo/image-classification/resources/label_list.txt +++ /dev/null @@ -1,1000 +0,0 @@ -tench -goldfish -great white shark -tiger shark -hammerhead -electric ray -stingray -cock -hen -ostrich -brambling -goldfinch -house finch -junco -indigo bunting -robin -bulbul -jay -magpie -chickadee -water ouzel -kite -bald eagle -vulture -great grey owl -European fire salamander -common newt -eft -spotted salamander -axolotl -bullfrog -tree frog -tailed frog -loggerhead -leatherback turtle -mud turtle -terrapin -box turtle -banded gecko -common iguana -American chameleon -whiptail -agama -frilled lizard -alligator lizard -Gila monster -green lizard -African chameleon -Komodo dragon -African crocodile -American alligator -triceratops -thunder snake -ringneck snake -hognose snake -green snake -king snake -garter snake -water snake -vine snake -night snake -boa constrictor -rock python -Indian cobra -green mamba -sea snake -horned viper -diamondback -sidewinder -trilobite -harvestman -scorpion -black and gold garden spider -barn spider -garden spider -black widow -tarantula -wolf spider -tick -centipede -black grouse -ptarmigan -ruffed grouse -prairie chicken -peacock -quail -partridge -African grey -macaw -sulphur-crested cockatoo -lorikeet -coucal -bee eater -hornbill -hummingbird -jacamar -toucan -drake -red-breasted merganser -goose -black swan -tusker -echidna -platypus -wallaby -koala -wombat -jellyfish -sea anemone -brain coral -flatworm -nematode -conch -snail -slug -sea slug -chiton -chambered nautilus -Dungeness crab -rock crab -fiddler crab -king crab -American lobster -spiny lobster -crayfish -hermit crab -isopod -white stork -black stork -spoonbill -flamingo -little blue heron -American egret -bittern -crane -limpkin -European gallinule -American coot -bustard -ruddy turnstone -red-backed sandpiper -redshank -dowitcher -oystercatcher -pelican -king penguin -albatross -grey whale -killer whale -dugong -sea lion -Chihuahua -Japanese spaniel -Maltese dog -Pekinese -Shih-Tzu -Blenheim spaniel -papillon -toy terrier -Rhodesian ridgeback -Afghan hound -basset -beagle -bloodhound -bluetick -black-and-tan coonhound -Walker hound -English foxhound -redbone -borzoi -Irish wolfhound -Italian greyhound -whippet -Ibizan hound -Norwegian elkhound -otterhound -Saluki -Scottish deerhound -Weimaraner -Staffordshire bullterrier -American Staffordshire terrier -Bedlington terrier -Border terrier -Kerry blue terrier -Irish terrier -Norfolk terrier -Norwich terrier -Yorkshire terrier -wire-haired fox terrier -Lakeland terrier -Sealyham terrier -Airedale -cairn -Australian terrier -Dandie Dinmont -Boston bull -miniature schnauzer -giant schnauzer -standard schnauzer -Scotch terrier -Tibetan terrier -silky terrier -soft-coated wheaten terrier -West Highland white terrier -Lhasa -flat-coated retriever -curly-coated retriever -golden retriever -Labrador retriever -Chesapeake Bay retriever -German short-haired pointer -vizsla -English setter -Irish setter -Gordon setter -Brittany spaniel -clumber -English springer -Welsh springer spaniel -cocker spaniel -Sussex spaniel -Irish water spaniel -kuvasz -schipperke -groenendael -malinois -briard -kelpie -komondor -Old English sheepdog -Shetland sheepdog -collie -Border collie -Bouvier des Flandres -Rottweiler -German shepherd -Doberman -miniature pinscher -Greater Swiss Mountain dog -Bernese mountain dog -Appenzeller -EntleBucher -boxer -bull mastiff -Tibetan mastiff -French bulldog -Great Dane -Saint Bernard -Eskimo dog -malamute -Siberian husky -dalmatian -affenpinscher -basenji -pug -Leonberg -Newfoundland -Great Pyrenees -Samoyed -Pomeranian -chow -keeshond -Brabancon griffon -Pembroke -Cardigan -toy poodle -miniature poodle -standard poodle -Mexican hairless -timber wolf -white wolf -red wolf -coyote -dingo -dhole -African hunting dog -hyena -red fox -kit fox -Arctic fox -grey fox -tabby -tiger cat -Persian cat -Siamese cat -Egyptian cat -cougar -lynx -leopard -snow leopard -jaguar -lion -tiger -cheetah -brown bear -American black bear -ice bear -sloth bear -mongoose -meerkat -tiger beetle -ladybug -ground beetle -long-horned beetle -leaf beetle -dung beetle -rhinoceros beetle -weevil -fly -bee -ant -grasshopper -cricket -walking stick -cockroach -mantis -cicada -leafhopper -lacewing -dragonfly -damselfly -admiral -ringlet -monarch -cabbage butterfly -sulphur butterfly -lycaenid -starfish -sea urchin -sea cucumber -wood rabbit -hare -Angora -hamster -porcupine -fox squirrel -marmot -beaver -guinea pig -sorrel -zebra -hog -wild boar -warthog -hippopotamus -ox -water buffalo -bison -ram -bighorn -ibex -hartebeest -impala -gazelle -Arabian camel -llama -weasel -mink -polecat -black-footed ferret -otter -skunk -badger -armadillo -three-toed sloth -orangutan -gorilla -chimpanzee -gibbon -siamang -guenon -patas -baboon -macaque -langur -colobus -proboscis monkey -marmoset -capuchin -howler monkey -titi -spider monkey -squirrel monkey -Madagascar cat -indri -Indian elephant -African elephant -lesser panda -giant panda -barracouta -eel -coho -rock beauty -anemone fish -sturgeon -gar -lionfish -puffer -abacus -abaya -academic gown -accordion -acoustic guitar -aircraft carrier -airliner -airship -altar -ambulance -amphibian -analog clock -apiary -apron -ashcan -assault rifle -backpack -bakery -balance beam -balloon -ballpoint -Band Aid -banjo -bannister -barbell -barber chair -barbershop -barn -barometer -barrel -barrow -baseball -basketball -bassinet -bassoon -bathing cap -bath towel -bathtub -beach wagon -beacon -beaker -bearskin -beer bottle -beer glass -bell cote -bib -bicycle-built-for-two -bikini -binder -binoculars -birdhouse -boathouse -bobsled -bolo tie -bonnet -bookcase -bookshop -bottlecap -bow -bow tie -brass -brassiere -breakwater -breastplate -broom -bucket -buckle -bulletproof vest -bullet train -butcher shop -cab -caldron -candle -cannon -canoe -can opener -cardigan -car mirror -carousel -carpenters kit -carton -car wheel -cash machine -cassette -cassette player -castle -catamaran -CD player -cello -cellular telephone -chain -chainlink fence -chain mail -chain saw -chest -chiffonier -chime -china cabinet -Christmas stocking -church -cinema -cleaver -cliff dwelling -cloak -clog -cocktail shaker -coffee mug -coffeepot -coil -combination lock -computer keyboard -confectionery -container ship -convertible -corkscrew -cornet -cowboy boot -cowboy hat -cradle -crane -crash helmet -crate -crib -Crock Pot -croquet ball -crutch -cuirass -dam -desk -desktop computer -dial telephone -diaper -digital clock -digital watch -dining table -dishrag -dishwasher -disk brake -dock -dogsled -dome -doormat -drilling platform -drum -drumstick -dumbbell -Dutch oven -electric fan -electric guitar -electric locomotive -entertainment center -envelope -espresso maker -face powder -feather boa -file -fireboat -fire engine -fire screen -flagpole -flute -folding chair -football helmet -forklift -fountain -fountain pen -four-poster -freight car -French horn -frying pan -fur coat -garbage truck -gasmask -gas pump -goblet -go-kart -golf ball -golfcart -gondola -gong -gown -grand piano -greenhouse -grille -grocery store -guillotine -hair slide -hair spray -half track -hammer -hamper -hand blower -hand-held computer -handkerchief -hard disc -harmonica -harp -harvester -hatchet -holster -home theater -honeycomb -hook -hoopskirt -horizontal bar -horse cart -hourglass -iPod -iron -jack-o-lantern -jean -jeep -jersey -jigsaw puzzle -jinrikisha -joystick -kimono -knee pad -knot -lab coat -ladle -lampshade -laptop -lawn mower -lens cap -letter opener -library -lifeboat -lighter -limousine -liner -lipstick -Loafer -lotion -loudspeaker -loupe -lumbermill -magnetic compass -mailbag -mailbox -maillot -maillot -manhole cover -maraca -marimba -mask -matchstick -maypole -maze -measuring cup -medicine chest -megalith -microphone -microwave -military uniform -milk can -minibus -miniskirt -minivan -missile -mitten -mixing bowl -mobile home -Model T -modem -monastery -monitor -moped -mortar -mortarboard -mosque -mosquito net -motor scooter -mountain bike -mountain tent -mouse -mousetrap -moving van -muzzle -nail -neck brace -necklace -nipple -notebook -obelisk -oboe -ocarina -odometer -oil filter -organ -oscilloscope -overskirt -oxcart -oxygen mask -packet -paddle -paddlewheel -padlock -paintbrush -pajama -palace -panpipe -paper towel -parachute -parallel bars -park bench -parking meter -passenger car -patio -pay-phone -pedestal -pencil box -pencil sharpener -perfume -Petri dish -photocopier -pick -pickelhaube -picket fence -pickup -pier -piggy bank -pill bottle -pillow -ping-pong ball -pinwheel -pirate -pitcher -plane -planetarium -plastic bag -plate rack -plow -plunger -Polaroid camera -pole -police van -poncho -pool table -pop bottle -pot -potters wheel -power drill -prayer rug -printer -prison -projectile -projector -puck -punching bag -purse -quill -quilt -racer -racket -radiator -radio -radio telescope -rain barrel -recreational vehicle -reel -reflex camera -refrigerator -remote control -restaurant -revolver -rifle -rocking chair -rotisserie -rubber eraser -rugby ball -rule -running shoe -safe -safety pin -saltshaker -sandal -sarong -sax -scabbard -scale -school bus -schooner -scoreboard -screen -screw -screwdriver -seat belt -sewing machine -shield -shoe shop -shoji -shopping basket -shopping cart -shovel -shower cap -shower curtain -ski -ski mask -sleeping bag -slide rule -sliding door -slot -snorkel -snowmobile -snowplow -soap dispenser -soccer ball -sock -solar dish -sombrero -soup bowl -space bar -space heater -space shuttle -spatula -speedboat -spider web -spindle -sports car -spotlight -stage -steam locomotive -steel arch bridge -steel drum -stethoscope -stole -stone wall -stopwatch -stove -strainer -streetcar -stretcher -studio couch -stupa -submarine -suit -sundial -sunglass -sunglasses -sunscreen -suspension bridge -swab -sweatshirt -swimming trunks -swing -switch -syringe -table lamp -tank -tape player -teapot -teddy -television -tennis ball -thatch -theater curtain -thimble -thresher -throne -tile roof -toaster -tobacco shop -toilet seat -torch -totem pole -tow truck -toyshop -tractor -trailer truck -tray -trench coat -tricycle -trimaran -tripod -triumphal arch -trolleybus -trombone -tub -turnstile -typewriter keyboard -umbrella -unicycle -upright -vacuum -vase -vault -velvet -vending machine -vestment -viaduct -violin -volleyball -waffle iron -wall clock -wallet -wardrobe -warplane -washbasin -washer -water bottle -water jug -water tower -whiskey jug -whistle -wig -window screen -window shade -Windsor tie -wine bottle -wing -wok -wooden spoon -wool -worm fence -wreck -yawl -yurt -web site -comic book -crossword puzzle -street sign -traffic light -book jacket -menu -plate -guacamole -consomme -hot pot -trifle -ice cream -ice lolly -French loaf -bagel -pretzel -cheeseburger -hotdog -mashed potato -head cabbage -broccoli -cauliflower -zucchini -spaghetti squash -acorn squash -butternut squash -cucumber -artichoke -bell pepper -cardoon -mushroom -Granny Smith -strawberry -orange -lemon -fig -pineapple -banana -jackfruit -custard apple -pomegranate -hay -carbonara -chocolate sauce -dough -meat loaf -pizza -potpie -burrito -red wine -espresso -cup -eggnog -alp -bubble -cliff -coral reef -geyser -lakeside -promontory -sandbar -seashore -valley -volcano -ballplayer -groom -scuba diver -rapeseed -daisy -yellow ladys slipper -corn -acorn -hip -buckeye -coral fungus -agaric -gyromitra -stinkhorn -earthstar -hen-of-the-woods -bolete -ear -toilet tissue diff --git a/demo/image-classification/resources/module_info.yml b/demo/image-classification/resources/module_info.yml deleted file mode 100644 index 7eae4b4f..00000000 --- a/demo/image-classification/resources/module_info.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: resnet_v2_50_imagenet -type: CV/classification -author: paddlepaddle -author_email: paddle-dev@baidu.com -summary: "Resnet50 is a model used to image classfication, we trained this model on ImageNet-2012 dataset." -version: 1.0.0 diff --git a/demo/image-classification/retrain.py b/demo/image-classification/retrain.py deleted file mode 100644 index a5315b2e..00000000 --- a/demo/image-classification/retrain.py +++ /dev/null @@ -1,31 +0,0 @@ -import paddle.fluid as fluid -import paddlehub as hub - -if __name__ == "__main__": - resnet_module = hub.Module(module_dir="ResNet50.hub_module") - input_dict, output_dict, program = resnet_module.context(trainable=True) - dataset = hub.dataset.Flowers() - data_reader = hub.reader.ImageClassificationReader( - image_width=resnet_module.get_excepted_image_width(), - image_height=resnet_module.get_excepted_image_height(), - images_mean=resnet_module.get_pretrained_images_mean(), - images_std=resnet_module.get_pretrained_images_std(), - dataset=dataset) - with fluid.program_guard(program): - label = fluid.layers.data(name="label", dtype="int64", shape=[1]) - img = input_dict[0] - feature_map = output_dict[0] - - config = hub.RunConfig( - use_cuda=True, - num_epoch=10, - batch_size=32, - enable_memory_optim=False, - strategy=hub.finetune.strategy.DefaultFinetuneStrategy()) - - feed_list = [img.name, label.name] - - task = hub.create_img_cls_task( - feature=feature_map, label=label, num_classes=dataset.num_labels) - hub.finetune_and_eval( - task, feed_list=feed_list, data_reader=data_reader, config=config) diff --git a/demo/image-classification/run_classifier.sh b/demo/image-classification/run_classifier.sh new file mode 100644 index 00000000..f02ff2b5 --- /dev/null +++ b/demo/image-classification/run_classifier.sh @@ -0,0 +1,31 @@ +cuda_visible_devices=0 +module=resnet50 +num_epoch=1 +batch_size=16 +use_gpu=False +checkpoint_dir=paddlehub_finetune_ckpt + +while getopts "gm:n:b:c:d:" options +do + case "$options" in + m) + module=$OPTARG;; + n) + num_epoch=$OPTARG;; + b) + batch_size=$OPTARG;; + c) + checkpoint_dir=$OPTARG;; + d) + cuda_visible_devices=$OPTARG;; + g) + use_gpu=True;; + ?) + echo "unknown options" + exit 1;; + esac +done + +export CUDA_VISIBLE_DEVICES=${cuda_visible_devices} + +python -u img_classifier.py --target finetune --use_gpu ${use_gpu} --batch_size ${batch_size} --checkpoint_dir ${checkpoint_dir} --num_epoch ${num_epoch} --module ${module} diff --git a/demo/image-classification/run_predict.sh b/demo/image-classification/run_predict.sh new file mode 100644 index 00000000..fe08ce73 --- /dev/null +++ b/demo/image-classification/run_predict.sh @@ -0,0 +1,25 @@ +cuda_visible_devices=0 +module=resnet50 +use_gpu=False +checkpoint_dir=paddlehub_finetune_ckpt + +while getopts "gm:c:d:" options +do + case "$options" in + m) + module=$OPTARG;; + c) + checkpoint_dir=$OPTARG;; + d) + cuda_visible_devices=$OPTARG;; + g) + use_gpu=True;; + ?) + echo "unknown options" + exit 1;; + esac +done + +export CUDA_VISIBLE_DEVICES=${cuda_visible_devices} + +python -u img_classifier.py --target predict --use_gpu ${use_gpu} --checkpoint_dir ${checkpoint_dir} --module ${module} diff --git a/demo/image-classification/resources/test/test.csv b/demo/image-classification/test/test.txt similarity index 100% rename from demo/image-classification/resources/test/test.csv rename to demo/image-classification/test/test.txt diff --git a/demo/image-classification/resources/test/test.yml b/demo/image-classification/test/test.yml similarity index 100% rename from demo/image-classification/resources/test/test.yml rename to demo/image-classification/test/test.yml diff --git a/demo/image-classification/resources/test/test_img_bird.jpg b/demo/image-classification/test/test_img_bird.jpg similarity index 100% rename from demo/image-classification/resources/test/test_img_bird.jpg rename to demo/image-classification/test/test_img_bird.jpg diff --git a/demo/image-classification/resources/test/test_img_cat.jpg b/demo/image-classification/test/test_img_cat.jpg similarity index 100% rename from demo/image-classification/resources/test/test_img_cat.jpg rename to demo/image-classification/test/test_img_cat.jpg diff --git a/demo/image-classification/test/test_img_daisy.jpg b/demo/image-classification/test/test_img_daisy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..688cc3e6bda17c384116bc3cec0eba6474984a1d GIT binary patch literal 49171 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 Ttp5NzFY_FFrmKOmhBN=!owd{o literal 0 HcmV?d00001 diff --git a/demo/image-classification/test/test_img_roses.jpg b/demo/image-classification/test/test_img_roses.jpg new file mode 100644 index 0000000000000000000000000000000000000000..711c883e09aa528bafd26021798aa11506e2113d GIT binary patch literal 94323 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 z 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 rU*#@lnW>s5o3XU)ulHuGrkK_y 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�e^(YomG*|kFy*lji*ZIo{_Z8a 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 literal 0 HcmV?d00001 diff --git a/demo/image-classification/resources/test/test_img_sheep.jpg b/demo/image-classification/test/test_img_sheep.jpg similarity index 100% rename from demo/image-classification/resources/test/test_img_sheep.jpg rename to demo/image-classification/test/test_img_sheep.jpg diff --git a/demo/image-classification/utility.py b/demo/image-classification/utility.py deleted file mode 100644 index 5b10a179..00000000 --- a/demo/image-classification/utility.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Contains common utility functions.""" -# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserve. -# -#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. - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -import distutils.util -import numpy as np -import six -from paddle.fluid import core - - -def print_arguments(args): - """Print argparse's arguments. - - Usage: - - .. code-block:: python - - parser = argparse.ArgumentParser() - parser.add_argument("name", default="Jonh", type=str, help="User name.") - args = parser.parse_args() - print_arguments(args) - - :param args: Input argparse.Namespace for printing. - :type args: argparse.Namespace - """ - print("----------- Configuration Arguments -----------") - for arg, value in sorted(six.iteritems(vars(args))): - print("%s: %s" % (arg, value)) - print("------------------------------------------------") - - -def add_arguments(argname, type, default, help, argparser, **kwargs): - """Add argparse's argument. - - Usage: - - .. code-block:: python - - parser = argparse.ArgumentParser() - add_argument("name", str, "Jonh", "User name.", parser) - args = parser.parse_args() - """ - type = distutils.util.strtobool if type == bool else type - argparser.add_argument( - "--" + argname, - default=default, - type=type, - help=help + ' Default: %(default)s.', - **kwargs) diff --git a/demo/sequence-labeling/sequence_label.py b/demo/sequence-labeling/sequence_label.py index f2871d13..1b59b054 100644 --- a/demo/sequence-labeling/sequence_label.py +++ b/demo/sequence-labeling/sequence_label.py @@ -46,48 +46,44 @@ if __name__ == '__main__': max_seq_len=args.max_seq_len) # Step3: construct transfer learning network - with fluid.program_guard(program): - label = fluid.layers.data( - name="label", shape=[args.max_seq_len, 1], dtype='int64') - seq_len = fluid.layers.data(name="seq_len", shape=[1], dtype='int64') + # Use "sequence_output" for token-level output. + sequence_output = outputs["sequence_output"] - # Use "sequence_output" for token-level output. - sequence_output = outputs["sequence_output"] + # Define a sequence labeling finetune task by PaddleHub's API + seq_label_task = hub.create_seq_label_task( + feature=sequence_output, + max_seq_len=args.max_seq_len, + num_classes=dataset.num_labels) - # Setup feed list for data feeder - # Must feed all the tensor of ERNIE's module need - # Compared to classification task, we need add seq_len tensor to feedlist - feed_list = [ - inputs["input_ids"].name, inputs["position_ids"].name, - inputs["segment_ids"].name, inputs["input_mask"].name, label.name, - seq_len - ] - # Define a sequence labeling finetune task by PaddleHub's API - seq_label_task = hub.create_seq_label_task( - feature=sequence_output, - labels=label, - seq_len=seq_len, - num_classes=dataset.num_labels) + # Setup feed list for data feeder + # Must feed all the tensor of ERNIE's module need + # Compared to classification task, we need add seq_len tensor to feedlist + feed_list = [ + inputs["input_ids"].name, inputs["position_ids"].name, + inputs["segment_ids"].name, inputs["input_mask"].name, + seq_label_task.variable('label').name, + seq_label_task.variable('seq_len').name + ] - # Select a finetune strategy - strategy = hub.AdamWeightDecayStrategy( - weight_decay=args.weight_decay, - learning_rate=args.learning_rate, - lr_scheduler="linear_warmup_decay", - ) + # Select a finetune strategy + strategy = hub.AdamWeightDecayStrategy( + weight_decay=args.weight_decay, + learning_rate=args.learning_rate, + lr_scheduler="linear_warmup_decay", + ) - # Setup runing config for PaddleHub Finetune API - config = hub.RunConfig( - use_cuda=args.use_gpu, - num_epoch=args.num_epoch, - batch_size=args.batch_size, - checkpoint_dir=args.checkpoint_dir, - strategy=strategy) + # Setup runing config for PaddleHub Finetune API + config = hub.RunConfig( + use_cuda=args.use_gpu, + num_epoch=args.num_epoch, + batch_size=args.batch_size, + checkpoint_dir=args.checkpoint_dir, + strategy=strategy) - # Finetune and evaluate model by PaddleHub's API - # will finish training, evaluation, testing, save model automatically - hub.finetune_and_eval( - task=seq_label_task, - data_reader=reader, - feed_list=feed_list, - config=config) + # Finetune and evaluate model by PaddleHub's API + # will finish training, evaluation, testing, save model automatically + hub.finetune_and_eval( + task=seq_label_task, + data_reader=reader, + feed_list=feed_list, + config=config) diff --git a/demo/text-classification/predict.py b/demo/text-classification/predict.py index 8f69f46e..5159f9c5 100644 --- a/demo/text-classification/predict.py +++ b/demo/text-classification/predict.py @@ -51,24 +51,22 @@ if __name__ == '__main__': place = fluid.CUDAPlace(0) if args.use_gpu else fluid.CPUPlace() exe = fluid.Executor(place) with fluid.program_guard(program): - label = fluid.layers.data(name="label", shape=[1], dtype='int64') - # Use "pooled_output" for classification tasks on an entire sentence. # Use "sequence_outputs" for token-level output. pooled_output = output_dict["pooled_output"] + # Define a classfication finetune task by PaddleHub's API + cls_task = hub.create_text_cls_task( + feature=pooled_output, num_classes=dataset.num_labels) + # Setup feed list for data feeder # Must feed all the tensor of ERNIE's module need feed_list = [ input_dict["input_ids"].name, input_dict["position_ids"].name, input_dict["segment_ids"].name, input_dict["input_mask"].name, - label.name + cls_task.variable('label').name ] - # Define a classfication finetune task by PaddleHub's API - cls_task = hub.create_text_cls_task( - feature=pooled_output, label=label, num_classes=dataset.num_labels) - # classificatin probability tensor probs = cls_task.variable("probs") diff --git a/demo/text-classification/text_classifier.py b/demo/text-classification/text_classifier.py index f6a09b86..ba52f09d 100644 --- a/demo/text-classification/text_classifier.py +++ b/demo/text-classification/text_classifier.py @@ -58,42 +58,38 @@ if __name__ == '__main__': max_seq_len=args.max_seq_len) # Step3: construct transfer learning network - with fluid.program_guard(program): - label = fluid.layers.data(name="label", shape=[1], dtype='int64') + # Use "pooled_output" for classification tasks on an entire sentence. + # Use "sequence_output" for token-level output. + pooled_output = outputs["pooled_output"] - # Use "pooled_output" for classification tasks on an entire sentence. - # Use "sequence_output" for token-level output. - pooled_output = outputs["pooled_output"] + # Define a classfication finetune task by PaddleHub's API + cls_task = hub.create_text_cls_task( + feature=pooled_output, num_classes=dataset.num_labels) - # Setup feed list for data feeder - # Must feed all the tensor of ERNIE's module need - feed_list = [ - inputs["input_ids"].name, inputs["position_ids"].name, - inputs["segment_ids"].name, inputs["input_mask"].name, label.name - ] - # Define a classfication finetune task by PaddleHub's API - cls_task = hub.create_text_cls_task( - feature=pooled_output, label=label, num_classes=dataset.num_labels) + # Setup feed list for data feeder + # Must feed all the tensor of ERNIE's module need + feed_list = [ + inputs["input_ids"].name, inputs["position_ids"].name, + inputs["segment_ids"].name, inputs["input_mask"].name, + cls_task.variable('label').name + ] - # Step4: Select finetune strategy, setup config and finetune - strategy = hub.AdamWeightDecayStrategy( - weight_decay=args.weight_decay, - learning_rate=args.learning_rate, - lr_scheduler="linear_warmup_decay", - ) + # Step4: Select finetune strategy, setup config and finetune + strategy = hub.AdamWeightDecayStrategy( + weight_decay=args.weight_decay, + learning_rate=args.learning_rate, + lr_scheduler="linear_warmup_decay", + ) - # Setup runing config for PaddleHub Finetune API - config = hub.RunConfig( - use_cuda=args.use_gpu, - num_epoch=args.num_epoch, - batch_size=args.batch_size, - checkpoint_dir=args.checkpoint_dir, - strategy=strategy) + # Setup runing config for PaddleHub Finetune API + config = hub.RunConfig( + use_cuda=args.use_gpu, + num_epoch=args.num_epoch, + batch_size=args.batch_size, + checkpoint_dir=args.checkpoint_dir, + strategy=strategy) - # Finetune and evaluate by PaddleHub's API - # will finish training, evaluation, testing, save model automatically - hub.finetune_and_eval( - task=cls_task, - data_reader=reader, - feed_list=feed_list, - config=config) + # Finetune and evaluate by PaddleHub's API + # will finish training, evaluation, testing, save model automatically + hub.finetune_and_eval( + task=cls_task, data_reader=reader, feed_list=feed_list, config=config) diff --git a/paddlehub/finetune/evaluate.py b/paddlehub/finetune/evaluate.py index 62ab97ac..4563e394 100644 --- a/paddlehub/finetune/evaluate.py +++ b/paddlehub/finetune/evaluate.py @@ -27,14 +27,14 @@ import paddlehub as hub def evaluate_cls_task(task, data_reader, feed_list, phase="test", config=None): logger.info("Evaluation on {} dataset start".format(phase)) - inference_program = task.inference_program() + test_program = task.test_program() main_program = task.main_program() loss = task.variable("loss") accuracy = task.variable("accuracy") batch_size = config.batch_size place, dev_count = hub.common.get_running_device_info(config) exe = fluid.Executor(place=place) - with fluid.program_guard(inference_program): + with fluid.program_guard(test_program): data_feeder = fluid.DataFeeder(feed_list=feed_list, place=place) num_eval_examples = acc_sum = loss_sum = 0 test_reader = data_reader.data_generator( @@ -77,13 +77,13 @@ def evaluate_seq_label_task(task, task.variable("loss").name ] logger.info("Evaluation on {} dataset start".format(phase)) - inference_program = task.inference_program() + test_program = task.test_program() batch_size = config.batch_size place, dev_count = hub.common.get_running_device_info(config) exe = fluid.Executor(place=place) # calculate the num of label from probs variable shape num_labels = task.variable("probs").shape[1] - with fluid.program_guard(inference_program): + with fluid.program_guard(test_program): data_feeder = fluid.DataFeeder(feed_list=feed_list, place=place) num_eval_examples = acc_sum = loss_sum = 0 test_reader = data_reader.data_generator( diff --git a/paddlehub/finetune/task.py b/paddlehub/finetune/task.py index b3770cb5..bc2b8ac8 100644 --- a/paddlehub/finetune/task.py +++ b/paddlehub/finetune/task.py @@ -31,13 +31,18 @@ class Task(object): including Paddle's main_program, startup_program and inference program """ - def __init__(self, task_type, graph_var_dict, main_program, - startup_program): + def __init__(self, + task_type, + graph_var_dict, + main_program, + startup_program, + inference_program=None): self.task_type = task_type self.graph_var_dict = graph_var_dict self._main_program = main_program self._startup_program = startup_program - self._inference_program = main_program.clone(for_test=True) + self._inference_program = inference_program + self._test_program = main_program.clone(for_test=True) def variable(self, var_name): if var_name in self.graph_var_dict: @@ -54,6 +59,9 @@ class Task(object): def inference_program(self): return self._inference_program + def test_program(self): + return self._test_program + def metric_variable_names(self): metric_variable_names = [] for var_name in self.graph_var_dict: @@ -62,50 +70,61 @@ class Task(object): return metric_variable_names -def create_text_cls_task(feature, label, num_classes, hidden_units=None): +def create_text_cls_task(feature, num_classes, hidden_units=None): """ Append a multi-layer perceptron classifier for binary classification base on input feature """ - cls_feats = fluid.layers.dropout( - x=feature, dropout_prob=0.1, dropout_implementation="upscale_in_train") - - # append fully connected layer according to hidden_units - if hidden_units is not None: - for n_hidden in hidden_units: - cls_feats = fluid.layers.fc(input=cls_feats, size=n_hidden) - - logits = fluid.layers.fc( - input=cls_feats, - size=num_classes, - param_attr=fluid.ParamAttr( - name="cls_out_w", - initializer=fluid.initializer.TruncatedNormal(scale=0.02)), - bias_attr=fluid.ParamAttr( - name="cls_out_b", initializer=fluid.initializer.Constant(0.))) - - ce_loss, probs = fluid.layers.softmax_with_cross_entropy( - logits=logits, label=label, return_softmax=True) - loss = fluid.layers.mean(x=ce_loss) - - num_example = fluid.layers.create_tensor(dtype='int64') - accuracy = fluid.layers.accuracy( - input=probs, label=label, total=num_example) - - graph_var_dict = { - "loss": loss, - "probs": probs, - "accuracy": accuracy, - "num_example": num_example - } - - task = Task("text_classification", graph_var_dict, - fluid.default_main_program(), fluid.default_startup_program()) + program = feature.block.program + with fluid.program_guard(program): + cls_feats = fluid.layers.dropout( + x=feature, + dropout_prob=0.1, + dropout_implementation="upscale_in_train") + + # append fully connected layer according to hidden_units + if hidden_units is not None: + for n_hidden in hidden_units: + cls_feats = fluid.layers.fc(input=cls_feats, size=n_hidden) + + logits = fluid.layers.fc( + input=cls_feats, + size=num_classes, + param_attr=fluid.ParamAttr( + name="cls_out_w", + initializer=fluid.initializer.TruncatedNormal(scale=0.02)), + bias_attr=fluid.ParamAttr( + name="cls_out_b", initializer=fluid.initializer.Constant(0.)), + act="softmax") + + inference_program = fluid.default_main_program().clone(for_test=True) + label = fluid.layers.data(name="label", dtype="int64", shape=[1]) + ce_loss = fluid.layers.cross_entropy(input=logits, label=label) + loss = fluid.layers.mean(x=ce_loss) + + num_example = fluid.layers.create_tensor(dtype='int64') + accuracy = fluid.layers.accuracy( + input=logits, label=label, total=num_example) + + graph_var_dict = { + "loss": loss, + "accuracy": accuracy, + "num_example": num_example, + "label": label, + "probs": logits + } + + task = Task( + "text_classification", + graph_var_dict, + fluid.default_main_program(), + fluid.default_startup_program(), + inference_program=inference_program) return task -def create_img_cls_task(feature, label, num_classes, hidden_units=None): +def create_img_cls_task(feature, num_classes, hidden_units=None): """ Create the transfer learning task for image classification. Args: @@ -117,74 +136,98 @@ def create_img_cls_task(feature, label, num_classes, hidden_units=None): Raise: None """ - cls_feats = feature - # append fully connected layer according to hidden_units - if hidden_units is not None: - for n_hidden in hidden_units: - cls_feats = fluid.layers.fc(input=cls_feats, size=n_hidden) - - logits = fluid.layers.fc( - input=cls_feats, - size=num_classes, - param_attr=fluid.ParamAttr( - name="cls_out_w", - initializer=fluid.initializer.TruncatedNormal(scale=0.02)), - bias_attr=fluid.ParamAttr( - name="cls_out_b", initializer=fluid.initializer.Constant(0.))) - - ce_loss, probs = fluid.layers.softmax_with_cross_entropy( - logits=logits, label=label, return_softmax=True) - loss = fluid.layers.mean(x=ce_loss) - - num_example = fluid.layers.create_tensor(dtype='int64') - accuracy = fluid.layers.accuracy( - input=probs, label=label, total=num_example) - - graph_var_dict = { - "loss": loss, - "probs": probs, - "accuracy": accuracy, - "num_example": num_example - } - - task = Task("image_classification", graph_var_dict, - fluid.default_main_program(), fluid.default_startup_program()) + program = feature.block.program + with fluid.program_guard(program): + cls_feats = feature + # append fully connected layer according to hidden_units + if hidden_units is not None: + for n_hidden in hidden_units: + cls_feats = fluid.layers.fc(input=cls_feats, size=n_hidden) + + probs = fluid.layers.fc( + input=cls_feats, + size=num_classes, + param_attr=fluid.ParamAttr( + name="cls_out_w", + initializer=fluid.initializer.TruncatedNormal(scale=0.02)), + bias_attr=fluid.ParamAttr( + name="cls_out_b", initializer=fluid.initializer.Constant(0.)), + act="softmax") + + inference_program = fluid.default_main_program().clone(for_test=True) + + label = fluid.layers.data(name="label", dtype="int64", shape=[1]) + ce_loss = fluid.layers.cross_entropy(input=probs, label=label) + loss = fluid.layers.mean(x=ce_loss) + + num_example = fluid.layers.create_tensor(dtype='int64') + accuracy = fluid.layers.accuracy( + input=probs, label=label, total=num_example) + + graph_var_dict = { + "loss": loss, + "probs": probs, + "accuracy": accuracy, + "num_example": num_example, + "label": label, + "probs": probs + } + + task = Task( + "image_classification", + graph_var_dict, + fluid.default_main_program(), + fluid.default_startup_program(), + inference_program=inference_program) return task -def create_seq_label_task(feature, labels, seq_len, num_classes): - logits = fluid.layers.fc( - input=feature, - size=num_classes, - num_flatten_dims=2, - param_attr=fluid.ParamAttr( - name="cls_seq_label_out_w", - initializer=fluid.initializer.TruncatedNormal(scale=0.02)), - bias_attr=fluid.ParamAttr( - name="cls_seq_label_out_b", - initializer=fluid.initializer.Constant(0.))) - - ret_labels = fluid.layers.reshape(x=labels, shape=[-1, 1]) - ret_infers = fluid.layers.reshape( - x=fluid.layers.argmax(logits, axis=2), shape=[-1, 1]) - - labels = fluid.layers.flatten(labels, axis=2) - ce_loss, probs = fluid.layers.softmax_with_cross_entropy( - logits=fluid.layers.flatten(logits, axis=2), - label=labels, - return_softmax=True) - loss = fluid.layers.mean(x=ce_loss) - - graph_var_dict = { - "loss": loss, - "probs": probs, - "labels": ret_labels, - "infers": ret_infers, - "seq_len": seq_len - } - - task = Task("sequence_labeling", graph_var_dict, - fluid.default_main_program(), fluid.default_startup_program()) +def create_seq_label_task(feature, max_seq_len, num_classes): + program = feature.block.program + with fluid.program_guard(program): + logits = fluid.layers.fc( + input=feature, + size=num_classes, + num_flatten_dims=2, + param_attr=fluid.ParamAttr( + name="cls_seq_label_out_w", + initializer=fluid.initializer.TruncatedNormal(scale=0.02)), + bias_attr=fluid.ParamAttr( + name="cls_seq_label_out_b", + initializer=fluid.initializer.Constant(0.))) + + ret_infers = fluid.layers.reshape( + x=fluid.layers.argmax(logits, axis=2), shape=[-1, 1]) + + logits = fluid.layers.flatten(logits, axis=2) + logits = fluid.layers.softmax(logits) + + inference_program = fluid.default_main_program().clone(for_test=True) + + seq_len = fluid.layers.data(name="seq_len", shape=[1], dtype='int64') + label = fluid.layers.data( + name="label", shape=[max_seq_len, 1], dtype='int64') + ret_labels = fluid.layers.reshape(x=label, shape=[-1, 1]) + + labels = fluid.layers.flatten(label, axis=2) + ce_loss = fluid.layers.cross_entropy(input=logits, label=labels) + loss = fluid.layers.mean(x=ce_loss) + + graph_var_dict = { + "loss": loss, + "probs": logits, + "labels": ret_labels, + "infers": ret_infers, + "seq_len": seq_len, + "label": label + } + + task = Task( + "sequence_labeling", + graph_var_dict, + fluid.default_main_program(), + fluid.default_startup_program(), + inference_program=inference_program) return task diff --git a/paddlehub/reader/cv_reader.py b/paddlehub/reader/cv_reader.py index 9048df02..0a3a8eb5 100644 --- a/paddlehub/reader/cv_reader.py +++ b/paddlehub/reader/cv_reader.py @@ -70,7 +70,11 @@ class ImageClassificationReader(object): if self.image_width <= 0 or self.image_height <= 0: raise ValueError("Image width and height should not be negative.") - def data_generator(self, batch_size, phase="train", shuffle=False): + def data_generator(self, + batch_size, + phase="train", + shuffle=False, + data=None): if phase == "train": data = self.dataset.train_data(shuffle) elif phase == "test": @@ -79,30 +83,41 @@ class ImageClassificationReader(object): elif phase == "val" or phase == "dev": shuffle = False data = self.dataset.validate_data(shuffle) + elif phase == "predict": + data = data + + def preprocess(image_path): + image = Image.open(image_path) + image = image_augmentation.image_resize(image, self.image_width, + self.image_height) + if self.data_augmentation: + image = image_augmentation.image_random_process( + image, enable_resize=False) + + # only support RGB + image = image.convert('RGB') + + # HWC to CHW + image = np.array(image).astype('float32') + if len(image.shape) == 3: + image = np.swapaxes(image, 1, 2) + image = np.swapaxes(image, 1, 0) + + # standardization + image /= 255 + image -= self.images_mean + image /= self.images_std + image = image[channel_order_dict[self.channel_order], :, :] + return image def _data_reader(): - for image_path, label in data: - image = Image.open(image_path) - image = image_augmentation.image_resize(image, self.image_width, - self.image_height) - if self.data_augmentation: - image = image_augmentation.image_random_process( - image, enable_resize=False) - - # only support RGB - image = image.convert('RGB') - - # HWC to CHW - image = np.array(image).astype('float32') - if len(image.shape) == 3: - image = np.swapaxes(image, 1, 2) - image = np.swapaxes(image, 1, 0) - - # standardization - image /= 255 - image -= self.images_mean - image /= self.images_std - image = image[channel_order_dict[self.channel_order], :, :] - yield ((image, label)) + if phase == "predict": + for image_path in data: + image = preprocess(image_path) + yield (image, ) + else: + for image_path, label in data: + image = preprocess(image_path) + yield (image, label) return paddle.batch(_data_reader, batch_size=batch_size) diff --git a/paddlehub/version.py b/paddlehub/version.py index daf7bd50..5091196f 100644 --- a/paddlehub/version.py +++ b/paddlehub/version.py @@ -12,5 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License. """ PaddleHub version string """ -hub_version = "0.4.2.alpha" +hub_version = "0.4.5.beta" module_proto_version = "1.0.0" -- GitLab