pytorch 使用resnet预训练模型提取特征

使用pytorch自带的预训练模型提取特征

1
2
3
4
5
6
7
import torch
import torch.nn as nn
import torchvision

resnet = torchvision.models.resnet50(pretrained=True)
resnet.fc = nn.Linear(2048, 2048, bias=False)
torch.nn.init.eye(resnet.fc.weight)

使用pytorch自带的预训练模型来训练自己的分类器

1
2
3
4
5
6
import torch
import torch.nn as nn
import torchvision

resnet = torchvision.models.resnet50(pretrained=True)
resnet.fc = nn.Linear(resnet.fc.in_features , num) # num是分类类别数

vps基本配置,及v2ray、hexo-blog和frp等安装配置

前言

之前买的vps因为商家重构了vps虚拟化的控制平台,数据也全部清除了(还好我之前对关键配置文件做了备份),现在不得不重新配置一次vps。之前配置vps都是直接google上搜索的,但很多资料不全和过期,今天趁这个机会刚好记录下自己配置vps的一些步骤,给以后的自己做一下参考,也希望可以帮助到有需要的人。

阅读全文

计算机秋招面试基础知识(操作系统、计网、C++)

编程语言

C/C++

static关键字

  • 存储位置:静态存储区

  • 对全局变量和局部变量的作用和区别(作用域

  • 对函数的作用

  • 在C++对类成员和类函数的作用

extern C

主要作用: 为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。

extern "C"包含双重含义: 从字面上可以知道,首先,被它修饰的目标是"extern"的;其次,被它修饰的目标代码是"C"的。

要点:extern int a仅仅是一个变量的声明,其并不是在定义变量a,也并未为a分配空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出错。

使用场景:C++调用C的代码

补充知识:由于C、C++编译器对函数的编译处理是不完全相同的,尤其对于C++来说,支持函数的重载,编译后的函数一般是以函数名和形参类型来命名的。例如函数void fun(int, int),编译后的可能是_fun_int_int(不同编译器可能不同,但都采用了类似的机制,用函数名和参数类型来命名编译后的函数名);而C语言没有类似的重载机制,一般是利用函数名来指明编译后的函数名的,对应上面的函数可能会是_fun这样的名字。

阅读全文

conda 换清华源 2020

最近总是需要配置环境,需要替换conda的默认源为清华源。但是网上很多换源的教程配置都是很老旧的,我换源后经常出现http error。参考清华源官方配置文档:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/

所以我特意查了下最新conda换清华源的配置方法,修改~/.condarc文件就行了,把其中的内容替换为如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
channels:
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

CV计算机机视觉基础/面试题

深度学习基础知识

卷积

普通卷积

优点:1. 参数量少,稀疏连接。 2. 直接将图像数据作为输入,不仅无需人工对图像进行预处理和额外的特征抽取等复杂操作

输入图像: W * H * C,卷积核大小:K * K,输出图像大小:W1 * H1 * C1

卷积核参数量计算: C * C1 * K * K

计算量计算: W1 * H1 * C1 * K * K * C

卷积后的图片大小计算:sup (h + 2*padding - (kerner_size -1) / stride) + 1

空洞卷积

P1: 在卷积位置中加入空洞,使得在保持参数量一样的情况下,感受野增大。

语义分割中,大感受野捕捉远距离之间的关系,小感受野捕捉近距离的关系

Pooling

Pooling的作用

  1. 减小feature map大小,减小参数量
  2. 提取主要特征
  3. 平移、旋转、尺度不变性

Max Pooling 和 Avg Pooling的作用

Max Pooling: 感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性

Avg Pooling: 更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在信息的完整传递这个维度上。在网络最后一几层中比较常用

正则化

BN/LN/WN

P1: 解决什么问题?

在训练时,某一层的参数更新,会导致上层网络会改变数据的分布,层层叠加之后,数据分布变化剧烈,深层网络难以训练。

P2:公式

x是一个神经元一组输入向量:\(x=(x_1,x_2,x_3,...,x_n)\)

通用公式: $ h=f(g +b)$

先norm到N(0, 1)的正太分布,然后进行再缩放和再平移。

再缩放和再平移的原因:保持网络的表达能力不会因为norm而下降

Batch Normalization: 针对batch设计的,统计一个batch中数据的均值和方差。要求mini batch的数据和整个数据分布相近,也就是batch_size越大,越靠近整体分布。mini batch还引入了噪声,提供了一定正则化。

Layer Normalization: 针对一层所有维度的输入,计算该层的均值和方差。LN针对单个样本设计

Weight Normalization:针对神经元的权重进行norm,将权重分解成方向向量\(v\)和长度向量\(g\)\(w=g \frac{v}{||v||}\),推导如下:

\[f_{w}(WN(x))=w*WN(x)=g*\frac{v}{||v||}*x=f_v(g*\frac{x}{||v||})\]

这样就变成了与通用norm公式相似的形式了,\(u=0\),\(\sigma=||v||\),\(b=0\),\(g=g\)

P3: BatchNormlization在训练和测试时有什么区别

P4: 为什么有用?

  • 权重伸缩不变性:

    指将权重\(w\) 按常量\(\lambda\)方向伸缩时,规范后的值不变

    \[Norm(W^{'} x)=Norm(g*\frac{w^{'}x-u^{'}}{\sigma^{'}}+b)=Norm(g*\frac{\lambda w x-\lambda w}{\lambda \sigma})=Norm(g*\frac{x-u}{\sigma}+b)=Norm(Wx)\]

  • 数据伸缩不变性:

    指将数据\(x\)按常量\(\lambda\)方向伸缩时,规范后的值不变。公式推导与上面一样

阅读全文

【leetcode】Word Search II

地址

https://leetcode.com/problems/word-search-ii/

题目

Given a 2D board and a list of words from the dictionary, find all words in the board.

Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.

Example:

1
2
3
4
5
6
7
8
9
10
Input: 
board = [
['o','a','a','n'],
['e','t','a','e'],
['i','h','k','r'],
['i','f','l','v']
]
words = ["oath","pea","eat","rain"]

Output: ["eat","oath"]

Note:

  1. All inputs are consist of lowercase letters a-z.
  2. The values of words are distinct.
阅读全文

Linux 修改ssh端口和ssh密码

Linux 修改ssh密码

  1. 输入命令passwd
  2. 然后输入新的密码
  3. 再次重复输入新密码

Linux 修改ssh端口

  1. 执行命令vi /etc/ssh/sshd_config,将#Port 22前的#删掉,同时添加新的ssh端口1212(你可以选别的端口,但不要选80和443)。修改后如图所示 :

  2. 执行service ssh restart重启ssh服务。

  3. 重开一个终端,用ssh -p 1212 IP尝试连接你的服务器。

  4. (如果可以正常连接则跳过这一步)如果连接不上,先上http://port.ping.pe/,验证你的新ssh端口是否开放。如果网页显示全是connected failed,则说明端口未开放。原因是你没有放行这个端口,请自行修改端口放行配置,直到可以使用新端口连接vps。

  5. 如果可以正常连接,则回到vps上,使用vi /etc/ssh/sshd_config,将Port 22这一行注释掉,同时使用service ssh restart重启ssh服务。到此ssh端口修改完成。(PS:必须确认可以使用新端口ssh上vps后,才能注视掉Port 22这一行。

linux挂载磁盘

查看磁盘信息

执行 fdisk -l,查看磁盘信息。如果看到/dev/vdb或/dev/xvdb,则代表有数据磁盘。

阅读全文

Nokvm debian镜像制作

总结

最近尝试了下nokvm 的镜像制作,现把制作过程记录一下,留作日后查阅。因为nokvm提供的镜像版本要么老旧要么不全,所以我是通过ISO全新安装制作模版镜像,过程参考自nokvm官方教程和相关资源。

(其他安装系统的方法还有dd,可以参考https://yangwenqing.com/archives/757/,dd可以不需要vnc,直接一键安装完成)

阅读全文