tensor

Pytorch:CUDA Semantics(语义)

北城余情 提交于 2020-02-08 10:14:43
CUDA Semantics 文章大部分内容来自 PyTorch-CUDA Semantics ,如若侵权请联系本人进行删除,本文仅用作个人学习之用,不做他用,转载请注明出处。 基本介绍 pytorch提供 torch.cuda 来创建和运行CUDA操作。 torch.cuda 会一直跟踪当前选中的GPU,所有分配的CUDA tensors都会默认在该GPU上创建分配内存空间。但是,仍然可以通过 torch.cuda.device 来改变选中的GPU(即去选择另外一个GPU)。 一旦一个tensor被分配了空间,则可以操作这个tensor,而不需要管选中了哪个GPU(根据我的理解是:这个Tensor创建的时候已经指定了在哪个GPU上创建,所以之后并不需要再关心)。在这个tensor上的相关计算后的结果仍会保存在该tensor所在的GPU的存储空间中。 默认情况下,跨GPU的运算操作是不被允许的,除了 copy_() 、 to() 、 cuda() 等涉及存储拷贝的函数。除非启用了点对点存储访问(peer-to-peer memory access),否则任何尝试在不同的GPU上执行相关计算的操作都会引发错误。 代码示例: cuda = torch . device ( 'cuda' ) # 默认的CUDA设备 cuda0 = torch . device ( 'cuda:0' )

pytorch中tensor的基本维度变换

旧巷老猫 提交于 2020-02-08 04:44:58
直接从代码中学习tensor的一些维度变换操作: import torch torch . manual_seed ( 2020 ) x = torch . rand ( 1 , 2 , 3 ) print ( x ) # tensor([[[0.4869, 0.1052, 0.5883], # [0.1161, 0.4949, 0.2824]]]) print ( x . view ( - 1 , 3 ) . size ( ) ) # torch.Size([2, 3]) print ( '\ntranspose:' ) print ( torch . transpose ( x , 0 , 1 ) ) print ( x . transpose ( 0 , 1 ) . size ( ) ) # torch.Size([2, 1, 3]) print ( x . transpose ( 1 , 2 ) . size ( ) ) # torch.Size([1, 3, 2]) # transpose要指明待交换的维度 print ( '\ntorch.cat:' ) y = torch . rand ( 1 , 1 , 3 ) print ( torch . cat ( ( x , y ) , dim = 1 ) . size ( ) ) # torch.Size([1, 3, 3

Caffe之layer_factory

↘锁芯ラ 提交于 2020-02-07 19:28:31
之前在测试NN中各个层的时间的时候,遇到一个非常奇怪的问题,分别使用Caffe自己的gpu方法和cuDNN方法,在卷积上性能差异非常大,但是在pooling层上基本没有变化。抽空检查了代码之后,发现是layer_factory模式导致的问题。下面就以下几个方面来进行 1.工厂模式 2.layer_factory详解 3.layer_factory中坑 4.问题影响分析 1.工厂模式 工厂模式是设计模式中的一种,面向的业务大概是在编码时不能预见需要创建那种类的实例,系统不依赖产品类如何被创建、组合和表达的细节,工厂模式的弊端是扩展比较少的项目中比较合适。 工厂模式有三种角色: 工厂类角色:根据逻辑产生具体的产品 抽象产品角色:具体产品的父类,一把由Java中的接口或者C++中的抽象类来实现 具体产品角色:产品实例 2.layer_factory详解 众所周知,Caffe1.0版本中,目前有三大类算子:CPU版本、Caffe自己实现的CUDA版本的和CuDNN版本的。layer_factory文件负责组装Caffe中算子,工厂模式的意思就是根据用户的设置,在执行时,选择相应版本的算子进行。 以下参考至http://zhuanlan.zhihu.com/hacker-and-painter/20456649 layer_factory.hpp是layer_factory的头文件 /**

TensorFlow 编程基础

女生的网名这么多〃 提交于 2020-02-05 23:48:54
• TensorFlow ™ 是一个开放源代码软件库,用于进行高性能数值计算 • 借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台 (CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边 缘设备等) • TensorFlow™ 最初是由 Google Brain 团队(隶属于 Google 的 AI 部门)中的研究人员和工程师开发的,可为机器学习和深度学习提供 强力支持 TensorFlow 的Hello world: 计算图: TensorFlow = Tensor + Flow Tensor 张量 数据结构:多维数组 Flow 流 计算模型:张量之间通过计算而转换的过程 TensorFlow是一个通过 计算图的形式表述计算的编程系统 每一个计算都是计算图上的一个节点 节点之间的边描述了计算之间的关系 计算图是一个有向图,由以下内容构成:   • 一组节点,每个 节点都代表一个 操作,是一种 运算   • 一组有向边,每条 边代表节点之间的 关系( 数据传递和 控制依赖 ) 计算图(数据流图)的概念 TensorFlow有两种边:   • 常规边(实线):代表数据依赖关系。一个节点的运算输出成   为另一个节点的输入,两个节点之间有tensor流动( 值传递)   • 特殊边(虚线):不携带值,表示两个节点之间的 控制相关性。   比如, happens-

pytorch中激活函数ReLU

拜拜、爱过 提交于 2020-02-05 07:31:59
nn.ReLU(inplace=True) Parameters inplace – can optionally do the operation in-place. Default: False ReLU(x)=max(0,x) 参数inplace=True: inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出 注: 产生的计算结果不会有影响。利用in-place=True计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间。但是会对原变量覆盖,只要不带来错误就用。 m = nn . ReLU ( ) n = nn . ReLU ( inplace = True ) input = autograd . Variable ( torch . randn ( 5 ) ) inputTemp = input print ( input ) print ( m ( input ) ) print ( input , '\n' ) print ( inputTemp ) print ( n ( inputTemp ) ) print ( inputTemp ) #运行结果 tensor ( [ 0.2750 , - 0.1387 , - 0.6451 , - 0.8800 , 0.4505 ] ) tensor ( [ 0.2750 , 0

二月四号博客

余生长醉 提交于 2020-02-05 00:54:53
今天是学习深度学习的第二天 1,大概了解了一遍TensorFlow的框架   TensorFlow的整体结构-数据流图(图,会话),图,会话,张量,变量,操作以及Tensor board的可视化 2,图的相关操作   默认图:tf.get_default_graph()(调用方法) .graph(查看属性)   自定义图:new_graph = tf.Graph()(创建图) with new_graph.as_default(): (定义数据和操作) 3,张量 Tensor   标量  一个数字  0阶张量   向量  一维数组 [2,3,4]  1阶张量   矩阵  二维数组 [[2,3,4],[2,3,4]]  二阶张量   。。。。。   张量  n维数组  n阶张量   创建张量的方法:a_new = tf.constant([4,9,10], dtype=ft.int32)           tensor = tf.placeholder(dtype=tf.float32, shape=[None, 10])      张量的转换:tensor.set_shape(shape)( 改变原始的 tensor)         tf.reshape(tensor, shape)( 不会改变原始的 tensor 返回新的改变形状后的 tensor 动态创建新张量时

pytorch --- tensor.squeeze(dim)和unsqueeze(dim)

爷,独闯天下 提交于 2020-02-01 01:38:02
tensor.squeeze(dim) 作用 : 如果dim指定的维度的值为1,则将该维度删除,若指定的维度值不为1,则返回原来的tensor 例子: x = torch . rand ( 2 , 1 , 3 ) print ( x ) print ( x . squeeze ( 1 ) ) print ( x . squeeze ( 2 ) ) 输出: tensor([[[0.7031, 0.7173, 0.0606]], [[0.6884, 0.4072, 0.0516]]]) tensor([[0.7031, 0.7173, 0.0606], [0.6884, 0.4072, 0.0516]]) tensor([[[0.7031, 0.7173, 0.0606]], [[0.6884, 0.4072, 0.0516]]]) 如上结果所示:x.shape=[2, 1, 3] , 第一维度的值为1, 因此x.squeeze(dim=1)的输出会将第一维度去掉,其输出shape=[2,3], 第二维度值不为1, 因此x.squeeze(dim=2)输出tensor的shape不变 tensor.unsqueeze(dim) 这个函数主要是对数据维度进行扩充。给指定位置加上维数为1的维度,比如原本有个三行的数据(3,),在0的位置加了一维就变成一行三列(1,3)。还有一种形式就是b

tf.GradientTape详解

ぃ、小莉子 提交于 2020-01-31 20:39:20
参考文献:https://blog.csdn.net/guanxs/article/details/102471843 在TensorFlow 1.x静态图时代,我们知道每个静态图都有两部分,一部分是前向图,另一部分是反向图。反向图就是用来计算梯度的,用在整个训练过程中。而TensorFlow 2.0默认是eager模式,每行代码顺序执行,没有了构建图的过程(也取消了control_dependency的用法)。但也不能每行都计算一下梯度吧?计算量太大,也没必要。因此,需要一个 上下文管理器 (context manager)来连接需要 计算梯度 的函数和变量,方便求解同时也提升效率。 举个例子:计算y=x^2在x = 3时的导数: x = tf.constant(3.0) with tf.GradientTape() as g: g.watch(x) y = x * x dy_dx = g.gradient(y, x) # y’ = 2*x = 2*3 = 6 例子中的watch函数把需要计算梯度的变量x加进来了。GradientTape默认只监控由tf.Variable创建的traiable=True属性(默认)的变量。上面例子中的x是constant,因此计算梯度需要增加g.watch(x)函数。当然,也可以设置不自动监控可训练变量,完全由自己指定,设置watch

通过torch.empty来看pytorch的broadcast机制

放肆的年华 提交于 2020-01-31 02:14:53
示例一:可以进行相加的tensor from __future__ import print_function import torch # 找不到torch模块是因为对应的解释器中没有torch模块 # File-Settings-grammer_learning-Project Interpreter:进行更换即可 x = torch . empty ( ( 6 , 1 , 2 ) ) z = torch . empty ( ( 1 , 2 , 2 ) ) c = x + z print ( c ) print ( x ) y = torch . empty ( 2 , 3 ) print ( y ) 输出结果如下: D:\Anaconda3\envs\pytorch_1.4_python_3.6_CUDA_10.1\python.exe E:/【Developer】/python/deeplearning_programs/grammar_learning/test/env_validate.py tensor ( [ [ [ 0.0000e+00, 0.0000e+00 ] , [ 0.0000e+00, 0.0000e+00 ] ] , [ [ 0.0000e+00, 0.0000e+00 ] , [ 0.0000e+00, 0.0000e+00 ] ] , [ [ 0

Numpy operator for multiple outer products

末鹿安然 提交于 2020-01-30 06:10:05
问题 import numpy as np mat1 = np.random.rand(2,3) mat2 = np.random.rand(2,5) I wish to get a 2x3x5 tensor, where each layer is the 3x5 outer product achieved by multiplying 3x1 transposed row of mat1 by 1x5 row of mat2. Can it be done with numpy matmul? 回答1: You can simply use broadcasting after extending their dimensions with np.newaxis/None - mat1[...,None]*mat2[:,None] This would be the most performant, as there's no sum-reduction needed here to warrant services from np.einsum or np.matmul .