写点什么

ARTS 打卡第 11 周

用户头像
steve_lee
关注
发布于: 2021 年 06 月 15 日
ARTS 打卡第11周

Algorithm

题目链接

133. 克隆图 - 力扣(LeetCode) (leetcode-cn.com)

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 valint) 和其邻居的列表(list[Node])。

题目分析

需要逐个复制节点,并且保存每个节点的 neighbours。 复制节点需要确认当前节点是否已经构建了,复制邻接关系需要找到原始节点关系(A'- B'的关系需要参考 A- B 的关系),此时 unordered_map 是进行快速查询和关系映射的数据结构。然后进行广度优先搜索,如果已经在 unordered_map 里面,就跳过,否则创建一个新的节点。同时,利用原节点的 neighbour 信息,构建当前节点的 neighhour 关系。

代码实现

class Node {public:    int val;    vector<Node*> neighbors;    Node() {        val = 0;        neighbors = vector<Node*>();    }    Node(int _val) {        val = _val;        neighbors = vector<Node*>();    }    Node(int _val, vector<Node*> _neighbors) {        val = _val;        neighbors = _neighbors;    }};
class Solution {public: Node* cloneGraph(Node* node) { if(node == nullptr){ return nullptr; } unordered_map<Node*, Node*> visited; queue<Node*> n_queue; n_queue.push(node); visited[node] = new Node(node->val); while(!n_queue.empty()){ Node* curr_node = n_queue.front(); n_queue.pop(); for(auto& neighbor : curr_node->neighbors){ if(visited.find(neighbor) == visited.end()){ visited[neighbor] = new Node(neighbor->val); n_queue.push(neighbor); } visited[curr_node]->neighbors.emplace_back(visited[neighbor]); } } return visited[node]; }};
复制代码



Review


本周有空闲的时间,可以将两个月前因为找工作耽搁的全栈课程给捡起来了。本周分享的是 openstackfull 第二章的内容,具体参见链接 Fullstack part1 | Introduction to React (fullstackopen.com) 主要是介绍 react 的应用以及 javascript 的基础知识。讲解的很清晰,给出的练习题有一点点难度,花了三四个小时才完成,但是确实做完了还是有成就感的。也能巩固学到的知识,说明练习题是精心设计过的。

这里分享一些自己记下来的笔记,

  • Babel: JS 新特性老的浏览器不知处,需要进行转换,babel 是最常用的工具

  • Node.js: 一个 js 运行环境,基于 chrome v8 js engine, 跨平台使用

  • 声明变量尽量用 const , let, 而非 var

  • const 声明的数组也是可以改变内容的,即便定义为 const,

  • 指针指向同一个 object 即可

  • 一个开发原则:react 状态不可以直接修改

  • 数组可以通过复制进行状态更改,而非在原数组上面更改

  • Hook 规则

  • 不能从循环、条件表达式或任何不是定义组件的函数的地方调用 useState

  • 事件处理程序必须始终是函数或对函数的引用。 如果将事件处理程序设置为任何其他类型的变量,则按钮将不起作用

  • 在按钮的属性中直接定义事件处理程序不一定是最好的方法

  • 不要在其他组件内部定义组件。 这种方法没有任何好处,而且会导致许多不愉快的问题。最大的问题是 React 在每次渲染时,会将内部的组件当作一个新的组件。这回导致 React 无法去优化组件。


这门课真的很有意思,而且对于非大型商业化项目,node.js 应该也是能够支撑的,对于中小 startup 非常合适,有志于开发一个系统玩玩或者搞副业的 machine learning engineer,推荐学习下。

Tips

本次 Tips 是讲深度学习实验的文件管理。相信很多人都遇见过模型效果很好,但是后面找不到,做起实验又因为超参数调整,效果不可复现的坑,一个合适的实验文件管理方法,能够极大的避免这种状况。

  1. 首先,给起一个有意义的名字;必要的情况下,可以建立多个子文件夹;但是文件名称不要太长;

  2. 其次,复现代码进行改动都是基于复制操作的;模型训练好,如果想在这个基础上改动,那么一定是复制到另一个文件夹里面,并且给出有意义的名称;

  3. 当完成实验后,那时候记忆很清晰,应该有一个简单的描述放到文件夹里面,方便检索和事后比较;

  4. 最后,应该在自己笔记系统里面记录实验效果,配置,文件目录地址;

  5. 定期备份,硬盘坏了是小概率,但是真的来了就很糟糕,遇见好多人包括自己都踩过这个坑;

  6. GitHub - ChrisWu1997/EfficientResearchWork: Efficient research work environment setup for computer science and general workflow for Deep Learning experiments 这个地址介绍的实验管理方法也很值得参考。

Share

本周分享的观点是: 机器学习的一个方法,测试集的构建应当先于训练集。如果只是做一些公开数据集的训练,那大概率不会存在这个问题。此时数据集已经开放,问题定义也很清晰。但是如果在一个业务中,需要部署一套机器学习模型,此时就需要自己定义问题。那么此时,测试集是要先于训练集进行构建的。因为此时,问题并不清晰,边界条件、极端情况、大多数情况、要达成的目标、长尾数据等都需要考虑一下,只有考虑清晰了场景才知道问题,问题清晰了才知道哪些方案可行,此时才能数据集进行标注的方法以及种类。

发布于: 2021 年 06 月 15 日阅读数: 20
用户头像

steve_lee

关注

还未添加个人签名 2018.03.09 加入

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

评论

发布
暂无评论
ARTS 打卡第11周