写点什么

ARTS - week 9

用户头像
steve_lee
关注
发布于: 2021 年 05 月 09 日
ARTS - week 9

Algorithm

题目链接

47. 全排列 II - 力扣(LeetCode) (leetcode-cn.com)

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

题目分析

特点:先排序(排序是剪枝的前提),再进行深度优先搜索。为了进行优化,需要在同一位置进行确认是否某个数字(存在重复数字)已经 used 了,如果 used 则进行剪枝操作。

代码实现

class Solution {public:    vector<vector<int>> permuteUnique(vector<int>& nums) {        vector<vector<int>> result;        deque<int> path;        if(nums.size() == 0){            return result;        }         vector<bool> used(nums.size(), false);        sort(nums.begin(), nums.end());        dfs(0, result, nums, path, used);        return result;    }    void dfs(int pos, vector<vector<int>> &result, vector<int> &nums, deque<int> &path, vector<bool>& used){        if(pos == nums.size()){            result.push_back(vector<int>(path.begin(), path.end()));            return;        }        for(int i = 0; i < nums.size(); i++){            if(used[i]){                continue;            }            if(i > 0 && nums[i] == nums[i-1] && !used[i-1]){                continue;            }            path.push_back(nums[i]);            used[i] = true;            dfs(pos+1, result, nums, path, used);            used[i] = false;            path.pop_back();        }    }};
复制代码



Review

Automate your Python project with Makefile | Anton Zhiyanov 这篇文章和上周介绍的文章是同一个作者,都是介绍 python 工程化方法的。上周文章介绍的是 python 打包的技巧。本文则是介绍 python 任务自动化的介绍。

什么问题?

在开发过程中,有很多任务需要进行,例如用 linter 检查代码,进行单元测试,部署到 docker 上面。手动操作非常繁琐,.sh 文件能够进行任务的自动化,但是会弄乱文件结构。在 IDE 中进行设置也需要逐步运行,还是不是太方便。

使用方法?

本文介绍的方法,是利用 Makefile 来进行自动化,适用于 Linux 和 MacOS 系统。除了能够用于 C 语言的编译链接,makefile 也可以用于自动化其他任务,例如 python 项目的自动化。下面是一个示例

coverage:  ## Run tests with coverage	coverage erase	coverage run --include=podsearch/* -m pytest -ra	coverage report -m
deps: ## Install dependencies pip install black coverage flake8 mypy pylint pytest tox
lint: ## Lint and static-check flake8 podsearch pylint podsearch mypy podsearch
push: ## Push code with tags git push && git push --tags
test: ## Run tests pytest -ra
复制代码

下面是进行自动化 lint 的示例

$ make lint coverage
flake8 podsearchpylint podsearch...mypy podsearch...coverage erasecoverage run —include=podsearch/* -m pytest -ra...coverage report -mName Stmts Miss Cover Missing-----------------------------------------------------podsearch/__init__.py 2 0 100%podsearch/http.py 17 0 100%podsearch/searcher.py 51 0 100%-------------------------------------------------TOTAL 70 0 100%
复制代码


通过 makefile, 也可以列出各个任务之间的依赖关系,如 test 之前需要进行 lint, 可以通过下述代码进行说明

test: lint	pytest -ra
复制代码


这个作者目前文章就这两篇,但是确实是实打实的技术干货,推荐使用 python 的程序员阅读。

Tips

本周介绍一个深度学习语义分割任务的技巧,深度学习语义分割任务会有一个固定的问题,就是标注的 mask 质量不佳,不同的人标注的结果在边缘地方会有些许差异,这也会导致训练出来的模型在边界地区会出现模糊。为了解决这个状况,可以对边界位置进行膨胀操作,然后膨胀的区域权重为 0,仅训练标注区域,这样子模型在模糊地带有个缓冲,可以更自然的学习模型边框,不至于输出一个模糊结果。

Share

本周分享的观点是:构建数据->算法循环工具链是优先于模型优化的。本观点在吴恩达老师吴恩达的二八定律:80%的数据+20%的模型=更好的机器学习 (qq.com) 这篇文章出来之前很早就提出了,否则不会在阿里优先去做工业标注平台。原因是,通过实践证明,数据改进带来的提升是远大于算法优化的,只有数据获取成本太高,数据标注质量足够好的时候,算法优化才能显示出优势,在这之前,扩充数据规模,改进标注质量是能够花 20%的精力,达到 80%的效果。而且这个过程,也是构建优秀模型的必由之路。没有优秀的测试集,整个算法优化就像是没有导航系统,你甚至不知道哪个算法是真正更优秀的。所以正常的 AI 流程应该是先收集数据,跑基线模型,通过 AI System 持续进行数据扩充和标注清洗,继续训练模型。如果一个 AI 专家说自己在算法上做了很多努力,但是在数据上面没有操心,那么要么他们分工太明确,他没有参与整个链路,要么这是只在公开数据集跑过,没有参与实际落地的专家。

发布于: 2021 年 05 月 09 日阅读数: 26
用户头像

steve_lee

关注

还未添加个人签名 2018.03.09 加入

努力做全栈程序员,将AI应用于实处

评论

发布
暂无评论
ARTS - week 9