PyTorch中Tensor的操作手册

Tensor基本操作#

创建tensor:#

1.numpy向量转tensor:

1
2
3
4
a=np.array([2,2,2])
b=torch.from_numpy(a)
# tensor转numpy
a = b.numpy()

2.列表转tensor:

1
2
3
a=torch.tensor([2,2])
b=torch.FloatTensor([2,2.])#不常用
c=torch.tensor([[1,2],[3,4]])#2*2矩阵

3.利用大写接受以shape创建:

1
2
3
4
torch.empty(2,3)#生成一个2*3的0矩阵
torch.Tensor(2,3)#生成一个2*3的随机矩阵
torch.IntTensor(2,3)
torch.FloatTensor(2,3).type()

默认下,Tensor为‘torch.FloatTensor’类型,若要改为double类型的,则需要执行

torch.set_default_tensor_type(torch.DoubleTensor)来修改。

1
2
3
4
# tensor类型转换——使用简单后缀
tensor.int()
tensor.float()
tensor.double()

4.随机创建Tensor:

1
2
3
4
5
6
7
a=torch.rand(3,3)#创建3*3的0到1均匀分布的矩阵
a=torch.randn(3,3)#均值为0方差为1正态分布矩阵

torch.rand_like(a)#等价于下一条
torch.rand(a.shape)

torch.randint(1,10,[3,3])#创建3*3的范围在[1,10)随机分布的整数矩阵

5.创建相同数的矩阵:

1
2
3
4
5
6
7
torch.full([3,3],1)#生成3*3的全为1的矩阵
torch.full([],1)#生成标量1
torch.full([2],1)#生成一个长度为2的值全为1的向量
torch.ones(3,3)
torch.zeros(3,3)
torch.eye(3,4)#生成对角为1矩阵,若不是对角矩阵,则多余出用0填充
torch.eye(3)#3*3对角矩阵

6.创建规律数列矩阵:

1
2
3
4
5
6
torch.arange(0,10)#生成[0,1,2,3,4,5,6,7,8,9]
torch.arange(0,10,2)#生成增量为2的数列
torch.arange(10)#效果同于(0,10)

torch.linspace(0,10,4)#生成[0.0000,3.3333,6,6667,10,0000]包括10的4等分向量
torch.logspace(0,-1,steps=10,base=10)#生成10个0到-1等分的数,再以其为指数,如第一个数#为1.000,最后一个数为0.100

7.创建随机打散数组:

1
torch.randperm(10)#生成0~9这10个数乱序的数组(常用作索引)

8.指定cpu的tensor还是gpu的tensor(Model的指定方法同理)

1
2
3
4
5
6
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
a = a.to(device)
a = a.to(b.device) # 指定a的设备与tensor b一致
# 或者
a = a.cuda()
a = a.cpu()

tensor的比较:#

指定条件返回01-tensor或返回索引

tensor相等 torch.eq,大于 torch.gt,小于 torch.lt,等于 torch.eq,非某数 torch.ne,非零 torch.nonzero

阅读更多...

Python和Numpy高级

Python高级

日常读和写python项目时遇到的常用的高级python知识。

1. import的用法

绝对导入,主要用于导入sys.path的包,以及运行入口文件导入自己的模块。

  1. import module_name

    • Python会在两个地方寻找这个模块,第一是sys.path(通过运行代码import sys; print(sys.path)查看),所以对于安装好的库,我们直接import即可。第二个地方就是运行文件所在的目录。

    • 可以作为module的文件类型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。

    • 当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“”或者双下划线“_”)开头的变量、函数和类。

  2. from package_name import module_name

    • 与第一种写法类似,Python会在sys.path和运行文件目录这两个地方寻找包,然后导入包中名为module_name的模块。
    • package_name 指的就是文件夹名,包目录下为首的一个文件便是__init__.py。如果一个模块定义有列表__all__,则from module import * 语句只能导入__all__列表中存在的对象。
阅读更多...

TensorFlow2.0+的API结构梳理

本文梳理了tf 2.0以上版本的API结构,用于帮助国内的初学者更好更快的了解这个框架,并为检索官方的API文档提供一些关键词。

官方API文档:https://tensorflow.google.cn/api_docs/python/tf?hl=zh-cn

1. 数据类型

tf中的数据类型为张量:tf.Tensor(),可以类比numpy中的np.array()

一些特殊的张量:

  • tf.Variable:变量。用来存储需要被修改、需要被持久化保存的张量,模型的参数一般都是用变量来存储的。
  • tf.constant:常量,定义后值和维度不可改变。
  • tf.sparse.SparseTensor:稀疏张量。

除上述特殊张量外,其余创建方式同numpy类似,示例:

1
2
3
t = tf.ones([5,3], dtype=tf.float32)
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(a.shape)

与numpy类似,可以对Tensor进行切片、索引;可以对这些Tensor做各种运算,例如:加减乘除、地板除、布尔运算。

2. 架构

  1. 使用tf.data加载数据,高效的数据输入管道也可以极大的减少模型训练时间,管道执行的过程包括:从硬盘中读取数据(Extract)、数据的预处理如数据清洗、格式转换(Transform)、加载到计算设备(Load)
  2. 使用tf.keras构建、训练和验证模型,另外tf.estimator中打包了一些标准的机器学习模型供我们直接使用,当我们不想从头开始训练一个模型时,可以使用TensorFlow Hub模块来进行迁移学习。
  3. 使用tf.distribute.Strategy实现分布式的训练
  4. 使用CheckpointsSavedModel存储模型,前者依赖于创建模型的源代码;而后者与源代码无关,可以用于其他语言编写的模型。

加载数据示例代码:

阅读更多...

Python环境管理

Conda v.s. Pipenv

介绍与安装

Conda可以通过安装Anaconda或者miniconda获取

Pipenv是pip、Pipfile和Virtualenv的结合体

1
2
3
4
5
6
sudo pip install pipenv  # 安装pipenv
pipenv --version
# 进入项目根目录后使用
pipenv install # 这会为当前项目创建一个文件夹,其中包含隔离的python解释器环境和依赖包
pipenv shell # 激活虚拟环境
pipenv run python hello.py # 不显示激活环境,但使用当前项目的虚拟环境执行命令

对比

Conda的设计思路是在全局创建一个虚拟环境,这个虚拟环境被几个环境相似的项目所共用。用户可以在任意位置执行conda activate py27来激活环境。

Pipenv的设计思路是为每一个项目创建独立的python环境。所以如果别的项目想复用之前的环境,需要使用source <venv_path>/bin/activate来激活环境,比较繁琐。

Conda常用于数据处理与分析、深度学习等领域;Pipenv常用于网站开发、应用开发等领域。

Conda好处:

  • conda不仅可以安装python包,还包含了很多非python的包,比如gcc,nodejs,cuda,当需要多个cuda版本时很方便。而Pipenv是基于pip的,只可以安装python包。

Pipenv的好处:

  • 有些python包不支持conda安装,只能使用pip。
  • 通过pipenv install安装生产环境,通过pipenv install --dev安装开发环境。

Docker介绍与使用

1. 为什么需要Docker

没有docker遇到的问题:

  • 依赖复杂:比如系统的其他应用需要python3.7和gcc9,而你的应用需要python2.7和gcc7,你不便把系统改成你要的环境。
  • 迁移环境耗时:上个环境可以正常工作,但更新环境后出现一堆bug,甚至难以进行环境回退。
  • 新开发者加入团队:代码在他的电脑上跑不起来,为新电脑安装环境费时费力。

docker和虚拟机的区别:

img

从图中可以看到,docker比虚拟机更省内存。

阅读更多...

我的神经网络类python代码编程习惯

自定义数据集

自定义数据集至少要重写__init____len____getitem__三个方法,init中定义数据路径,最好能把数据读进内存;len中定义有多少个训练样本;getitem尽量只从内存读,避免读磁盘,若数据太大,可以维持一个固定大小的内存池,偶尔从磁盘读。

若getitem包含运算,则设置num_workers>0,并行读取
torch.backends.cudnn.benchmark = True 开启可以加速卷积神经网络运算。

Dataloader示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from torch.utils.data import Dataloader
from tqdm import tqdm

dataloader = Dataloader(dataset, batchsize=8, shuffle=True)

for i in range(epoch):
with tqdm(total=len(dataloader)) as t:
for idx, (batch_x, batch_y) in enumerate(dataloader):
# pre_y = model(batch_x)
# loss= loss_fn(pre_y, batch_y)
t.set_description(desc="Epoch %i:"%i)
t.set_postfix(steps=idx, loss=loss.data.item())
t.update(1)
# optimizer.zero_grad()
# loss.backward()
# optimizer.step()

其他注意

  1. 代码文件中标注

    1
    __author__ = 'kly'
  2. 配置参数使用argparse,并在运行时打印配置信息,以便日志中保存:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import argparse
    def make_parser():
    parser = argparse.ArgumentParser("train parameter")
    parser.add_argument("-w", "--weight_path", default="./weights", type=str, help="model save path")
    parser.add_argument("--log_path", default="./logs", type=str, help="tensorboard log save path")
    parser.add_argument("--class_nums", default=45, type=int, help="how many classes do you have")
    parser.add_argument("--epoch_nums", default=5, type=int, help="train epoch")
    parser.add_argument("--batch_size", default=16, type=int, help="batch size")
    parser.add_argument("--lr", default=0.0001, type=float, help="init lr")
    parser.add_argument("--tsize", default=256, type=int, help="train img size = tsize * tsize")
    return parser

    # main函数中
    args = make_parser().parse_args()
    print("----------------------------------------------------------------")
    for key in args.__dict__:
    print(key, end=' = ')
    print(args.__dict__[key])
    print("----------------------------------------------------------------")
阅读更多...

国科大选课推荐

遥想自己研一选课的时候也是在知乎看到了不少前辈的选课经验,受益匪浅。

所以趁还有印象,我也推荐一下我上过的课程和一些选课的经验教训。坐标电子学院,计算机视觉方向。

(先写第一学期,下学期上完再补)

阅读更多...

Git快速上手

1. 介绍

Git是最流行的开源版本控制系统,大多数项目都用它来追踪文本文件(代码)的变化。而Github是一个国外的基于Git的代码社交平台,可用于分享代码和团队合作。类似产品国内的有Gitee等。

想必计算机/电子等相关专业的同学或者爱好者都有过从Github下载代码的经历吧。当你想要下载别人代码库中的代码时,使用git clone获取的会比下载zip多一个.git文件,即clone的代码包含版本历史,处于版本管理下,而下载zip方式只会下载当前版本的源代码而不处于版本管理下。因此使用git clone很大的好处是可以方便的通过git pull来更新你本地的代码为远程的最新版本。

如果你还想在别人代码的基础上进行修改和版本控制,最终再发布到类似于Github这样的平台上,那么你需要先点击 fork,然后再使用自己代码仓库的链接 git clone到本地。

img

要在自己的电脑使用Git,你至少需要点这里完成安装:https://git-scm.com/downloads
然后打开git bash,配置git的用户名和邮箱,这个配置非常重要,它会包含在你的每个提交中,以标识在多人合作同一个项目时某个更改是你做的。

1
2
git config --global user.email "konglyv@163.com"
git config --global user.name "Lingyu Kong"

在git clone时,github通常可以选https链接和ssh链接,使用https链接可能会弹窗,需要你输入用户名和密码,使用ssh则不需要,如果想用ssh链接,需要配置ssh,将本机的公钥(例如在C:/用户/用户名/.ssh/id_rsa.pub)粘贴到你的github 设置->ssh/GPG keys中。如果本机没有公钥密钥对,则需要如下命令生成:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

阅读更多...

通知

通知:本博客二月份会正式移到新域名:kppkkp.top

请尽快移步新域名访问

博客打算做一次比较大的修缮。

以往的日记和技术博客相继发表,使得主页和时间线很脏乱,也影响那些只想看技术博客不在意我生活琐事的人的阅读体验。另外打算发的一些算法题的题解也面临这个搞脏时间线的问题。因此,博客将分为三大块:技术博客、算法题打卡、日志动态。实现目标是

  • [x] 主页放三个板块的链接,三个板块有各自的时间线。(更新:四个板块)
  • [x] 标签加入标签词云,重新整理文章的分类和标签
  • [ ] 打卡部分将加入打卡日历元素,
  • [ ] 日志动态加入全局筛选功能。

由于个人能力有限,想法实现可能需要很长时间,希望寒假结束前可以搞定。

另外,近期看过一些极为优秀的技术文章,深感自己很多文章的写作质量不够。以前确实很多博客是当笔记甚至草稿写的,不够认真也没有站在读者的角度考虑,以后会努力提升文章质量的,有看不懂的地方欢迎大家在评论区提问,提问内容会自动发送到我的邮箱,我看到会第一时间回复。

请我喝杯咖啡吧~

支付宝
微信