torch.nn到底是什么?

PyTorch 中神经网络库torch.nn的详细介绍 torch.nn是 PyTorch 深度学习框架中的一个核心模块,它为构建和训练神经网络提供了丰富的类库。通过torch.nn,开发者能够快速构建复杂的深度学习模型,并利用 PyTorch 动态计算图特性进行高效训练和推理。此外,该模块还与torch.optim配合,方便地进行权重优化;以及与DataLoader结合以组织和迭代训练数据。 阅读详情

精简版可参考《torch.nn到底是什么?(精简版)》

PyTorch 提供了设计优雅的模块和类:torch.nn,torch.optim,Dateset 和 DataLoader,以帮助你创建和训练神经网络。为了充分利用它们的功能并且为你的问题定制它们,你需要正真理解它们在做什么。为了逐渐理解,我们首先在 MNIST 数据集上训练基本的神经网络,而不使用这些模块的任何特征。最初只会使用最基本的 PyTorch tensor 功能。然后,我们逐步添加来自 torch.nn,torch.optim,Dataset 和 DataLoader 的一个特征,以显示每一部分的功能,以及它如何使得代码更简洁或灵活。

1、设置MNIST数据

我们将使用经典的 MNIST 数据集,该数据集由手写数字(0-9)的黑白图像组成。

我们将使用 pathlib 来处理路径(Python3标准库的一部分),用 requests 下载数据。只有当我们需要模块的时候才会导入它们,因此你可以清楚地看到正在使用的模块。

from pathlib import Path
import requests

DATA_PATH = Path("data")
PATH = DATA_PATH / "mnist"

PATH.mkdir(parents=True, exist_ok=True)

URL = "http://deeplearning.net/data/mnist/"
FILENAME = "mnist.pkl.gz"

if not (PATH / FILENAME).exists():
        content = requests.get(URL + FILENAME).content
        (PATH / FILENAME).open("wb").write(content)

该数据集的格式为NumPy array,使用 pickle 存储。

import pickle
import gzip

with gzip.open((PATH / FILENAME).as_posix(), "rb") as f:
        ((x_train, y_train), (x_valid, y_valid), _) = pickle.load(f, encoding="latin-1")

每个图片大小为28x28,并存储为长度为784(=28x28)的扁平行。

查看其中的一个图片:

from matplotlib import pyplot
import numpy as np

pyplot.imshow(x_train[0].reshape((28, 28)), cmap="gray")
print(x_train.shape)

输出为:
在这里插入图片描述

(50000, 784)

PyTorch使用 tensor 而不是 NumPy array,所以我们需要将其转换。

import torch

x_train, y_train, x_valid, y_valid = map(
    torch.tensor, (x_train, y_train, x_valid, y_valid)
)
n, c = x_train.shape
x_train, x_train.shape, y_train.min(), y_train.max()
print(x_train, y_train)
print(x_train.shape)
print(y_train.min(), y_train.max())

输出:

tensor([[0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        ...,
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.]]) tensor([5, 0, 4,  ..., 8, 4, 8])
torch.Size([50000, 784])
tensor(0) tensor(9)

2、从头构建神经网络(不使用 torch.nn)

我们首先只使用PyTorch tensor 操作创建一个模型。PyTorch提供了创建随机tensor或零填充tensor的方法,我们将使用这些方法为简单线性模型创建权重(weight)和偏置值(bias)。它们都是普通的tensor,除此之外,我们增加了一点:我们告诉PyTorch它们需要梯度。这将使得PyTorch记录tensor上的所有操作,因此PyTorch可以在反向传播中自动计算梯度。

对于权重,我们在初始化之后设置 requires_grad,因为我们不想在梯度中包含这一步。

#initializing the weights with Xavier initialisation (by multiplying with 1/sqrt(n)).

import math

weights = torch.randn(784, 10) / math.sqrt(784)
weights.requires_grad_()
bias = torch.zeros(10, requires_grad=True)

由于PyTorch可以自动计算梯度,我们可以使用任何标准Python函数(或可调用对象)作为模型。因此我们只编写一个矩阵乘法和广播加法来创建一个简单的线性模型。我们还需要一个激活函数,因此我们将编写 log_softmax 并使用它。记住:虽然PyTorch提供了许多的预先编写好的损失函数、激活函数等,但是你可以使用普通的Python编写自己的函数。PyTorch甚至可以自动为你的函数创建快速GPU或矢量化CPU代码。

def log_softmax(x):
    return x - x.exp().sum(-1).log().unsqueeze(-1)

def model(xb):
    return log_softmax(xb @ weights + bias)

上面的代码中,"@"代表点积操作。我们将会在一批数据(64个图片)上调用我们编写的函数。这是一个前向传播。注意,现阶段我们的预测情况比随机猜测好不到哪里,因为我们是从随机权重开始的。

bs = 64                  # batch size

xb = x_train[0:bs]       # a mini-batch from x
preds = model(xb)        # predictions
preds[0], preds.shape
print(preds[0], preds.shape)

输出:

tensor([-1.7022, -3.0342, -2.4138, -2.6452, -2.7764, -2.0892, -2.2945, -2.5480,
        -2.3732, -1.8915], grad_fn=<SelectBackward>) torch.Size([64, 10])

如你所见,pred tensor不只包含tensor值,还包含一个梯度函数,我们随后将会使用它来来进行反向传播。

我们编写负对数似然函数并将其用作损失函数(我们可以只使用标准的Python实现):

def nll(input, target):
    return -input[range(target.shape[0]), target].mean()

loss_func = nll

查看随机初始化模型的损失,这样我们随后就可以看到在使用了反向传播后,是否改进了模型。

yb = y_train[0:bs]
print(loss_func(preds, yb))

输出:

tensor(2.3783, grad_fn=<NegBackward>)

编写函数计算模型的精确度。对于每一次预测,如果最大值的索引和目标值匹配,则表示预测正确。

def accuracy(out, yb):
    preds = torch.argmax(out, dim=1)
    return (preds == yb).float().mean()

查看随机初始化模型的精确度,因此我们可以观察随着损失的改善,精确度是否提升。

print(accuracy(preds, yb))

输出:

tensor(0.0938)

现在我们可以进行训练。对于每次迭代,将会做以下几件事:

  • 选择一批数据(mini-batch)
  • 使用模型进行预测
  • 计算损失
  • loss.backward() 更新模型的梯度,即权重和偏置

我们现在使用这些梯度来更新权重和偏置。我们将在 torch.no_grad() 中执行,因为
我们不想记录这些操作来进行下一次梯度计算。

我们随后将梯度设置为0,以便为下一次循环做好准备。否则,梯度将会记录所有发生的操作。(也就是说,loss.backward() 将梯度增加到已经存在的值上,而不是替代它)

from IPython.core.debugger import set_trace

lr = 0.5  # learning rate
epochs = 2  # how many epochs to train for

for epoch in range(epochs):
    for i in range((n - 1) // bs + 1):
       #set_trace()
        start_i = i * bs
        end_i = start_i + bs
        xb = x_train[start_i:end_i]
        yb = y_train[start_i:end_i]
        pred = model(xb)
        loss = loss_func(pred, yb)

        loss.backward()
        with torch.no_grad():
            weights -= weights.grad * lr
            bias -= bias.grad * lr
            weights.grad.zero_()
            bias.grad.zero_()

到此,我们已经从头编写并训练了一个小型的神经网络。

print(loss_func(model(xb), yb), accuracy(model(xb), yb))

输出:

tensor(0.0806, grad_fn=<NegBackward>) tensor(1.)

将损失和精确度与前边的比较,发现损失减少,精确度提升。

3、使用 torch.nn.functional

我们现在来重构代码,代码的功能和前边的一样,我们只是利用PyTorch 的 nn 类来使得代码更简洁和灵活。

第一步并且最简单的一步是用 torch.nn.functional(通常导入到命名空间F中)中的函数替代我们手工编写的激活函数和损失函数来缩短代码。该模块包含 torch.nn 库中所有的函数(而库的其他部分还包含类)。除了各种损失函数和激活函数,在还模块中你还可以发现许多用于创建神经网络的方便的函数,如池化函数等。

如果使用了负对数似然损失函数和 log softnax 激活函数,那么Pytorch提供的F.cross_entropy 结合了两者。所以我们甚至可以从我们的模型中移除激活函数。

import torch.nn.functional as F

loss_func = F.cross_entropy

def model(xb):
    return xb @ weights + bias

注意,在 model 函数中我们不再需要调用 log_softmax。让我们确认一下,损失和精确度与前边计算的一样:

print(loss_func(model(xb), yb), accuracy(model(xb), yb))

输出:

tensor(0.0806, grad_fn=<NllLossBackward>) tensor(1.)

4、使用 nn.Module 重构

下一步,我们将使用 nn.Module 和 nn.Parameter,以获得更清晰更简洁的训练循环。我们继承 nn.Module(它本身是一个类并且能够跟踪状态)建立子类。我们想要建立一个包含权重、偏置和前向传播的方法的类。nn.Module 拥有许多我们将会使用的属性和方法(例如:.parameters() 和.zero_grad())。

from torch import nn

class Mnist_Logistic(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(784, 10) / math.sqrt(784))
        self.bias = nn.Parameter(torch.zeros(10))

    def forward(self, xb):
        return xb @ self.weights + self.bias

因为我们现在使用一个对象而不是一个函数,所以我们首先需要实例化我们的模型:

model = Mnist_Logistic()

现在我们可以像之前那样计算损失。注意,nn.Module 对象像是函数一样被使用(即它们能被调用),但在幕后,PyTorch 将自动调用我们的 forward 方法。

print(loss_func(model(xb), yb))

输出:

tensor(2.3558, grad_fn=<NllLossBackward>)

以前对于我们的训练循环,我们需要按名字更新每个参数的值,并且手动将每个参数的梯度归零,像下面这样:

with torch.no_grad():
    weights -= weights.grad * lr
    bias -= bias.grad * lr
    weights.grad.zero_()
    bias.grad.zero_()

现在我们可以利用 model.paremeters() 和 model.zero_grad() 使得这些步骤更简洁,特别是,当我们有一个更复杂的模型时,使得我们更不容忘记某些参数。

with torch.no_grad():
    for p in model.parameters(): p -= p.grad * lr
    model.zero_grad()

我们将训练循环包装到一个 fit 函数中,以便我们以后运行。

def fit():
    for epoch in range(epochs):
        for i in range((n - 1) // bs + 1):
            start_i = i * bs
            end_i = start_i + bs
            xb = x_train[start_i:end_i]
            yb = y_train[start_i:end_i]
            pred = model(xb)
            loss = loss_func(pred, yb)

            loss.backward()
            with torch.no_grad():
                for p in model.parameters():
                    p -= p.grad * lr
                model.zero_grad()

fit()

再次检查损失是否下降

print(loss_func(model(xb), yb))

输出:

tensor(0.0826, grad_fn=<NllLossBackward>)

5、使用 nn.Linear 重构

继续重构代码。我们将会使用PyTorch 的 nn.Linear 类建立一个线性层,以替代手动定义和初始化 self.weights 和 self.bias、计算 xb @ self.weights + self.bias 等工作。PyTorch拥有多中类型预先定义好的层可以帮助我们极大简化代码,并且通常可以使之运行更快。

class Mnist_Logistic(nn.Module):
    def __init__(self):
        super().__init__()
        self.lin = nn.Linear(784, 10)

    def forward(self, xb):
        return self.lin(xb)

我们像之前一样实例化模型并且计算损失

model = Mnist_Logistic()
print(loss_func(model(xb), yb))

输出:

tensor(2.3156, grad_fn=<NllLossBackward>)

我们仍然能够像之前那样使用 fit 方法

fit()

print(loss_func(model(xb), yb))

输出:

tensor(0.0809, grad_fn=<NllLossBackward>)

6、使用 optim 重构

PyTorch还有一个包含各种优化算法的包 torch.optim 。我们可以使用优化器中的 step 方法来执行前向步骤,而不是手动更新参数。

这将使得我们替换之前手动编写的优化步骤:

with torch.no_grad():
    for p in model.parameters(): p -= p.grad * lr
    model.zero_grad()

替换为:

opt.step()
opt.zero_grad() 

optim.zero_grad() 将梯度重置为0,我们需要在计算下一个minibatch的梯度前调用它。

from torch import optim

我们将要定义一个函数来创建模型和优化器,以便将来可以重用它。

def get_model():
    model = Mnist_Logistic()
    return model, optim.SGD(model.parameters(), lr=lr)

model, opt = get_model()
print(loss_func(model(xb), yb))

for epoch in range(epochs):
    for i in range((n - 1) // bs + 1):
        start_i = i * bs
        end_i = start_i + bs
        xb = x_train[start_i:end_i]
        yb = y_train[start_i:end_i]
        pred = model(xb)
        loss = loss_func(pred, yb)

        loss.backward()
        opt.step()
        opt.zero_grad()

print(loss_func(model(xb), yb))

输出:

tensor(2.2861, grad_fn=<NllLossBackward>)
tensor(0.0815, grad_fn=<NllLossBackward>)

7、使用 Dataset 重构

PyTorch 有一个抽象的 Dataset 类。任何具有 __len__(通过Python的标准len函数调用)函数和 __getitem__ 函数的类都可以是一个 Dataset。

Pytorch 的 TensorDataset 是一个包装 tensor 的 Dataset。通过定义长度和索引方式,这也为我们提供了一种沿tensor第一维迭代、索引、切片的方法。这将使我们更容易在我们训练的同一行中访问独立变量和因变量。

from torch.utils.data import TensorDataset

x_train 和y_train 可以组合在一个单独的 TensorDataset 中,这将更容易迭代和切片。

train_ds = TensorDataset(x_train, y_train)

之前,我们必须分别迭代x和y的小批量值:

xb = x_train[start_i:end_i]
yb = y_train[start_i:end_i]

现在,我们可以一起做这两步:

xb,yb = train_ds[i*bs : i*bs+bs]
model, opt = get_model()

for epoch in range(epochs):
    for i in range((n - 1) // bs + 1):
        xb, yb = train_ds[i * bs: i * bs + bs]
        pred = model(xb)
        loss = loss_func(pred, yb)

        loss.backward()
        opt.step()
        opt.zero_grad()

print(loss_func(model(xb), yb))

输出:

tensor(0.0800, grad_fn=<NllLossBackward>)

8、使用 DataLoader 重构

PyTorch 的 DataLoader 负责管理批次。你可以从任何 Dataset 创建 DataLoader。DataLoader 使得迭代批次更简单。DataLoader 自动地提供每个批次,而不必使用train_ds[i*bs : i*bs+bs]。

from torch.utils.data import DataLoader

train_ds = TensorDataset(x_train, y_train)
train_dl = DataLoader(train_ds, batch_size=bs)

之前,我们像下面这样迭代批次:

for i in range((n-1)//bs + 1):
    xb,yb = train_ds[i*bs : i*bs+bs]
    pred = model(xb)

现在,我们的循环更加简洁,因为(xb,yb)可以自动从 DataLoader 自动加载:

for xb,yb in train_dl:
    pred = model(xb)
model, opt = get_model()
for epoch in range(epochs):
    for xb, yb in train_dl:
        pred = model(xb)
        loss = loss_func(pred, yb)

        loss.backward()
        opt.step()
        opt.zero_grad()

print(loss_func(model(xb), yb))

输出:

tensor(0.0821, grad_fn=<NllLossBackward>)

由于PyTorch的 nn.Module、nn.Parameter、Dataset 和 DataLoader,现在我们的训练循环变得更小、更容易理解。现在让我们尝试添加在实践中创建有效模型所需的基本功能。

9、增加验证

在第1部分中,我们只是尝试去设置合理的训练循环以用于我们的训练数据。 实际上,你总是应该有一个验证集,以确定你是否过度拟合。

打乱训练数据对于防止批次与过度拟合之间的相关性非常重要。 另一方面,无论我们是否打乱验证集,验证损失都是相同的。 由于打乱需要额外的时间,因此打乱验证数据是没有意义的。

我们将要使用的验证集的大小是训练集的两倍。这是因为验证集不需要反向传播,因此占用更少的内存(不需要存储梯度)。 我们利用这一点来使用更大的批次大小并更快地计算损失。

train_ds = TensorDataset(x_train, y_train)
train_dl = DataLoader(train_ds, batch_size=bs, shuffle=True)

valid_ds = TensorDataset(x_valid, y_valid)
valid_dl = DataLoader(valid_ds, batch_size=bs * 2)

我们将在每个epoch结束时计算和打印验证损失。(注意,我们总是在训练之前调用model.train(),在推理之前调用 model.eval(),因为这些由诸如 nn.BatchNorm2d 和nn.Dropout 等层使用,以确保这些不同阶段的适当行为。)

model, opt = get_model()

for epoch in range(epochs):
    model.train()
    for xb, yb in train_dl:
        pred = model(xb)
        loss = loss_func(pred, yb)

        loss.backward()
        opt.step()
        opt.zero_grad()

    model.eval()
    with torch.no_grad():
        valid_loss = sum(loss_func(model(xb), yb) for xb, yb in valid_dl)

    print(epoch, valid_loss / len(valid_dl))

输出:

0 tensor(0.2981)
1 tensor(0.3033)

10、创建 fit() 和 get_data()

我们现在将进行一些重构。因为计算训练集和验证集的损失,我们进行了两次相似的处理,让我们将其作为一个 loss_batch 函数来计算每个批次的损失。

我们为训练集传递一个优化器,并使用它来执行反向传播。 对于验证集,我们不传递优化器,因此该方法不执行反向传播。

def loss_batch(model, loss_func, xb, yb, opt=None):
    loss = loss_func(model(xb), yb)

    if opt is not None:
        loss.backward()
        opt.step()
        opt.zero_grad()

    return loss.item(), len(xb)

fit 运行必要的操作来训练我们的模型并计算每个epoch的训练和验证损失。

import numpy as np

def fit(epochs, model, loss_func, opt, train_dl, valid_dl):
    for epoch in range(epochs):
        model.train()
        for xb, yb in train_dl:
            loss_batch(model, loss_func, xb, yb, opt)

        model.eval()
        with torch.no_grad():
            losses, nums = zip(
                *[loss_batch(model, loss_func, xb, yb) for xb, yb in valid_dl]
            )
        val_loss = np.sum(np.multiply(losses, nums)) / np.sum(nums)

        print(epoch, val_loss)

get_data 为训练集合验证集返回 DataLoader。

def get_data(train_ds, valid_ds, bs):
    return (
        DataLoader(train_ds, batch_size=bs, shuffle=True),
        DataLoader(valid_ds, batch_size=bs * 2),
    )

现在,我们获取 DataLoader 和拟合模型的整个过程可以在3行代码中运行:

train_dl, valid_dl = get_data(train_ds, valid_ds, bs)
model, opt = get_model()
fit(epochs, model, loss_func, opt, train_dl, valid_dl)

输出:

0 0.3055081913471222
1 0.31777948439121245

11、总结

我们现在有一个通用数据流水线和训练循环,你可以使用它来训练多种类型PyTorch模型。 各部分的功能总结如下:

  • torch.nn
    • Module:创建一个可调用的对象,其行为类似于一个函数,但也可以包含状态(例如神经网络层权重)。 它知道它包含哪些参数,并且可以将所有梯度归零,循环遍历它们更新权重等。
    • Parameter:tensor 的包装器(wrapper),它告诉 Module 它具有在反向传播期间需要更新的权重。 只更新具有 requires_grad 属性的 tensor。
    • functional:一个模块(通常按惯例导入到F命名空间中),它包含激活函数,损失函数等,以及非状态(non-stateful)版本的层,如卷积层和线性层。
  • torch.optim:包含 SGD 等优化器,可在后向传播步骤中更新 Parameter 的权重。
  • Dataset:带有 __len__ 和 __getitem__ 的对象的抽象接口,包括 PyTorch 提供的类,如TensorDataset。
  • DataLoader:获取任何 Dataset 并创建一个返回批量数据的迭代器。
torch.nn torch.nn是 PyTorch 提供的一个模块化工具集,专为构建和训练神经网络设计。模块化:通过nn.Module基类,用户可以像搭积木一样组合各种层、激活函数和损失函数,构建复杂模型。动态计算图:PyTorch 的动态计算图(eager execution)允许在运行时定义和修改网络结构,适合研究和快速原型开发。灵活性与控制力:用户可以轻松自定义层、损失函数或前向传播逻辑,同时保留对底层张量操作的访问权限。易用性。 阅读详情

相关推荐

Pytorch torch.nn库以及nn与nn.functional有什么区别?

Pytorch torch.nn库以及nn与nn.functional有什么区别?

算法工程师 1084

pytorch深度学习框架—torch.nn模块(一)

torch.nn模块中包括了pytorch中已经准备好的层,方便使用者调用构建的网络。包括了卷积层,池化层,激活函数层,循环层,全连接层。

xiaoxu的博客 4864

torch.nn.functional函数和torch.nn.Module层比较

提供了更方便的接口,适合常规的神经网络层,自动管理参数并简化模型的构建。提供了更底层、更灵活的操作,适合在需要完全控制参数和操作的情况下使用。

qq_27390023的博客 2529

机器学习&&深度学习——torch.nn模块

机器学习&&深度学习——torch.nn模块

m0_52380556的博客 3040

常用torch.nn

常用基础pytorch知识

m0_37737957的博客 1684

原恒星尘埃生长的三维MHD模拟与湍流效应研究

星际尘埃演化是恒星形成过程中的关键环节,其动力学行为直接影响行星系统的构建。通过磁流体力学(MHD)模拟可以揭示尘埃颗粒从微米级到行星胚胎尺度的生长机制,其中湍流效应通过改变碰撞频率和密度结构发挥双重作用。最新研究采用COALA-RAMSES耦合框架,实现了包含自洽尘埃生长的三维非理想MHD模拟,量化了不同物理环境下尘埃尺寸分布的演化规律。这些发现不仅为解释ALMA观测数据提供理论依据,也对行星形成初期条件约束具有重要意义,特别是在湍流参数化与尘埃生长速率关系方面取得突破。

weixin_30988079的博客 382

PyTorch中 torch.nn与torch.nn.functional的区别

torch.nn pytorch中文文档:torch.nn 在__init__()函数里定义,定义的是一个类: torch.nn.functional pytorch中文文档:torch.nn.functional 在__forward()__函数里定义,定义的是一个函数: 两者的区别: nn中是定义的类,以class xx来定义的,可以提取变化的学习参数。nn.functional...

zbzcDZF的博客 6038

手把手教你用STM32F103C8T6单片机,做一个即插即用的USB游戏手柄(附完整代码)

本文详细介绍了如何使用STM32F103C8T6单片机制作即插即用的USB游戏手柄,涵盖硬件搭建、HID协议解析及完整代码实现。通过深入讲解USB HID协议的七大关键描述符,帮助开发者快速掌握嵌入式USB设备开发技巧,打造个性化游戏控制器。

weixin_30887919的博客 439

torch.nn 与 torch.nn.functional的区别?

可以在其基础上定义出自己想要的功能参考博文:【pytorch】torch.nn 与 torch.nn.functional 的区别_torch.nn和torch.nn.function的区别-优快云博客文章浏览阅读554次。今天在看pytorch的代码时,看到了torch.nn 和 torch.nn.functional,然后查了两个模块的官方doc,也没有看明白有啥区别,然后就查了一下资料,这里记录一下,方便以后查阅。_torch.nn和torch.nn.function的区别。

weixin_56054625的博客 1283

基于粒子群算法的PID控制器优化设计

粒子群算法、PID、寻优

qq_46107700的博客 2万+

从原理到代码:拆解UniFormer中动态位置嵌入(DPE)的3D卷积实现

本文深入解析了UniFormer模型中动态位置嵌入(DPE)模块的3D卷积实现原理与代码。DPE通过一个轻量的3D深度可分离卷积,替代传统静态位置编码,使模型能自动学习视频数据的时空位置关系。文章对比了其与Swin Transformer相对位置偏置的优劣,并提供了PyTorch实现代码与高级定制方案,为视频理解任务提供了高效灵活的动态位置编码解决方案。

weixin_29207149的博客 309

torch.nn 与 torch.nn.functional的区别?如何选择?

前言: 在ptorch中,torch.nn和torch.nn.functional模块下包含了许多功能相同、用法相似的方法,比如: 1. torch.nn.Softmax(dim=1)(x) 和torch.nn.functional.softmax(x, dim=1):实现了对x在行维度上进行softmax, 2.torch.nn.Conv2d(3, 6, 5)(x) 和 torch.nn.functional.conv2d(x, weight=torch.rand(6, 3, 5, 5)):实现..

PanYHHH的博客 3265

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

torch.nn.Parameter理解

Pytorch官网对torch.nn.Parameter()的解释: torch.nn.Parameter是继承自torch.Tensor的子类,其主要作用是作为nn.Module中的参数使用。它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,即加入到parameter()这个迭代器中去;而module中非nn.Parameter()得普通te...

Stoneplay 4万+

第三章-python基础语法

有C语言基础应该这样学 Python。

qq_46187594的博客 1175

《网络安全自学教程》- MySQL脱库原理和步骤

MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段

wangyuxiang946的博客 1万+

深入理解 TORCH.NN

原文地址:WHAT IS TORCH.NN REALLY? 本人英语学渣,如有错误请及时指出以便更正 pytorch提供了许多优雅的类和模块帮助我们构建与训练网络,比如 torch.nn, torch.optim,Dataset等。为了充分利用这些模块的功能,灵活操作它们解决各种不同的问题,我们需要更好地理解当我们调用这些模块时它们到底干了些什么,为此,我们首先不调用这些模块实现MNIST手写字...

我的学习笔记 3万+

43、基于机器学习的GNSS信号质量监测方法

本文提出了一种基于支持向量机(SVM)的GNSS信号质量监测方法,旨在有效检测邪恶波形(EWF)威胁并抑制多径干扰对导航精度的影响。通过构建包含现场采集与合成数据的数据集,结合11个相关器测量值、链路预算、仰角和方位角等特征,采用RBF核函数的SVM模型进行分类。研究评估了不同平滑时间窗口对漏检率和误报率的影响,结果表明在约35-40秒平滑时间下性能趋于稳定,并可通过多数投票机制进一步优化检测性能。该方案适用于星载GNSS接收器,在计算资源受限条件下实现了高可靠性与低完整性风险的平衡。

yyy34的博客 188

Pytorch笔记 之 torch.nn 模块简介

参考翻译 [What is torch.nn really?](https://pytorch.org/tutorials/beginner/nn_tutorial.html) 主要是对 PyTorch 框架的各模块进行简要介绍 一定程度上是 PyTorch 的入门笔记 假设已经对神经网络相关基础知识有了一定了解 (或实现过机器学习梯度下降相关代码)

子耶 6万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

torch.nn和torch.nn.functional

torch.nn和torch.nn.functional

asdfg1258963的博客 651

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PyTorch 笔记(16)— torch.nn.Sequential、torch.nn.Linear、torch.nn.RelU

PyTorch 中的 torch.nn 包提供了很多与实现神经网络中的具体功能相关的类,这些类涵盖了深度神经网络模型在搭建和参数优化过程中的常用内容,比如神经网络中的卷积层、池化层、全连接层这类层次构造的方法、防止过拟合的参数归一化方法、Dropout 方法,还有激活函数部分的线性激活函数、非线性激活函数相关的方法,等等。 下面使用 PyTorch 的 torch.nn 包来简化我们之前的代码,开始部分的代码变化不大,如下所示: import torch as t batch_n = 100 input_

wohu1104的专栏 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

torch.nn模块

本文就根据官网文档整理一下torch.nn模块 TORCH.NN非常重要,也是以后用pytorch搭建神经网络的关键模块。所以值得认真学习。 TORCH.NN 第一个关键类: CLASS torch.nn.Parameter A kind of Tensor that is to be considered a module parameter. Parameters are Tensor s...

青山 7162

torch.functional 和torch.nn.functional,torch.nn和torch.nn.functional的区别

torch.functional 和torch.nn.functional,torch.nn和torch.nn.functional的区别

weixin_46088099的博客 1592

Pythorch torch.nn 与 torch.nn.functional的区别

我们知道在torch.nn和torch.nn.functional中有许多类似的激活函数或者损失函数,例如: torch.nn.ReLU 和 torch.nn.functional.relu torch.nn.MSEloss 和 torch.nn.functional.mse_loss 那么他们有什么区别呢? 1.在定义函数层(继承nn.Module)时,init函数中应该用torch.nn,...

xiaohuihui1994的博客 4456

从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系

relu多种实现之间的关系: relu 函数在 pytorch 中总共有 3 次出现: torch.nn.ReLU() torch.nn.functional.relu_() torch.nn.functional.relu_() torch.relu() torch.relu_() 而这3种不同的实现其实是有固定的包装关系,由上至下是由表及里的过程。其中最后一个实际上并不被 pytorc...

weixin_36670529的博客 2343

【pytorch】torch.nn 与 torch.nn.functional 的区别

今天在看pytorch的代码时,看到了torch.nn 和 torch.nn.functional,然后查了两个模块的官方doc,也没有看明白有啥区别,然后就查了一下资料,这里记录一下,方便以后查阅。

梁小憨憨的博客 720
上一篇: tensor属性
下一篇: torch.nn到底是什么?(精简版)
Spring_24
博客等级 码龄12年 46粉丝 41原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值