Pytorch(二)基本API及使用

2021-10-03 20:39:39 字數 3859 閱讀 2431

初始化tensor,tensor的變換,隨機初始化乙個tensor, 上下文管理器torch.no_grad(),不進行梯度傳播。

乘法中的廣播機制:對於兩個tensor,肯定是維度少的那個是broadcast矩陣。比如最後乙個,比如常見,乙個維度是[10, 3, 4] 的矩陣,乘以乙個[4, 5]的矩陣,其實是後者進行了廣播,[1, 4, 5],對前者,相當於是有10個3x4的矩陣,每個矩陣乘了乙個[4, 5]的矩陣,得到[3,5]的矩陣。

回想tensorflow中的tf.matmul()函式也是廣播的。

>>

>

# vector x vector 一維乘以一維的向量:對應元素相乘再相加,得到標量

>>

> tensor1 = torch.randn(3)

>>

> tensor2 = torch.randn(3)

>>

> torch.matmul(tensor1, tensor2).size(

)torch.size(

)>>

>

# matrix x vector

>>

> tensor1 = torch.randn(3, 4)

>>

> tensor2 = torch.randn(4)

>>

> torch.matmul(tensor1, tensor2).size(

)torch.size(

[3])

>>

>

# batched matrix x broadcasted vector

>>

> tensor1 = torch.randn(10, 3, 4)

>>

> tensor2 = torch.randn(4)

>>

> torch.matmul(tensor1, tensor2).size(

)torch.size(

[10, 3]

)>>

>

# batched matrix x batched matrix

>>

> tensor1 = torch.randn(10, 3, 4)

>>

> tensor2 = torch.randn(10, 4, 5)

>>

> torch.matmul(tensor1, tensor2).size(

)torch.size(

[10, 3, 5]

)>>

>

# batched matrix x broadcasted matrix

>>

> tensor1 = torch.randn(10, 3, 4)

>>

> tensor2 = torch.randn(4, 5)

>>

> torch.matmul(tensor1, tensor2).size(

)torch.size(

[10, 3, 5]

)

torch.squeeze()torch.unsqueenze()的用法:

squeeze的用法主要就是對資料的維度進行壓縮或者解壓。

先看torch.squeeze() 這個函式主要對資料的維度進行壓縮,去掉維數為1的的維度,比如是一行或者一列這種,乙個一行三列(1,3)的數去掉第乙個維數為一的維度之後就變成(3)行。squeeze(a)就是將a中所有為1的維度刪掉。不為1的維度沒有影響。a.squeeze(n) 就是去掉a中指定的維數為一的維度。還有一種形式就是b=torch.squeeze(a,n) a中去掉指定的定的維數為一的維度。

再看torch.unsqueeze()這個函式主要是對資料維度進行擴充。給指定位置加上維數為一的維度,比如原本有個三行的資料(3),在0的位置加了一維就變成一行三列(1,3)。a.squeeze(n) 就是在a中指定位置n加上乙個維數為1的維度。還有一種形式就是b=torch.squeeze(a,n) a就是在a中指定位置n加上乙個維數為1的維度

這個包主要包括了神經網路的各個層的實現

把torch.nn包轉化為函式

優化器,都在這個包裡。在初始化乙個優化器的時候需要傳入需要訓練的引數。並且所有的optimizer都實現了乙個step()方法來更新引數。

optimizer還有乙個引數是clousure,用來重新計算梯度。

乙個官方的例子:

# -*- coding: utf-8 -*-

import torch

import random

class

dynamicnet

(torch.nn.module)

:def

__init__

(self, d_in, h, d_out)

:super

(dynamicnet, self)

.__init__(

) self.input_linear = torch.nn.linear(d_in, h)

self.middle_linear = torch.nn.linear(h, h)

self.out_linear = torch.nn.linear(h, d_out)

defforward

(self, x)

-> torch.tensor:

h_relu = self.input_linear(x)

.clamp(

min=0)

# 每次迭代時加入的不定層數的relu後,學習速率變慢了

for _ in

range

(random.randint(0,

3)):

h_relu = self.middle_linear(h_relu)

y_pred = self.out_linear(h_relu)

return y_pred

n, d_in, h, d_out =64,

1000

,100,10

x = torch.randn(n, d_in)

y = torch.randn(n, d_out)

learning_rate =1e-

4model = dynamicnet(d_in, h, d_out)

criterion = torch.nn.mseloss(reduction=

'sum'

)optimizer = torch.optim.sgd(model.parameters(

), lr=learning_rate)

for t in

range

(500):

# forward pass

y_pred = model(x)

loss = criterion(y_pred, y)

if t %

100==0:

print

(t, loss.item())

# zero gradient, backward, update weights

optimizer.zero_grad(

)# backward是為了計算梯度,在計算梯度之前清空optimizer存放的上一步的梯度

loss.backward(

) optimizer.step(

)

PyTorch基本用法 二 Variable

本文主要是pytorch中variable變數的一些用法。import torch from torch.autograd import variable tensor torch.floattensor 1,2 3,4 定義variable,requires grad用來指定是否需要計算梯度 va...

vector容器介紹及基本API

今天給大家帶來的是一種stl容器,類似陣列的一種c 容器 vector。進入主題 什麼是vector?vector是一種單口的容器,vector所指的內容是一片連續的空間,支援隨機訪問 random access 此外,vector容器的空間是動態增長的。vector功能基本如圖1 1所示 圖1 1...

CentOS使用記錄(二) Nginx的基本使用

nginx 是一款輕量級 高效能的 web 伺服器,反向 伺服器 yum install nginx配置檔案 etc nginx nginx.confuser root worker processes 1 cpu數量 error log var log nginx error.log warn 日...