Vision MLP系列–MLP-Mixer: An all-MLP Architecture for Vision

MLP-Mixer是ViT团队的另一个纯MLP架构的尝试。如果MLP-Mixer重新引领CV领域主流架构的话,那么CV领域主流架构的演变过程就是MLP->CNN->Transformer->MLP? 要回到最初的起点了吗???( Transformer移除了注意力以后就剩MLP了)

这篇论文提出了一种”纯“MLP结构的视觉架构。

先将输入图片拆分成patches,然后通过Per-patch Fully-connected将每个patch转换成feature embedding,然后送入N个Mixer Layer,最后通过Fully-connected进行分类。

Mixer分为channel-mixing MLP和token-mixing MLP两类。channel-mixing MLP允许不同通道之间进行交流;token-mixing MLP允许不同空间位置(tokens)进行交流。这两种类型的layer是交替堆叠的,方便支持两个输入维度的交流。每个MLP由两层fully-connected和一个GELU构成。

从上图我们可以看出,MLP -Mixer 首先使用图片分成很多个小正方形的patch,每个patch的大小定义为patch_size。论文中实现这一步骤使用的是前面提到的卷积,卷积核的大小和步长均patch_size。论文中给的参数,也是2的幂。
网络不再使用传统的RELU激活函数,而是使用了GELU激活函数。

将图片分成小块后,在将它转换为一维结构。如图:

在这里插入图片描述

然后将每一个patch进行转换,如下图所示:

在这里插入图片描述

通过这样一种方式呢,就将一张图片转换为了一个大矩阵,就可以输入到Mixer Layer 中进行计算。

MLP 是两个全连接层的感知机,W1,W2,对应token_mixer中两个全连接的权重,W3,W4则表示channel_mixer两个全连接的权重。σ表示GELU激活函数。那么公示就很简单了,输入X经过Layer Normalize,再乘以W1,再经过激活函数后乘以W2,再加上X。第二个公式也是相同的计算过程。
将前面通过编码得到的矩阵经过Layer Norm 在将矩阵进行旋转(T 表示旋转)连接MLP1,MLP1 就是文章token_mixer 用来寻找像素与像素之间的关系,其中,MLP1中的权值共享。计算完之后,再将矩阵旋转回来,通过Layer Norm 后再接一个channel_mixer 用于寻找通道与通道之间的关系。其中MixerLayer 还启用了ResNet中的跨连结构,跨连结构的作用可以参考[ResNet原理讲解和复现],看到这里,是不是感觉它跟卷积的原理很类似。
从上图可以看出Mixer Layer的输入维度和输出维度相同,并且通过MLP的方式来寻找图片像素与像素,通道与通道的关系。
这就是MLP-MIXER的网络结构了

实现的难点在于,矩阵旋转,我们使用einops中的Rearrange实现矩阵旋转

使用Rearrange 实现旋转

Rearrange(‘b n d -> b d n’) #这里是[batch_size, num_patch, dim] -> [batch_size, dim, num_patch]

#定义多层感知机
import torch
import numpy as np
from torch import nn
from einops.layers.torch import Rearrange
from torchsummary import summary
import torch.nn.functional as F

class FeedForward(nn.Module):
    def __init__(self,dim,hidden_dim,dropout=0.):
        super().__init__()
        self.net=nn.Sequential(
            #由此可以看出 FeedForward 的输入和输出维度是一致的
            nn.Linear(dim,hidden_dim),
            #激活函数
            nn.GELU(),
            #防止过拟合
            nn.Dropout(dropout),
            #重复上述过程
            nn.Linear(hidden_dim,dim),

            nn.Dropout(dropout)
        )
    def forward(self,x):
        x=self.net(x)
        return x


class MixerBlock(nn.Module):
    def __init__(self,dim,num_patch,token_dim,channel_dim,dropout=0.):
        super().__init__()
        self.token_mixer=nn.Sequential(
            nn.LayerNorm(dim),
            Rearrange('b n d -> b d n'),   #这里是[batch_size, num_patch, dim] -> [batch_size, dim, num_patch]
            FeedForward(num_patch,token_dim,dropout),
            Rearrange('b d n -> b n d')    #[batch_size, dim, num_patch] -> [batch_size, num_patch, dim]

         )
        self.channel_mixer=nn.Sequential(
            nn.LayerNorm(dim),
            FeedForward(dim,channel_dim,dropout)
        )
    def forward(self,x):

        x=x+self.token_mixer(x)

        x=x+self.channel_mixer(x)

        return x

class MLPMixer(nn.Module):
    def __init__(self,in_channels,dim,num_classes,patch_size,image_size,depth,token_dim,channel_dim,dropout=0.):
        super().__init__()
        assert image_size%patch_size==0
        self.num_patches=(image_size//patch_size)**2
        #embedding 操作,用卷积来分成一小块一小块的
        self.to_embedding=nn.Sequential(nn.Conv2d(in_channels=in_channels,out_channels=dim,kernel_size=patch_size,stride=patch_size),
            Rearrange('b c h w -> b (h w) c')
        )
        #经过Mixer Layer 的次数
        self.mixer_blocks=nn.ModuleList([])
        for _ in range(depth):
            self.mixer_blocks.append(MixerBlock(dim,self.num_patches,token_dim,channel_dim,dropout))
        self.layer_normal=nn.LayerNorm(dim)

        self.mlp_head=nn.Sequential(
            nn.Linear(dim,num_classes)
        )
    def forward(self,x):
        x=self.to_embedding(x)
        for mixer_block in self.mixer_blocks:
            x=mixer_block(x)
        x=self.layer_normal(x)
        x=x.mean(dim=1)

        x=self.mlp_head(x)

        return x

MLP-Mixer用Mixer的MLP来替代ViT的Transformer,减少了特征提取的自由度,并且巧妙的可以交替进行patch间信息交流和patch内信息交流,从结果上来看,纯MLP貌似也是可行的,而且省去了Transformer复杂的结构,变的更加简洁,有点期待后续ViT和MLP-Mixer如何针锋相对的,感觉大组就是东挖一个西挖一个的,又把尘封多年的MLP给挖出来了

Patches Are All You Need?

———– ConvMixer 网络

论文地址:https://openreview.net/pdf?id=TVHS5Y4dNvM
Github 地址:https://github.com/tmp-iclr/convmixer

ConvMixer is now integrated into the timm framework itself. You can see the PR here.

Conv Mixer 这篇文章提出的初衷是想去弄清楚,ViT系列模型表现优越,到底是图片分块的功劳 还是网络中Attention的功劳。于是作者就根据深度可分离卷积,在ViT 和 MLP Mixer 的启发中 设计了Conv Mixer。并且在表现上超越了一些ViT (某些ViT结构),MLP Mixer 和 ResNet。文章本身并没去追求模型的速度,和表现能力。

在这里插入图片描述
网络结构

网络结构详解:

1、 Patch embedding

这里的Patch embedding实际上是使用一个卷积层 实现的

nn.Conv2d(3,dim,kernel_size=patch_size,stride=patch_size)

其中 kernel_size 就是patch的大小

2、GELU激活函数(高斯误差线性单元)

这个是最近很多模型都在用的函数(dert、高斯误差线性单元激活函数在最近的 Transformer 模型)GELUs正是在激活中引入了随机正则的思想,是一种对神经元输入的概率描述,直观上更符合自然的认识,同时实验效果要比Relus与ELUs都要好。

GELUs其实是 dropout、zoneout、Relus的综合,GELUs对于输入乘以一个0,1组成的mask,而该mask的生成则是依概率随机的依赖于输入。假设输入为X, mask为m,则m服从一个伯努利分布(Φ ( x ) \Phi(x)Φ(x), Φ ( x ) = P ( X < = x ) , X 服 从 标 准 正 太 分 布 \Phi(x)=P(X<=x), X服从标准正太分布Φ(x)=P(X<=x),X服从标准正太分布),这么选择是因为神经元的输入趋向于正太分布,这么设定使得当输入x减小的时候,输入会有一个更高的概率被dropout掉,这样的激活变换就会随机依赖于输入了。

看得出来,这就是某些函数(比如双曲正切函数 tanh)与近似数值的组合。没什么过多可说的。有意思的是这个函数的图形:

GELU 激活函数。

可以看出,当 x 大于 0 时,输出为 x;但 x=0 到 x=1 的区间除外,这时曲线更偏向于 y 轴。

优点:

  • 似乎是 NLP 领域的当前最佳;尤其在 Transformer 模型中表现最好;
  • 能避免梯度消失问题。

3、ConvMixerLayer

class ConvMixerLayer(nn.Module):
    def __init__(self,dim,kernel_size = 9):
        super().__init__()
        #残差结构
        self.Resnet =  nn.Sequential(
            nn.Conv2d(dim,dim,kernel_size=kernel_size,groups=dim,padding='same'),
            nn.GELU(),
            nn.BatchNorm2d(dim)
        )
        #逐点卷积
        self.Conv_1x1 = nn.Sequential(
            nn.Conv2d(dim,dim,kernel_size=1),
            nn.GELU(),
            nn.BatchNorm2d(dim)
        )
    def forward(self,x):
        x = x +self.Resnet(x)
        x = self.Conv_1x1(x)
        return 

在ConvMixer Layer 中, 使用了深度可分离卷积,GELU 激活函数,逐点卷积。
论文中将图中红色部 称为 “channel wise mixing” 蓝色部分称为 “spatial mixing”
论文得到的结论是当深度可分离卷积部分的卷积核越大,模型的性能越好。文章中的使用的是9×9的卷积核,因为卷积核越大表现越好

文章最后也认为,ViT 表现如此优越 是因为patch embedding (图片分块)的原因。
作者认为 patch embedding 操作就能完成神经网络的所有下采样过程,降低了图片的分辨率,增加了感受野,更容易找到远处的空间信息。从而模型表现良好

论文阅读——合集(持续更新)

文献链接

图像分类(Classification)

目标检测(Object Detection)

语义分割(Semantic Segmentation)

实例分割(Instance Segmentation)

关键点检测(Keypoint Detection)

自然语言处理

Others

Pytorch Image Models –timm快速使用

原文:Getting Started with PyTorch Image Models (timm): A Practitioner’s Guide – 2022.02.02

中文教程: https://www.aiuai.cn/aifarm1967.html

Github: rwightman/pytorch-image-models

PyTorch Image Models(timm) 是一个优秀的图像分类 Python 库,其包含了大量的图像模型(Image Models)、Optimizers、Schedulers、Augmentations 等等.里面提供了许多计算机视觉的SOTA模型,可以当作是torchvision的扩充版本,并且里面的模型在准确度上也较高。

timm 提供了参考的 training 和 validation 脚本,用于复现在 ImageNet 上的训练结果;以及更多的 官方文档 和 timmdocs project.

timm的安装

关于timm的安装,我们可以选择以下两种方式进行:

  1. 通过pip安装
pip install timm
  1. 通过git与pip进行安装
git clone https://github.com/rwightman/pytorch-image-models
cd pytorch-image-models && pip install -e .

如何查看预训练模型种类

  1. 查看timm提供的预训练模型 截止到2022.3.27日为止,timm提供的预训练模型已经达到了592个,我们可以通过timm.list_models()方法查看timm提供的预训练模型(注:本章测试代码均是在jupyter notebook上进行)
import timm
avail_pretrained_models = timm.list_models(pretrained=True)
len(avail_pretrained_models)
  1. 查看特定模型的所有种类 每一种系列可能对应着不同方案的模型,比如Resnet系列就包括了ResNet18,50,101等模型,我们可以在timm.list_models()传入想查询的模型名称(模糊查询),比如我们想查询densenet系列的所有模型。
all_densnet_models = timm.list_models("*densenet*")
all_densnet_models

我们发现以列表的形式返回了所有densenet系列的所有模型。

['densenet121',
 'densenet121d',
 'densenet161',
 'densenet169',
 'densenet201',
 'densenet264',
 'densenet264d_iabn',
 'densenetblur121d',
 'tv_densenet121']
  1. 查看模型的具体参数 当我们想查看下模型的具体参数的时候,我们可以通过访问模型的default_cfg属性来进行查看,具体操作如下
model = timm.create_model('resnet34',num_classes=10,pretrained=True)
model.default_cfg
{'url': 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet34-43635321.pth',
 'num_classes': 1000,
 'input_size': (3, 224, 224),
 'pool_size': (7, 7),
 'crop_pct': 0.875,
 'interpolation': 'bilinear',
 'mean': (0.485, 0.456, 0.406),
 'std': (0.229, 0.224, 0.225),
 'first_conv': 'conv1',
 'classifier': 'fc',
 'architecture': 'resnet34'}

除此之外,我们可以通过访问这个链接 查看提供的预训练模型的准确度等信息。

使用和修改预训练模型

在得到我们想要使用的预训练模型后,我们可以通过timm.create_model()的方法来进行模型的创建,我们可以通过传入参数pretrained=True,来使用预训练模型。同样的,我们也可以使用跟torchvision里面的模型一样的方法查看模型的参数,类型/

import timm
import torch

model = timm.create_model('resnet34',pretrained=True)
x = torch.randn(1,3,224,224)
output = model(x)
output.shape
torch.Size([1, 1000])
  • 查看某一层模型参数(以第一层卷积为例)
model = timm.create_model('resnet34',pretrained=True)
list(dict(model.named_children())['conv1'].parameters())
[Parameter containing:
 tensor([[[[-2.9398e-02, -3.6421e-02, -2.8832e-02,  ..., -1.8349e-02,
            -6.9210e-03,  1.2127e-02],
           [-3.6199e-02, -6.0810e-02, -5.3891e-02,  ..., -4.2744e-02,
            -7.3169e-03, -1.1834e-02],
            ...
           [ 8.4563e-03, -1.7099e-02, -1.2176e-03,  ...,  7.0081e-02,
             2.9756e-02, -4.1400e-03]]]], requires_grad=True)]
            
  • 修改模型(将1000类改为10类输出)
model = timm.create_model('resnet34',num_classes=10,pretrained=True)
x = torch.randn(1,3,224,224)
output = model(x)
output.shape
torch.Size([1, 10])
  • 改变输入通道数(比如我们传入的图片是单通道的,但是模型需要的是三通道图片) 我们可以通过添加in_chans=1来改变
model = timm.create_model('resnet34',num_classes=10,pretrained=True,in_chans=1)
x = torch.randn(1,1,224,224)
output = model(x)

模型的保存

timm库所创建的模型是torch.model的子类,我们可以直接使用torch库中内置的模型参数保存和加载的方法,具体操作如下方代码所示

torch.save(model.state_dict(),'./checkpoint/timm_model.pth')
model.load_state_dict(torch.load('./checkpoint/timm_model.pth'))

使用示例

# replace
# optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# with
optimizer = timm.optim.AdamP(model.parameters(), lr=0.01)

for epoch in num_epochs:
    for batch in training_dataloader:
        inputs, targets = batch
        outputs = model(inputs)
        loss = loss_function(outputs, targets)

        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
        
        
#
optimizer = timm.optim.Adahessian(model.parameters(), lr=0.01)

is_second_order = (
    hasattr(optimizer, "is_second_order") and optimizer.is_second_order
)  # True

for epoch in num_epochs:
    for batch in training_dataloader:
        inputs, targets = batch
        outputs = model(inputs)
        loss = loss_function(outputs, targets)

        loss.backward(create_graph=second_order)
        optimizer.step()
        optimizer.zero_grad()

CVPR 2022 | 重新审视池化:你的感受野不是最理想的

作者丨简单来源丨CV技术指南

本文提出了一种简单而有效的动态优化池操作( Dynamically Optimized Pooling operation),称为DynOPool,它通过学习每一层感受野的最佳大小和形状来优化特征映射的端到端比例因子。

前言

本文提出了一种简单而有效的动态优化池操作( Dynamically Optimized Pooling operation),称为DynOPool,它通过学习每一层感受野的最佳大小和形状来优化特征映射的端到端比例因子。深度神经网络中任何类型的调整大小模块都可以用DynOPool操作以最小的成本替换。此外,DynOPool通过引入一个限制计算成本的附加损失项来控制模型的复杂性。

Pooling Revisited: Your Receptive Field is Suboptima

论文:https://arxiv.org/abs/2205.15254

公众号后台回复“DynOPool”获取论文PDF

背景

尽管深度神经网络在计算机视觉、自然语言处理、机器人、生物信息学等各种应用中取得了前所未有的成功,但最优网络结构的设计仍然是一个具有挑战性的问题。而感受野的大小和形状决定了网络如何聚集本地信息,并对模型的整体性能产生显著影响。神经网络中的许多组成部分,例如用于卷积和池化运算的内核大小和步长,都会影响感受野的配置。然而,它们仍然依赖于超参数,现有模型的感受野会导致形状和大小不理想

本文通过介绍固定大小和形状的传统感受野是次优的问题,讨论了DynOPool如何通过CIFAR-100上的VGG-16玩具实验解决这个问题。

固定大小和形状的传统感受野存在的问题:

1.不对称分布的信息

最佳感受野形状会根据数据集中固有的空间信息不对称性而改变。而大多数情况下固有的不对称性是不可测量的。此外,通常用于预处理的输入大小调整有时也会导致信息不对称。在人工设计的网络中,图像的长宽比经常被调整以满足模型的输入规格。然而,这种网络中的感受野不是用来处理操作的。

为了验证所提出的方法,作者在CIFAR-stretch-V上进行实验,如图1(a)所示,相较于人工设计模型,形状通过DynOPool动态优化的特征映射通过在水平方向上提取更具有价值的信息提高性能。

图片

图1  用来自CIFAR-100的三个不同的合成数据集进行玩具实验:(a)随机裁剪垂直拉伸的图像 (b)在4×4网格中平铺缩小的图像 (c)放大缩小的图像。

2.密集分布或稀疏分布信息

局部性是设计最优模型的组成部分。CNN通过级联的方式聚合局部信息来学习图像的复杂表示。而局部信息的重要性很大程度上取决于每个图像的属性。例如,当一个图像被模糊化时,大多数有意义的微观模式,如物体的纹理,都会被抹去。在这种情况下,最好在早期层中扩展感受野,集中于全局信息。另一方面,如果一幅图像在局部细节中包含大量类特定的信息,例如纹理,则识别局部信息将会更加重要。

为了验证假设,作者构建了CIFAR-100数据集的两个变体,CIFAR-tile和CIFAR-large,如图1(b)和(c)所示。作者模型在很大程度上优于人工设计的模型。

贡献

为了缓解人工构建的体系结构和操作的次优性,作者提出了动态优化池操作(DynOPool),这是一个可学习的调整大小模块,可以替代标准的调整大小操作。该模块为在数据集上学习的操作找到感受野的最佳比例因子,从而将网络中的中间特征图调整为适当的大小和形状。

论文的主要贡献:

1、解决了深度神经网络中现有尺度算子依赖于预定超参数的局限性。指出了在中间特征图中寻找最佳空间分辨率和感受野的重要性。

2、提出了一个可学习的调整尺寸大小的模块DynOPool,它可以找到中间特征图的最佳比例因子和感受域。DynOPool使用学习到的比例因子识别某一层的最佳分辨率和感受野,并将信息传播到后续层,从而在整个网络中实现规模优化。

3、证明了在图像分类和语义分割任务中,使用DynOPool的模型在多个数据集和网络架构上优于基线算法。它还显示了精度和计算成本之间的理想权衡。

方法

1.动态优化池(DynOPool)

图片

图2 DynOPool中的调整大小模块

模块通过优化一对输入和输出特征映射之间的比例因子r来优化查询点q的位置以及获得中间特征映射的最佳分辨率。DynOPool在不影响其他算子的情况下,自适应控制较深层接收域的大小和形状。

图片

图3 DynOPool整个的优化过程

针对比例因子r梯度不稳定,会产生梯度爆炸导致训练过程中分辨率发生显著变化的问题,使用a重新参数化r如下:

图片

2.模型复杂性约束

为了最大化模型的精度,DynOPool有时会有较大的比例因子,增加了中间特征图的分辨率。因此,为了约束计算代价,减少模型规模,引入了一个额外的损失项LGMACs,它由每次训练迭代t的分层GMACs计数的简单加权和给出,如下所示:

图片

实验

图片

表1 人工设计模型与使用DynOPool模型的精度(%)和GMACs比较

图片

图4 在VGG-16上使用人工设计的Shape Adaptor与使用DynOPool的训练模型可视化

图片

表2 在CIFAR-100数据集上DynOPool和Shape Adaptor的比较

图片

表3 在ImageNet数据集上EfficientNet-B0+DynOPool的性能

图片

表4 基于PascalVOC的HRNet-W48语义分割结果

结论

作者提出了一种简单而有效的动态优化池操作(DynOPool),它通过学习每个层中感受野的理想大小和形状来优化端到端的特征映射的比例因子,调整中间特征图的大小和形状,有效提取局部细节信息,从而优化模型的整体性能;

DynOPool还通过引入一个额外的损失项来限制计算成本,从而控制模型的复杂性。实验表明,在多个数据集上,该模型在图像分类和语义分割方面均优于基线网络。

NVIDIA训练深度学习模型加速:APEX库

最近在跑目标检测和图像分类模型,发现很多时候教程里需要 安装apex库,于是我就去网上搜索一下这个,发现apex大有来头;

官方:

https://nvidia.github.io/apex/amp.html

https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html

APEX 是来自英伟达 (NVIDIA) 的一个很好用的深度学习加速库。由英伟达开源,完美支持PyTorch框架,用于改变数据格式来减小模型显存占用的工具。其中最有价值的是 amp (Automatic Mixed Precision) ,将模型的大部分操作都用 Float16 数据类型测试,一些特别操作仍然使用 Float32。并且用户仅仅通过三行代码即可完美将自己的训练代码迁移到该模型。实验证明,使用 Float16 作为大部分操作的数据类型,并没有降低参数,在一些实验中,反而由于可以增大 Batch size,带来精度上的提升,以及训练速度上的提升。

使用理由

使用精度低于32位浮点的数值格式有许多好处。首先,它们需要更少的内存,从而能够训练和部署更大的神经网络。其次,它们需要较少的内存带宽,从而加快数据传输操作。第三,数学运算在降低精度方面运行得更快,特别是在具有TensorCore支持的GPU上。混合精度训练(Mixed Precision Training)实现了所有这些好处,同时确保与完全精度训练相比,不会丢失特定任务的准确性。它这样做的方法是识别需要完全精度的步骤,只对这些步骤使用32位浮点,而在其他地方使用16位浮点。

在PyTorch中的使用:
首先需要安装其apex库(我还没装过),其github地址:https://github.com/NVIDIA/apex。
然后在训练的脚本(代码)中简单添加几句就可以了

from apex import amp

amp.init()
amp.init_trainer(trainer)
with amp.scale_loss(loss, trainer) as scaled_loss:
   autograd.backward(scaled_loss) 

APEX的配置

前提是你安装好了CUDA和CUDNN,以及你的系统是Ubuntu系统。

git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" 

Apex 还通过以下方式支持仅 Python 构建 (Pytorch 0.4 需要)。

pip install -v --disable-pip-version-check --no-cache-dir ./

安装之后,clone下来的apex文件夹就可以删除了。

查看能否正确导入apex:

from apex import amp

IEEE论文投稿流程

摘自 BeyondSelf

这是一篇节省你翻论坛、查资料的文章。

我将把每一步尽量写的清楚,能够让新手按照这篇文章进行完整的投稿

即使你从未投过稿,完全不了解IEEE的投稿流程,希望按照这篇文章,能够帮助你流畅无误的投稿

这是针对本科生和低年级研究生,对投稿流程还不清楚,或者在初次投稿时可以参考的文章。

(零)预备:账号注册

这一步是为了注册ORCID和IEEE的账号,已经有账号的可以忽略不看

对于IEEE的不同杂志,是由不同的投稿账号的,这一点需要注意

1.注册ORCID,ORCID类似于你的身份证号码,即使你的名字改变,但是号码是不变的。

(1)进入orcid官网ORCID​orcid.org/

(2)选择右上方的SIGN IN/REGISTER

(3)依次填入所需的信息

2.注册IEEE账号

(1)进入IEEE查文献的主页https://ieeexplore.ieee.org/Xplore/home.jsp​ieeexplore.ieee.org/Xplore/home.jsp

(2)搜索期刊名字,会展示如下画面,这里以IEEE Transactions on communications 举例:

点击你想要投稿的期刊

(3)找到Submit Manusript,这个选项几乎所有的期刊都有。

(4)点击创建账户

(5)点击Associate your existing ORCID id

(6)在弹出页面中点击授权

(7)依次填入姓名和邮箱,只填必须项即可

之后就是输入地址和密码,按实际情况填写即可

(一)论文写作

1.下载模板

IEEE的期刊都会给一个模板,但是不同期刊会共用同一套模板。下载模板的网址为:https://journals.ieeeauthorcenter.ieee.org/create-your-ieee-journal-article/authoring-tools-and-templates/tools-for-ieee-authors/ieee-article-templates/​journals.ieeeauthorcenter.ieee.org/create-your-ieee-journal-article/authoring-tools-and-templates/tools-for-ieee-authors/ieee-article-templates/

IEEE Article Templates – IEEE Author Center JournalsIEEE Article Templates – IEEE Author Center Journals​journals.ieeeauthorcenter.ieee.org/create-your-ieee-journal-article/authoring-tools-and-templates/tools-for-ieee-authors/ieee-article-templates/

(0)点击 IEEE Template Selector 进入模板下载页面

(1)首先会让选择要写的文章类型,给了三个选项:

如果写常规的文章的话,就选第一个,包含trans和letter。会议的话,就选第三个。Magazine一般是指总结或者科普类的文章,影响因子高,但是一般你的第一篇文章,导师不会让你写这个。

(2)其次选择期刊的名字

这里直接输入即可,如“IEEE Transactions on Communications”.

(3)之后会依次选择文章的类型和格式,这里可供选择的格式有Latex和Word,首选Latex,一方面是因为格式好调,另一方面是因为敲公式快一些

(4)下载好模板之后,就可以开始写作了

2.论文写作准备

有了模板之后,还需要知道该期刊对于文章的要求,比如说页数,单栏还是双栏。这里不同期刊的要求不一样,对于新手来说,由于网页的设置,找到它并不容易。我这里来详细介绍下。

(1)进入IEEE查文献的主页https://ieeexplore.ieee.org/Xplore/home.jsp​ieeexplore.ieee.org/Xplore/home.jsp

(2)搜索期刊名字,会展示如下画面,这里以IEEE Transactions on communications 举例:

点击你想要投稿的期刊

(3)找到Submit Manusript,这个选项几乎所有的期刊都有。

(4)点进去之后,发现左下角有一个Journal Home,点击

(5)在上述网页中,找到你想要投稿的期刊(当然,你也可以跳过上述步骤,直接进入到这里~之所以要经过这些步骤,是因为接下来会用到其中一些步骤)

在出现的页面中,会有submission guidelines:

这里就说明,此期刊提交的时候要求单栏,12号字,不超过30页

这里教大家一个小技巧,如果整个网页页面太长的话,直接按Ctrl+F 搜索column关键词,因为所有的期刊都会要求单栏还是双栏,所以主要要求就在这个附近

(6)在第(4)步中,如果页面的右边已经有guidelines,那么就不需要再进入journal home了

对TPAMI杂志来说,直接点击红线所示,就可以得到文章要求,双栏,不超过12页

对于IEEE trans系列的杂志,基本上模板都是差不多的,如果在官网上找不到,也可以直接百度搜索一个模板

(二)论文投稿

在得到模板以及文章的要求之后,就可以开始论文写作了。当然,如果在上述步骤中找不到期刊的具体要求也没事,可以先写,一些格式问题可以之后再说,在文章正式发表前,编辑还会进行修改。这里假设你的论文已经写完,开始进入投稿环节

1.进入想要投稿期刊的主页,点击submit mannusript

2. 这里会要求你登入账号,一般是用导师的账号或者自己注册。投稿的账号一般就是通信作者

3.登录成功后,点击Author

4.点击Start New Submission中的Begin Submission,会出现如下信息

依次填入文章的类型、上传文件、作者等相关信息,就可以完成整篇文章的上传。这里以IEEE transactions on communications 举例,展示提交的流程

Step 1:

(1)首先选择类型,一般的话,就选常规的

(2)然后输入题目和摘要

Step 2:上传文件,一般是上传PDF

Step 3:输入关键字,下拉列表找到最贴合论文的,点击添加

Step 4:输入作者信息,与论文保持一致

Step 5 :选择审稿人,如果没有想选的话,可以跳过

Step 6 :是一些与文章相关的细节,可以按文章情况填写。

Step 7 :检查环节,确认无误后就可以正式提交了

注:邮箱是最重要的联系方式,之后会通过邮件联系你,请及时查看,而且对于修改等是有截止日期的。

(三)等待

论文会首先分配编辑,然后分配审稿人。可能会给你返回的状态有:Reject,Reject(Resubmission Allowed),Major,Minor,Accept

1.Reject并且不允许重投的话,说明就凉了

2.Reject且允许重投的话,也还凑合,重投的话可能被接受

3.Major大修,一般Major的话,如果修改没问题的话,大概率被接收

4.Minor小修,这样子的话基本也没问题

5.Accept是最好的,但不会刚投稿就这样,起码得有个minor,都得为难你一下

(四)接收后

当文章被接收后,编辑会给你发一个邮件,让你填一些内容,大概是著作权之类的。这些就按照要求来即可

之后会有一个校对环节,你需要在编辑给你发送的PDF上修改,而不能再重新提交PDF。此时的文章状态一般是Early Access,如果没有挂arxiv的话,在这个阶段,你就可以搜到自己的文章,并且也可以被引用了。再过一段时间,状态就会更新为Publish,就说明正式发表了。

IEEE 会议模板介绍

IEEE会议模板中提供了latex格式要求。

模板下载

一般在所投期刊和会议的官网上都会给出投稿模板或者给出投稿模板的链接。以IEEE的会议模板页面为例

我们可以在页面中下载自己想要的模板。一般分为LATEX版本和Microsoft Word版本,为了适应大部分读者朋友,本文我们以Microsoft Word版的A4为例进行讲解(A4和美国信纸的版本主要在于纸张大小和页边距不同,一般选用A4版)。点击链接可以下载模板打开之后如下:

可以看到,模板中已经有很多内容了。主要为对模板的介绍,示例以及一些注意事项。我一般是将自己的内容复制进去再用格式刷刷一遍来保证排版正确。下面我们开始介绍一下各部分的注意事项。

title

标题除了要使用样式表中的“title”之外,需要注意是不能使用副标题的。此外不可以使用符号,特殊字符,脚注或数学元素。

除非不可避免,不要在title中使用缩写。

如果uses可以准确替代using,则u大写,否则小写。

Author

模板可以有(但不限于)六位作者。所有的会议文章至少要有一位作者。作者名称从左到右列出,然后到下一行。作者序列将在以后的引用和索引服务中使用。

对于作者超过六名的论文:水平添加作者姓名。如果作者超过八名,请写到第三行。
对于作者少于六个的论文按以下步骤调整:

  • 选择:强调所有的作者和隶属行
  • 更改列数:从工具栏中选择列图标,然后选择正确的列数
  • 删除:删除多余作者的作者和隶属行

对于作者信息的书写,第一行是姓名,第二三行是组织名称,第四行是城市和国家,第五行是email或ORCID。请确保组织隶属关系尽可能简洁(例如,不要在同一组织的部门之间进行区分)。

Abstract

不可以使用符号,特殊字符,脚注或数学。

Keywords

无明确要求,一般写5个左右。

Heading

除非不可避免,不要在heading中使用缩写。

在混入式标题中,例如摘要需要用斜体区分标题和文本。

包含两种component heads 和text heads.

component heads包括Acknowledgments 和References ,使用Heading 5样式。

text heads按照关系、层级组织。有“Heading 1”,“Heading 2”,“Heading 3”和“Heading 4”的样式。

Text

分离文本和图形文件。只在段落末尾使用一个回车。不要在任何位置使用用任何分页。不要给文本标题加上数字,这些由模板来做。

缩写

即使在摘要中已经定义了缩写和首字母缩写,也要在正文首次使用时进行定义。不必定义诸如IEEE,SI,MKS,CGS,sc,dc和rms之类的缩写。

单位

使用SI(MKS)或CGS作为主要单位(鼓励使用SI单位)。英语单位可在括号中标注作为辅助单位。使用英文单位作为交易中的标识符除外,如“3.5英寸磁盘驱动器”。

避免同时使用SI和CGS单位,如以安培为单位的电流和以奥斯特为单位的磁场。如果必须使用混合单位,请说明方程中使用的每个数量的单位。

不要混用单位的完整拼写和缩写:“Wb/m2”或“webers per square meter”是正确的的,但“webers/m2”是错误的。当文本中出现单位时,将它们拼写出来:“. . . a few henries”,而非“. . . a few H”。

小数点之前的零不要省略:“0.25”而不是“.25”。使用“cm3”,而不是“cc”。

公式

请确定公式使用的是Times New Roman或者Symbol字体。要创建多级公式,可以将公式做成图形,然后将其插入文本中。

对公式使用连续编号。括号内的方程式编号右对齐。为了使用公式更紧凑,可以使用“/”,exp函数或者适当的指数。数量或变量使用 Italicize Roman symbols,而不是 Greek symbols。使用长破折号而不是连字符来表示减号。当公式是句子的一部分时,记得使用逗号或句号。

注意,公式是使用中心制表符来居中的。要确保在公式之前或之后立即定义公式中的符号。使用“(1)“,而不是“Eq. (1)”或“equation (1)”。除非是在句子开头时,使用“Equation (1) is”的描述。

图要放在列的顶部或者底部,避免将它们放在列的中间。大图可以跨越两列。在文本中引入后将其插入。即使在句子开头,也要使用缩写“Fig. 1”。

图的标签要使用8号Times New Roman字体,编写标签时使用单词而不是符号或缩写。如果在标签中包含单位,请在括号内标注。不要仅用单位标注轴。不要以数量和单位的比例标记轴。

图的标题放在图的下方,使用figure caption样式。

建议使用文本框插入图,此方法比直接插入图片更稳定。将文本框的颜色和相同安排选择为无填充和无线条。

表要放在列的顶部或者底部,避免将它们放在列的中间。大表可以跨越两列。在文本中引入后将其插入。

表的标题放在表的上方,使用table head样式。

如需使用脚注请用字母。

脚注

在上标中分别编号。将实际脚注放在引用该脚注的列的底部。

在这里插入图片描述

ACKNOWLEDGMENT

在美式英语中acknowledgment中g后没有e。赞助致谢请放在第一页无编号脚注中。

REFERENCES

在方括号[1]中连续编号参考文献。句子标点在方括号之后。使用“in [3]”而不是“Ref. [3]” 或者“reference [3]”,除非在句子开头可用“Reference [3] was the first …”

不要放置脚注。

除非有六位以上的作者,否则给出所有作者的名字,不要使用et al.。尚未发表的论文,即使已经提交发表,也应该引用为“unpublished”。已被接收发表的论文应引用为“in press”。出专有名词和元素符号外,仅将论文标题中的第一个单词大写。

对于在翻译期刊上发表的论文,请先给出英文引文,然后再给出外语原文。

最后要做的

模板用于撰写和格式化论文。在提交之前,请确保从文件中删除了所有模板文本,否则将会导致论文无法发表。

如何写好一篇科研论文之会议期刊了解

对于刚入手论文的小白来说,如何了解所在领域的期刊会议有哪些,截至投稿日期以及往年发布的论文等信息是十分重要的。下面 以IEEE为例子:

1、打开ieee网站: https://ieeexplore.ieee.org/

2、选择browse中的不同内容

3、筛选自己要找的会议、期刊

5、主页由相关的会议官网

可以选择某年的发表文章,or 搜索 content关键字,找到去年发布的文章列表

6、这部分是我们比较感兴趣的部分,在这里下载模板

7、在作者工具中可以找到论文模板和写作注意事项

一个问题:IEEE投稿时,如何使用“IEEE Reference Preparation Assistant”?

如何生成IEEE参考文献格式?

https://www.bilibili.com/video/BV1Pr4y1F79D/