写点什么

ARTS - week 5

用户头像
steve_lee
关注
发布于: 2021 年 04 月 11 日
ARTS - week 5

补上周打卡,封面图为埃因霍温。

Algorithm

题目链接

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) (leetcode-cn.com)

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:你可以假设树中没有重复的元素

题目分析

和上周先序遍历+中序遍历构造二叉树的原理相同https://xie.infoq.cn/article/057f782b481e37426872b03aa

对于每个子树,如果是先序遍历,则第一个点是 root 节点,如果是后序遍历,则最后一个点是 root 节点。通过在中序遍历数组中找到 root 节点的位置,可以确定当前节点左右子树的起始位置,从而可以根据 root 位于最先/后的规则构建两个子树,递归下去,整个树就构建出来了。

代码实现

class Solution {public:    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {        int start = 0;        int end = postorder.size() - 1;        return buildTreewithRoot(inorder, postorder, start, end, end);     }
TreeNode* buildTreewithRoot(vector<int>& inorder, vector<int>& postorder, int start, int end, int root_idx){ if(start > end){ return nullptr; } if(start == end){ return new TreeNode(postorder[root_idx]); } int root_idx_inorder = own_find(inorder, postorder[root_idx], start, end); int left_size = root_idx_inorder - start; int right_size = end - root_idx_inorder; TreeNode* root = new TreeNode(postorder[root_idx]);
TreeNode* left = buildTreewithRoot(inorder, postorder, start, root_idx_inorder-1, root_idx-right_size-1); TreeNode* right = buildTreewithRoot(inorder, postorder, root_idx_inorder+1, end, root_idx-1); root->left = left; root->right = right; return root; } int own_find(vector<int>& V, int target, int start_idx, int end_idx){ for(auto i = start_idx; i <= end_idx; i++){ if(V[i] == target){ return i; } } return start_idx; }};
复制代码



Review

本周 review 的文章是关于最近很火的 transformer 的, http://jalammar.github.io/illustrated-transformer/, 作者是 Jay Alammar, 他的博客提供了关于机器学习概念很好的可视化。有写论文里面描述不清楚的概念,作者都能通过图示加上自己的解释,使之变得清晰。这篇文章针对的是“Attention is all you need”论文进行介绍。

Attention 是用于 NLP 任务的一种方式,后来也被用于 CV 中。

模型结构

从上图可以看出,整个结构是 encoder 和 docoder 的堆叠, 关于 encoder 和 decoder 的差别,可以参见下图。主要是多了 encoder-decoder attention 部分,该部分

本文根据原文作者介绍,画了一个关于该文章最核心机制 self-attention 的流程图,可供参考


因为该文章篇幅较长,关于 encoder-decoder 部分,将在下周进行介绍并且绘图

Tips

本周介绍一个 jupyter notebook 远程登陆的方法,这样可以在本地浏览器查看远程模型的训练过程,具体分三步

Step 1: 生成配置文件

jupyter nobebook --generate-config
复制代码

该命令会将配置文件保存于一个路径下,默认路径为 ~/.juputer/jupyter_notebook_config.py

Step 2: 生成密码,通过以下命令生成密码,远程登陆的时候需要输入密码才能进行操作

jupyter notebook password
复制代码

Step 3: 修改配置文件

修改 step 1 生成的配置文件, ~/.juputer/jupyter_notebook_config.py, 主要有三个地方,这三行通过搜索都能找到,不需要额外加几行内容。

c.NotebookApp.ip = '\*' #允许所有ip访问    c.NotebookApp.open\_browser = False #不打开浏览器    c.NotebookApp.port = 8888 #端口为8888
复制代码

此时,在对应环境下启动 jupyter notebook, 在本地电脑打开 ip:8888, 输入 step 2 配置的密码,即可进行远程操作。

Share

本周分享的观点是:以我自己亲身体验,技术领域如果作为 leader,发言不得要领确实很损失威信,尤其是团队比较小的时候。在需要指导的时候,给出的是笼统的指南,会让下属觉得很迷糊。十人以下开发团队,最好能够知道每个人做什么,业务目标是什么,技术目标是什么,技术难点是什么,这样发言才不至于给人的感觉很空,损失自己的威望。中国有句古话,识时务者为俊杰,就是能够判断局势,并能够做实是。

发布于: 2021 年 04 月 11 日阅读数: 31
用户头像

steve_lee

关注

还未添加个人签名 2018.03.09 加入

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

评论

发布
暂无评论
ARTS - week 5