论文阅读手札:Global Filter Networks for Image Classification
论文作者:Yongming Rao, Wenliang Zhao, Zheng Zhu Jiwen Lu, Jie Zhou。论文原文点此URL。
本文提出概念简洁、计算性能优异的 Global Filter Network (GFNet),该模型主要结构框架基于 Vision Transformer ,在频域中学习空间长距离(long-term spatial dependencies)关系,其具有较小的对数线性复杂性。
其主要创新是使用 Global Filter Layer 替换了 Vision Transformer 中的 self-attention 层中的每一个子层。该模型取得了可喜的高精度,同时仅具有 CNN 的复杂度。
关于隔壁的工作站又被爆破了,还被塞了个挖矿病毒这件事
proxychians 刚装上就拉了
疼逊云服务器打折忍不住买了五年,刚装上 proxychains 写好配置文件之后第一次用就出现 ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored. Opening in existing browser session.
异常。看了一下 libproxychains.so.3 这个文件是在的:
in:
whereis libproxychains.so.3
out:
libproxychains.so: /usr/lib/x86_64-linux-gnu/libproxychains.so.3
后来发现其实是 proxychains 启动脚本文件里写的文件位置是这样的:
每次用都得重写一遍的 ResNet,干脆封装一个自己用的版本
ResNet 算得上是超经典的backbone了,其网络提出了残差结构,可有效缓解随网络层数的加深而导致的梯度消失和梯度爆炸现象。结构和设计在这里有讨论。这里主要尝试一下复现。ResNet的常见形式有:
Name | Top-1 error | Top-5 error |
---|---|---|
ResNet-18 | 30.43 | 10.76 |
ResNet-34 | 26.73 | 8.74 |
ResNet-50 | 24.01 | 7.02 |
ResNet-101 | 22.44 | 6.21 |
ResNet-152 | 22.16 | 6.16 |
除了上述常见形式,也有将channel数减半的half形式,以及使用膨胀卷积的形式等。但是每次写的时候都要重新写一份或者重新找一份很麻烦。干脆自己封装一个可以调整结构的版本。初步设想是这样的:
Typescript 中的 promise
Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。本质上 Promise 是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。Promise 类存在于很多现代 JavaScript 引擎中,其主要目的是为异步/回调风格的代码带来同步风格的错误处理。
React Components 生命周期
在 React.Component 的子类中有个必须定义的 render() 函数。render() 方法是 class 组件中唯一必须实现的方法。当 render 被调用时,它会检查 this.props 和 this.state 的变化并返回以下类型之一:
- React 元素。通常通过 JSX 创建。例如,
<div />
会被 React 渲染为 DOM 节点,<MyComponent />
会被 React 渲染为自定义组件,无论是<div />
还是<MyComponent />
均为 React 元素。 - 数组或 fragments。 使得
render
方法可以返回多个元素。 - Portals。可以渲染子节点到不同的 DOM 子树中。
- 字符串或数值类型。它们在 DOM 中会被渲染为文本节点
- 布尔类型或 null。什么都不渲染。(主要用于支持返回 b &&
<Child />
的模式,其中 b 为布尔类型。)
render()
函数应该为纯函数,这意味着在不修改组件 state
的情况下,每次调用时都返回相同的结果,并且它不会直接与浏览器交互。
关于 setTimeout 的一些小故事
@lideming曾经向我举过几个setTimeout的有趣例子。我先前不是很了解 JavaScript 的并发模型和事件循环,这些例子对我来说都算得上是巨坑无比了。
setTimeout 和事件循环
函数 setTimeout 接受两个参数:待加入队列的消息和一个时间值(可选,默认为 0)。这个时间值代表了消息被实际加入到队列的最小延迟时间。如果队列中没有其它消息并且栈为空,在这段延迟时间过去之后,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。因此第二个参数仅仅表示最少延迟时间,而非确切的等待时间。
下面的例子演示了这个概念(setTimeout 并不会在计时器到期之后直接执行):
使用 css module 避免到处refactor
简述
有时想给一个组件加一个style,结果之前写className的时候没弄好导致这个style出现在了一堆无关组件上,结果就得去疯狂refactor,或者到处加!important
,或者通过什么其他肮脏的手段解决。之前光知道后缀为.module.css
代替.css
能防止手忙脚乱,但是一直不知道它有个专门的名字。
A CSS Module is a CSS file in which all class names and animation names are scoped locally by default.
使用 css modlues 能在javascript中像变量名那样使用css的className。
再看一眼 useState Hook
之前说React Hooks可以没有class直接work。这是useState
的写法和对应的class写法: