大佬们好,很久不见……(真*很久不见=。=)
很长时间没有写过博文了,为表歉意,今天给大佬们整个花活儿~ 那就是我这次要讲的主题咯——Luwu
~
那么,Luwu
是啥?是本菜鸡写的一个辣鸡开源项目……
这个辣鸡开源项目有啥用呢?
咳咳,Luwu,即 陆吾,旨在提供一个 无代码 或 低代码 的 深度学习工具 (开发初衷只是为了方便自己偷懒……哪怕只是简单的深度学习任务中,往往也存在大量重复而繁琐的工作,这些低价值的任务不应该浪费我们宝贵的时间。自动化,yyds!)
Luwu的诉求大致可以归结为两点:
截止到 2021/6/14 日,现已支持的任务类型有(当前Luwu
的版本号为0.32
):
辣鸡项目的更多功能,还在由辣鸡作者持续迭代中……
Luwu
仍处于项目初期,很多地方都不完善,项目不太成熟,所以接口/使用方式在后续的过程中可能会有所调整,大佬们见谅~
但是,还是为辣鸡项目求个 star 吧,有喜欢的大佬们欢迎 star ~ 然后有热心的大佬愿意贡献代码的话也随时欢迎 ~
项目地址:
https://github.com/AaronJny/luwu
更多信息请参考项目的readme文档。
嘛,不给 star 就算啦,反正最初也只是为了方便自己~ 佛系ing
好了,闲话不多说,开始整活儿~
转载请注明来源:https://blog.csdn.net/aaronjny/article/details/117917378
首先说个不太好的消息,安装和使用 Luwu
对网络环境有一定要求。因为安装和使用的过程中,可能会从 GitHub
和 Google
下载文件(比如 TensorFlow Object Detection API
、BERT
预训练权重、访问kaggle
等),所以请保证你的网络可以正常访问Google
,或者使用代理,否则可能会因为网络原因导致 Luwu
无法正常使用。
如果没法正常访问Google
的话,在命令行中设置代理的方式如下(需要自己准备代理):
假如你的代理地址和端口如下:
类型 地址 端口 http http://127.0.0.1 7890 https http://127.0.0.1 7890 socks5 socks5://127.0.0.1 7891 则打开终端,输入如下命令并回车即可(注意,代理设置完成后只在当前窗口有效,打开新的窗口需要重新设置):
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891
另外,项目暂未提供windows支持,只在 Linux / Mac 下做了兼容测试,使用 Windows 的大佬们可以考虑使用 Docker
,Luwu
提供了构建好的Docker
镜像(CPU版本和GPU版本均有),详情请参考 Luwu
的项目说明文档。
Luwu
支持使用pip
安装,非常简单,打开终端,输入如下指令即可:
pip install luwu -v
安装成功:
注意,Luwu
会通过脚本安装相关依赖,这可能会花费一些时间(1分钟或更久),使用-v
是为了更好地提示安装进度,避免陷入等待的焦虑=。=
Luwu
支持 Web UI 服务
和 命令行工具
两种使用方式,但目前Web UI 服务
的开发已经被搁置了,原因是——我发现命令行工具
貌似更好用且更实用。
PS: Web UI 服务现在只支持图像分类功能,命令行工具支持全部功能。
这里我就使用 Luwu
的 命令行工具
进行演示了。
当我们安装好Luwu
后,可以在终端调用Luwu
的命令行工具
。打开终端,输入luwu -v
,即可查看当前安装的Luwu
的版本号:
输入luwu -h
,即可查看Luwu
命令行工具的基本使用方法。
输出如下:
usage: luwu [-h] [--version] [--luwu_version LUWU_VERSION]
{web-server,detection,classification,text_classification,text_sequence_labeling}
...
Luwu命令行工具。 你完全可以不写任何代码,就能够完成深度学习任务的开发。 LuWu command tool. You can complete the
development of deep learning tasks without writing any code.
optional arguments:
-h, --help show this help message and exit
--version, -v 查看当前luwu版本号
--luwu_version LUWU_VERSION
kaggle上使用的Luwu版本,不指定则默认使用最新的正式版本
cmd:
命令参数,用以指定 Luwu 将要执行的操作
{web-server,detection,classification,text_classification,text_sequence_labeling}
web-server 以web服务的形式启动Luwu,从而通过图形界面完成深度学习任务的开发。
detection 通过命令行进行目标检测任务训练。
classification 通过命令行进行图像分类任务训练。
text_classification
通过命令行进行文本分类任务训练。
text_sequence_labeling
通过命令行进行文本序列标注任务训练。
我们现在要做的是图像分类任务,即上面的classification
任务,我们输入luwu classification -h
可以查看该任务的使用方法。输出如下:
usage: luwu classification [-h] [--origin_dataset_path ORIGIN_DATASET_PATH]
[--validation_dataset_path VALIDATION_DATASET_PATH]
[--test_dataset_path TEST_DATASET_PATH]
[--tfrecord_dataset_path TFRECORD_DATASET_PATH]
[--model_save_path MODEL_SAVE_PATH]
[--validation_split VALIDATION_SPLIT]
[--test_split TEST_SPLIT]
[--do_fine_tune DO_FINE_TUNE]
[--freeze_epochs_ratio FREEZE_EPOCHS_RATIO]
[--batch_size BATCH_SIZE] [--epochs EPOCHS]
[--learning_rate LEARNING_RATE]
[--optimizer OPTIMIZER] [--project_id PROJECT_ID]
[--image_augmentation_random_flip_horizontal IMAGE_AUGMENTATION_RANDOM_FLIP_HORIZONTAL]
[--image_augmentation_random_flip_vertival IMAGE_AUGMENTATION_RANDOM_FLIP_VERTIVAL]
[--image_augmentation_random_crop IMAGE_AUGMENTATION_RANDOM_CROP]
[--image_augmentation_random_brightness IMAGE_AUGMENTATION_RANDOM_BRIGHTNESS]
[--image_augmentation_random_hue IMAGE_AUGMENTATION_RANDOM_HUE]
[--run_with_kaggle RUN_WITH_KAGGLE]
[--kaggle_accelerator KAGGLE_ACCELERATOR]
network_name
positional arguments:
network_name 分类器名称,支持的分类器有:[LuwuDenseNet121ImageClassifier, LuwuDen
seNet169ImageClassifier,LuwuDenseNet201ImageClassifier
, LuwuVGG16ImageClassifier,LuwuVGG19ImageClassifier,Lu
wuMobileNetImageClassifier, LuwuMobileNetV2ImageClassi
fier,LuwuInceptionResNetV2ImageClassifier, LuwuIncepti
onV3ImageClassifier,LuwuNASNetMobileImageClassifier, L
uwuNASNetLargeImageClassifier,LuwuResNet50ImageClassif
ier, LuwuResNet50V2ImageClassifier,LuwuResNet101ImageC
lassifier, LuwuResNet101V2ImageClassifier,LuwuResNet15
2ImageClassifier, LuwuResNet152V2ImageClassifier,LuwuM
obileNetV3SmallImageClassifier, LuwuMobileNetV3LargeIm
ageClassifier,LuwuXceptionImageClassifier, LuwuEfficie
ntNetB0ImageClassifier,LuwuEfficientNetB1ImageClassifi
er, LuwuEfficientNetB2ImageClassifier,LuwuEfficientNet
B3ImageClassifier, LuwuEfficientNetB4ImageClassifier,L
uwuEfficientNetB5ImageClassifier, LuwuEfficientNetB6Im
ageClassifier,LuwuEfficientNetB7ImageClassifier]
optional arguments:
-h, --help show this help message and exit
--origin_dataset_path ORIGIN_DATASET_PATH
处理前的数据集路径
--validation_dataset_path VALIDATION_DATASET_PATH
验证数据集路径。如不指定,则从origin_dataset_path中进行切分。
--test_dataset_path TEST_DATASET_PATH
测试数据集路径。如不指定,则从origin_dataset_path中进行切分。
--tfrecord_dataset_path TFRECORD_DATASET_PATH
处理后的tfrecord数据集路径
--model_save_path MODEL_SAVE_PATH
模型保存路径
--validation_split VALIDATION_SPLIT
验证集切割比例。默认 0.1
--test_split TEST_SPLIT
测试集切割比例。默认 0.1
--do_fine_tune DO_FINE_TUNE
是进行fine tune,还是重新训练。默认 False
--freeze_epochs_ratio FREEZE_EPOCHS_RATIO
当进行fine_tune时,会先冻结预训练模型进行训练一定epochs,再解冻全部参数训练一定epochs,
此参数表示冻结训练epochs占全部epochs的比例(此参数仅当 do_fine_tune = True
时有效)。默认 0.1(当总epochs>1时,只要设置了比例,至少会训练一个epoch)
--batch_size BATCH_SIZE
mini batch 大小。默认 32.
--epochs EPOCHS 训练epoch数。默认 30.
--learning_rate LEARNING_RATE, -lr LEARNING_RATE
学习率。默认 0.001.
--optimizer OPTIMIZER
训练时的优化器类型,可选参数为 [Adam, Adamax, Adagrad, Nadam,
Adadelta, SGD, RMSprop]。默使用 Adam.
--project_id PROJECT_ID
项目编号. Defaults to 0.
--image_augmentation_random_flip_horizontal IMAGE_AUGMENTATION_RANDOM_FLIP_HORIZONTAL
数据增强选项,是否做随机左右镜像。默认False.
--image_augmentation_random_flip_vertival IMAGE_AUGMENTATION_RANDOM_FLIP_VERTIVAL
数据增强选项,是否做随机上下镜像。默认False.
--image_augmentation_random_crop IMAGE_AUGMENTATION_RANDOM_CROP
数据增强选项,是否做随机剪裁,剪裁尺寸为原来比例的0.9。默认False.
--image_augmentation_random_brightness IMAGE_AUGMENTATION_RANDOM_BRIGHTNESS
数据增强选项,是否做随机饱和度调节。默认False.
--image_augmentation_random_hue IMAGE_AUGMENTATION_RANDOM_HUE
数据增强选项,是否做随机色调调节。默认False.
--run_with_kaggle RUN_WITH_KAGGLE
是否使用kaggle环境运行。必须先安装并配置kaggle
api,才可以使用此选项。默认为False,即本地运行
--kaggle_accelerator KAGGLE_ACCELERATOR
是否使用kaggle GPU进行加速(注意,仅当 run_with_kaggle 为 True
时此选项才有效)。默认不使用(即使用CPU)
这么多参数???有没有搞错???
不用担心,这里的大多数参数你并不需要用到,这里只是提供一种可能性。一般情况下,你只需要配置几个参数就可以了。
下面正式开始了——我们现在使用Luwu
训练一个猫狗图片分类器。
首先,第一步,我们需要获取猫狗的图片数据集。
数据集可以从这里下载:https://www.floydhub.com/fastai/datasets/cats-vs-dogs
下载后解压即可。
因为只是做演示,所以我们就不使用完整数据集了,仅使用数据集中train
部分。
我们需要创建一个文件夹作为工作目录。
打开终端,输入mkdir cats-vs-dogs
,创建工作目录。
输入cd cats-vs-dogs && mkdir data
,创建一个data目录,用于存放原始数据集。
接下来,打开cats-vs-dogs/data
文件夹,将下载的数据集中的train
文件夹下的子文件夹复制到cats-vs-dogs/data
文件夹下。
luwu
的命令行工具训练图像分类器打开终端,将当前目录切换到cats-vs-dogs
下,然后输入命令:
luwu classification --origin_dataset_path "./data" --tfrecord_dataset_path "./dataset" --model_save_path "." --epochs 4 --validation_split 0.05 --do_fine_tune True LuwuDenseNet121ImageClassifier
这里解释一下命令中的参数:
origin_dataset_path
是./data
,./data
下有两个文件夹cats
和dogs
分别代表两个类别,所有猫的图片都放在cats
文件夹下,所有狗的图片都放在dogs
文件夹下。TFRecord
格式的文件,这个目录表示生成的TFRecord
文件存放的位置。举个例子,这里的tfrecord_dataset_path
是./dataset
,生成的文件将放在此目录下(如果该目录不存在则会自动创建)。model_save_path
是.
,表示存放在当前目录下。epochs
为4,表示遍历完整数据集4次。validation_split
为0.05,表示有约5%的数据用于模型验证。True
时,默认先冻结预训练模型的权重训练 0.1*epochs 个epochs(向上取整)(具体比例可以通过 freeze_epochs_ratio 参数调整),再解冻全部参数训练完剩下的 epochs。否则,解冻全部参数训练所有epochs。这里的do_fine_tune
为True
,epochs
为4,freeze_epochs_ratio
为默认值0.1,表示先冻结训练1个epochs,再解冻训练3个epochs。luwu classification -h
查看。(这么多模型如何选择?后面再补说明吧)注意,路径相关的参数其实传绝对路径会更合适,能够减少人为引入的路径错误问题。不过为了方便演示,我这里使用了相对路径。
更多的可配置参数也可以通过在命令行中执行luwu classification -h
查看。
言归正传,输入上面的命令后,luwu将开始训练一个图像分类器,大致输出如下:
Namespace(batch_size=8, cmd='classification', do_fine_tune=True, epochs=4, freeze_epochs_ratio=0.1, image_augmentation_random_brightness=False, image_augmentation_random_crop=False, image_augmentation_random_flip_horizontal=False, image_augmentation_random_flip_vertival=False, image_augmentation_random_hue=False, kaggle_accelerator=False, learning_rate=0.001, luwu_version='', model_save_path='.', network_name='LuwuDenseNet121ImageClassifier', optimizer='Adam', origin_dataset_path='./data', project_id=0, run_with_kaggle=False, test_dataset_path='', test_split=0.1, tfrecord_dataset_path='./dataset', validation_dataset_path='', validation_split=0.05)
2021-06-15 00:42:55.613 | INFO | luwu.core.models.classifier:run:319 - 正在预处理数据集...
100%|███████████████████████████████████████████████████████████████████████████████████████████████| 19672/19672 [00:06<00:00, 3216.37it/s]
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 1150/1150 [00:00<00:00, 2846.68it/s]
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 2300/2300 [00:00<00:00, 2991.18it/s]
2021-06-15 00:43:06.926540: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2021-06-15 00:43:06.929492: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-06-15 00:43:07.167322: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
2021-06-15 00:43:20.214 | INFO | luwu.core.models.classifier:run:322 - 正在构建模型...
2021-06-15 00:43:23.919 | INFO | luwu.core.models.classifier:run:325 - 开始训练...
2021-06-15 00:43:23.919 | INFO | luwu.core.models.classifier.preset.pre_trained:train:50 - 分两步训练,冻结训练1个epochs,解冻训练3个epochs...
2021-06-15 00:43:23.919 | INFO | luwu.core.models.classifier.preset.pre_trained:train:54 - 冻结 pre-trained 模型,开始预训练 ...
2459/2459 [==============================] - 1464s 593ms/step - loss: 0.5017 - accuracy: 0.9508 - val_loss: 0.2045 - val_accuracy: 0.9770
2021-06-15 01:07:48.171 | INFO | luwu.core.models.classifier.preset.pre_trained:train:67 - 解冻 pre-trained 模型,继续训练 ...
Epoch 2/4
2459/2459 [==============================] - 1460s 594ms/step - loss: 0.1425 - accuracy: 0.9806 - val_loss: 0.1068 - val_accuracy: 0.9765
Epoch 3/4
2459/2459 [==============================] - 1439s 585ms/step - loss: 0.0842 - accuracy: 0.9816 - val_loss: 0.0752 - val_accuracy: 0.9791
Epoch 4/4
2459/2459 [==============================] - 1455s 592ms/step - loss: 0.0630 - accuracy: 0.9819 - val_loss: 0.0628 - val_accuracy: 0.9796
2021-06-15 02:20:24.311 | INFO | luwu.core.models.classifier.preset.pre_trained:train:80 - 在测试集上进行验证...
288/288 [==============================] - 153s 533ms/step - loss: 0.0628 - accuracy: 0.9796
2021-06-15 02:22:57.761 | INFO | luwu.core.models.classifier.preset.pre_trained:train:84 - [0.06279316544532776, 0.9795652031898499]
2021-06-15 02:22:57.761 | INFO | luwu.core.models.classifier:run:328 - 导出代码...
2021-06-15 02:22:57.767 | INFO | luwu.core.models.classifier:run:330 - Done.
演示的这台机器没有GPU环境,所以训练会比较慢,但不影响演示。
这个分类问题也比较简单,可以发现训练第一个epochs就已经有不错的结果了,第1个epoch训练完成后,验证集acc为0.977,训练完4个epoch,最终在测试集上的acc为0.9796。
训练完成后,打开cats-vs-dogs
文件夹:
luwu-classification-project
就是我们保存模型的目录,打开它,里面有训练好的模型和供参考的调用脚本:
改一下脚本里面的图片路径,就可以调用模型对指定的图片进行分类啦~来用下面这张图片试一下:
(base) aaron@AaronJnydeMacBook-Pro > ~/cats-vs-dogs/luwu-classification-project > python luwu-code.py
2021-06-15 05:27:55.020102: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2021-06-15 05:27:55.020308: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-06-15 05:27:57.890260: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
当前图片类别为:dogs
成功识别出,结果为狗。
辣鸡作者,辣鸡项目,bug一堆,多多包涵~
使用中碰到什么问题,或者有什么好的建议,也可以在GitHub上发起issue。
如果喜欢这个项目,请给个star ~
如果喜欢这篇文章的话,都看到这里了,点个关注、点个在看、点个赞呗~
谢谢大佬~
关于我
某以Python作为主要语言的技术爱好者,ACM-ICPC破铜烂铁选手。
某喜欢分享、又菜的一批的、喜欢搞爬虫和算法的弱鸡。
某不知名、正在努力成长中的技术博主。
CSDN: https://blog.csdn.net/aaronjny
GitHub: https://github.com/AaronJny
微信公众号: 技术小白成长日记
加油,共勉!