初始化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 日...