浅析PyTorch中nn.Linear的使用

浅析PyTorch中nn.Linear的使用

介绍

在深度学习中,神经网络是一个重要的概念,神经网络模型通常由多个线性和非线性层构成。然而,在神经网络中,参数调节是一个关键问题。为了解决这个问题,使用反向传播算法来计算误差并调整网络参数是一种常见的方法。

PyTorch是一种基于Torch的开源机器学习库,它具有动态图的优势,可以方便地定义和训练神经网络模型。其中的nn.Linear是一个常用的线性层,本文将介绍如何使用它。

使用nn.Linear

PyTorch中的nn.Linear实现了一个全连接层,即线性变换层。它将输入特征的维度转换为输出特征的维度,并接受自己的权重和偏置向量。具体而言,如果输入具有形状(batch_size, input_size),则输出具有形状(batch_size, output_size)

使用nn.Linear只需要指定输入特征的大小和输出特征的大小即可。例如,下面是一个输入大小为10,输出大小为5的nn.Linear模块:

import torch
import torch.nn as nn

linear = nn.Linear(10, 5)

在从nn.Linear中获取输出时,我们可以将输入数据传递给它,然后它将计算输出,其中包括权重和偏置参数:

input = torch.randn(32, 10)
output = linear(input)

例如,这是一个使用nn.Linear的简单示例:

import torch
import torch.nn as nn

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear = nn.Linear(10, 5)

    def forward(self, x):
        out = self.linear(x)
        return out

model = Model()
input = torch.randn(32, 10)
output = model(input)
print(output.shape) # torch.Size([32, 5])

示例1:使用nn.Linear建立简单线性回归模型

以下是使用nn.Linear建立简单线性回归模型的示例:

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# 首先,创建一些测试数据。
x = torch.linspace(0, 10, 100)
y = x ** 2

# 确定模型和损失函数。
model = nn.Linear(1, 1)
criterion = nn.MSELoss()

# 确定优化器,这里使用随机梯度下降(SGD)。
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)

# 开始训练,迭代10000次。
for i in range(10000):
    # 首先将x和y转换为模型需要的shape。
    x_ts = x.view(-1, 1)
    y_ts = y.view(-1, 1)

    # 将数据传递给模型并计算损失。
    y_pred = model(x_ts)
    loss = criterion(y_pred, y_ts)

    # 清除优化器的梯度然后反向传播并优化模型参数。
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# 将结果可视化。
with torch.no_grad():
    y_pred = model(x.view(-1, 1)).numpy()

plt.plot(x.numpy(), y.numpy(), 'ro', label='Original data')
plt.plot(x.numpy(), y_pred, 'b-', label='Fitted line')
plt.legend()
plt.show()

上面的代码创建了一个简单的线性模型,该模型将x作为输入,将x^2作为输出。在模型训练之后,将结果可视化以显示模型拟合的数据。

示例2:使用nn.Linear建立简单分类模型

以下是使用nn.Linear建立简单二分类模型的示例:

import torch
import torch.nn as nn

# 创建一些测试数据。
X = torch.tensor([
    [0, 0],
    [0, 1],
    [1, 0],
    [1, 1]
], dtype=torch.float)

y = torch.tensor([
    [0],
    [1],
    [1],
    [0]
], dtype=torch.float)

# 创建模型和损失函数。
model = nn.Sequential(
    nn.Linear(2, 2),
    nn.Sigmoid(),
    nn.Linear(2, 1),
    nn.Sigmoid()
)
criterion = nn.BCELoss()

# 创建优化器,这里使用随机梯度下降(SGD)。
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 开始训练,迭代10000次。
for i in range(10000):
    # 将数据传递给模型并计算损失。
    y_pred = model(X)
    loss = criterion(y_pred, y)

    # 清除优化器的梯度然后反向传播并优化模型参数。
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# 测试模型。
with torch.no_grad():
    y_test = model(X)

print(y_test.round())

在此示例中,我们创建了一个简单的二分类模型,将两个输入值作为输入,并输出一个值。在激活函数Sigmoid后,我们输出一个具有sigmoid激活的单个神经元。该模型经过训练可以对输入进行二分类,在最后输出处使用round()函数将输出四舍五入为0或1。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析PyTorch中nn.Linear的使用 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 扩张卷积(dilated convolution)

    最早出现在DeeplLab系列中,作用:可以在不改变特征图尺寸的同时增大感受野,摈弃了pool的做法(丢失信息); 我们设: kernel size = k, dilation rate = d, input size = W1, output size = W2, stride=s, padding=p; Dilation convolution(扩张卷积…

    2023年4月8日
    00
  • 深度学习(卷积神经网络)一些问题总结(转)

        涉及问题: 1.每个图如何卷积:   (1)一个图如何变成几个?   (2)卷积核如何选择? 2.节点之间如何连接? 3.S2-C3如何进行分配? 4.16-120全连接如何连接? 5.最后output输出什么形式? ①各个层解释:    我们先要明确一点:每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种…

    2023年4月7日
    00
  • 转置卷积的详细理解

    图2 同样地,卷积的时候需要对卷积核进行180的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下 图3 这样计算出左上角(即第一行第一列)像素的卷积后像素值。   给出一个更直观的例子,从左到右看,原像素经过卷积由1变成-8。 图4 通过滑动卷积核,就可以得到整张图片的卷积结果, 图5     到了这里,大致可…

    2023年4月8日
    00
  • 序列卷积:线性、周期和圆周

    线性卷积   线性卷积公式为$y(n)=x_1(n) \ast x_2(n)= \sum_{m=-\infty}^{\infty} x_1(m)x_2(n-m) = \sum_{m=-\infty}^{\infty} x_2(m)x_1(n-m)$。   卷积的过程可以理解为其中一个序列关于Y轴翻褶,然后不断移位,同时与另外一个序列进行相乘。   周期卷积 …

    2023年4月8日
    00
  • [学习笔记]子集卷积

    前置知识 FMT:对于两个下标在 \([0,2^n)\) 的数组 \(f\) 和 \(g\),求: \[h_i=\sum_{j\text{ or }k=i}f_jg_k \] 可以做到 \(O(2^nn)\) 限于博主水平,这里不放该前置算法的流程,请自行百度 引入 对于两个下标在 \([0,2^n)\) 的数组 \(f\) 和 \(g\),求: \[h_i…

    卷积神经网络 2023年4月7日
    00
  • 使用pytorch实现论文中的unet网络

    下面是关于使用PyTorch实现论文中的U-Net网络的完整攻略。 U-Net网络的原理 U-Net是一种用于图像分割的卷积神经网络,由Ronneberger等人在2015年提出。U-Net的主要特点是具有对称的U形结构,可以同时进行特征提取和上采样操作,从而实现高效的图像分割。 U-Net的核心思想是将输入图像通过卷积和池化操作逐渐缩小,然后通过反卷积和跳…

    卷积神经网络 2023年5月16日
    00
  • Pytorch-学习记录 卷积操作 cnn output_channel, etc.

      参考资料: pytorch中文文档 http://pytorch-cn.readthedocs.io/zh/latest/

    卷积神经网络 2023年4月7日
    00
  • 怎样理解傅立叶变换和卷积

    傅立叶变换 先看连续和离散系统的公式: \[F(w)=\int^{+\infty}_{-\infty} f(t)e^{-iwt}dt=\int^{+\infty}_{-\infty} f(t)(\cos wt-i\sin wt)dt \tag{1} \] \[F(w)=\sum^{+\infty}_{t=-\infty}f(t)(\cos wt-i\sin …

    卷积神经网络 2023年4月7日
    00
合作推广
合作推广
分享本页
返回顶部