Sparse MLP

本文详细介绍了使用MLPBlock构建的网络结构,将输入图像分割为小patch,通过线性层映射到高维embedding,与ViT等模型类似,展示了如何处理高分辨率图像并生成输出特征。

上图展示了本文网络的整体架构。与ViT、MLP-Mixer和Swin Transformer类似,空间分辨率为H×W的输入图像被分割为不重叠的patch。作者在网络中采用了4×4的patch大小,每个patch被reshape成一个48维的向量,然后由一个线性层映射到一个c维embedding

import torch, os, datetime
from torch import nn


class sMLPBlock(nn.Module):
    def __init__(self, h=224, w=224, c=3):
        super().__init__()
        self.proj_h = nn.Linear(h, h)
        self.proj_w = nn.Linear(w, w)
        self.fuse = nn.Linear(3 * c, c)

    def forward(self, x):
        x_h = self.proj_h(x.permute(0, 1, 3, 2)).permute(0, 1, 3, 2)
        x_w = self.proj_w(x)
        x_id = x
        x_fuse = torch.cat([x_h, x_w, x_id], dim=1)
        out = self.fuse(x_fuse.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
        return out


if __name__ == '__main__':
    input = torch.randn(2, 3, 224, 224)
    smlp = sMLPBlock(h=224, w=224)
    out = smlp(input)
    print(out.shape)

在MindSpore框架中,MLP(多层感知机)是一种典型的全连接神经网络结构,常用于图像分类、文本处理等任务。MindSpore提供了简洁的接口来构建和训练MLP模型,用户可以通过继承`nn.Cell`类并组合多个全连接层来实现MLP。 以下是一个基于FashionMNIST数据集的MLP实现示例,展示如何使用MindSpore构建、训练和评估一个简单的多层感知机模型。 ### 构建MLP模型 首先,定义一个包含两个隐藏层的MLP模型: ```python import mindspore.nn as nn import mindspore.ops as ops class SimpleMLP(nn.Cell): def __init__(self, input_dim=784, hidden_dim=512, num_classes=10): super(SimpleMLP, self).__init__() self.fc1 = nn.Dense(input_dim, hidden_dim) self.fc2 = nn.Dense(hidden_dim, hidden_dim) self.fc3 = nn.Dense(hidden_dim, num_classes) self.relu = nn.ReLU() self.flatten = nn.Flatten() def construct(self, x): x = self.flatten(x) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x ``` ### 数据加载与预处理 使用MindSpore的`dataset`模块加载FashionMNIST数据集,并进行标准化和批处理: ```python from mindspore.dataset import FashionMnistDataset from mindspore.dataset import transforms from mindspore.dataset.vision import c_transforms as vision def create_dataset(data_path, batch_size=32, shuffle=True): dataset = FashionMnistDataset(data_path) dataset = dataset.map(operations=vision.Rescale(1.0 / 255.0, 0), input_columns="image") dataset = dataset.map(operations=transforms.TypeCast(mindspore.float32), input_columns="image") dataset = dataset.map(operations=transforms.TypeCast(mindspore.int32), input_columns="label") if shuffle: dataset = dataset.shuffle(buffer_size=1000) dataset = dataset.batch(batch_size) return dataset ``` ### 模型训练 定义损失函数和优化器,并使用`Model`类进行训练: ```python from mindspore import Model from mindspore.nn import SoftmaxCrossEntropyWithLogits from mindspore.train.callback import ModelCheckpoint, CheckpointConfig def train_mlp(data_path, model, epoch_size=10, batch_size=32, lr=0.001): ds_train = create_dataset(data_path, batch_size=batch_size) loss_fn = SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') optimizer = nn.Adam(model.trainable_params(), learning_rate=lr) model = Model(model, loss_fn=loss_fn, optimizer=optimizer, metrics={'accuracy'}) # 配置模型保存 config_ck = CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10) ckpoint = ModelCheckpoint(prefix="mlp", config=config_ck) model.train(epoch_size, ds_train, callbacks=[ckpoint], dataset_sink_mode=False) ``` ### 模型评估 训练完成后,可以对模型进行评估以查看其性能: ```python def evaluate_mlp(data_path, model): ds_test = create_dataset(data_path, batch_size=32, shuffle=False) model = Model(model) acc = model.eval(ds_test, dataset_sink_mode=False) print(f"Test Accuracy: {acc}") ``` ### 完整流程示例 ```python if __name__ == "__main__": context.set_context(mode=context.GRAPH_MODE, device_target="GPU") net = SimpleMLP() train_mlp("./FashionMNIST", net, epoch_size=10) evaluate_mlp("./FashionMNIST", net) ``` 该示例展示了如何使用MindSpore构建一个简单的MLP模型并进行训练与评估。通过调整网络结构、优化器参数和训练轮数,可以进一步提升模型性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值