PyTorch——线性层及其他层介绍(6)


线性层

前面1,1,1是你想要的,后面我们不知道这个值是多少,取-1让Python自己计算


import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader

# 加载CIFAR-10测试数据集并转换为Tensor格式
dataset = torchvision.datasets.CIFAR10("./data", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)

# 创建数据加载器,每批次包含64个样本
dataloader = DataLoader(dataset, batch_size=64)

# 定义神经网络模型TY
class TY(nn.Module):
    def __init__(self):
        super(TY, self).__init__()
        # 定义全连接层:输入维度196608,输出维度10(对应10个类别)
        self.Linear1 = Linear(196608, 10)

    def forward(self, input):
        # 前向传播:将输入数据通过全连接层
        output = self.Linear1(input)
        return output

# 实例化模型
ty = TY()

# 遍历数据加载器中的每个批次
for data in dataloader:
    # 获取图像数据和对应的标签
    imgs, target = data
    # 打印原始图像张量形状:[批次大小, 通道数, 高度, 宽度]
    print(imgs.shape)
    
    # 将图像张量展平为一维向量
    # 注意:此处reshape参数(1,1,1,-1)会导致维度错误,正确应为(-1, 196608)
    output = torch.reshape(imgs, (1, 1, 1, -1))
    # 打印展平后的张量形状
    print(output.shape)
    
    # 将展平后的数据输入模型
    output = ty(output)
    # 打印模型输出形状:[批次大小, 类别数]
    print(output.shape)


另一种表达  flatten展平

import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("./data",train=False,transform=torchvision.transforms.ToTensor(),
                                       download=True)

dataloader = DataLoader(dataset,batch_size=64)

class TY(nn.Module):
    def __init__(self):
        super(TY,self).__init__()
        self.Linear1 = Linear(196608,10)

    def forward(self,input):
        output = self.Linear1(input)
        return output

ty = TY()

for data in dataloader:
    imgs,target = data
    print(imgs.shape)
    output=torch.flatten(imgs)
    print(output.shape)
    output = ty(output)
    print(output.shape)

### PyTorch 线性层实现与用法 #### 定义线性层PyTorch 中,`torch.nn.Linear` 是最常用的线性层之一。该类实现了标准的线性变换 \( y = Ax + b \),其中 \( A \) 表示权重矩阵,\( b \) 表示偏置向量[^2]。 ```python import torch from torch import nn linear_layer = nn.Linear(in_features=784, out_features=256) ``` 这段代码创建了一个具有 784 输入特征和 256 输出特征的线性层实例。这适用于将图像(例如 MNIST 数据集中的 28x28 像素灰度图)展平成一维张量后的场景[^1]。 #### 初始化参数 线性层内部有两个可训练参数:权重 `weight` 和偏置 `bias`。默认情况下,这些参数会被随机初始化。然而,在某些特定应用中可能需要自定义初始化方式: ```python nn.init.xavier_uniform_(linear_layer.weight) nn.init.zeros_(linear_layer.bias) ``` 这里展示了如何利用 Xavier 均匀分布初始化权重以及零值初始化偏置项的方法[^3]。 #### 应用线性变换 一旦定义好了线性层及其初始状态,就可以将其应用于输入数据上执行前向传播操作了。假设有一个形状为 `(batch_size, input_dim)` 的批量样本,则可以通过如下方式进行计算: ```python input_tensor = torch.randn(32, 784) # 创建一个假定批次大小为32的数据点集合 output_tensor = linear_layer(input_tensor) print(output_tensor.shape) # 打印输出张量尺寸应为 (32, 256) ``` 此部分说明了当给定一批次维度为 `[batch_size, in_features]` 的输入时,经过线性层处理后得到的新表示形式将会拥有 `[batch_size, out_features]` 这样的结构[^4]。 #### 组合使用非线性激活函数 为了赋予模型更强的表现力,通常会在每一个线性映射之后紧跟一个非线性的激活函数。比如 ReLU 函数可以被用来引入非线性因素从而打破线性约束: ```python activation_function = nn.ReLU() activated_output = activation_function(linear_layer(input_tensor)) ``` 上述代码片段展示了一种常见的做法——在线性层后面加上一ReLU作为激活函数来增强表达能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值