提示:菜鸟入门日记,若总结有错误,各路大佬多多指教!
…菜鸟刚接触touch信号处理,困惑多多。诚交做触觉或信号处理的朋友,一同交流 摆烂 ~
拼接:特征尺寸大小相同,在特征通道数上扩展,拼接结果为特征尺寸不变,通道数相加;如一个64×64×3的特征层与64×64×6的特征层拼接,结果为64×64×9的特征层。拼接的方式保留了更多的维度/位置 信息,这使得后面的 layer 可以在浅层特征与深层特征自由选择。
相加:指通道数相同,特征对应位置相加。如两个64×64×3的特征层相加,结果就是每层通道的对应位置相加,结果仍为一个64×64×3的特征层。相加的方式,feature map 的维度没有变化,但每个维度都包含了更多特征,对于普通的分类任务这种不需要从 feature map 复原到原始分辨率的任务来说,这是一个高效的选择。
如果希望通过设置随机数种子,在gpu或cpu上固定每一次的训练结果,则需要在程序执行的开始处添加以下代码(示例):
'''设置随机数种子'''
def setup_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
torch.backends.cudnn.deterministic = True
setup_seed(20) # 设置随机数种子
'''数据预处理...'''
大概可分为4个模块吧,实现CIFAR10分类,详见示例
import torch
import torchvision
from torch.utils.tensorboard import SummaryWriter
from torch import nn
import numpy as np
import random
from torch.utils.data import DataLoader
'''定义数据'''
def load_data():
train_data = torchvision.datasets.CIFAR10(root="../data", train=True, transform=torchvision.transforms.ToTensor(),
download=True)
test_data = torchvision.datasets.CIFAR10(root="../data", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
return train_data, test_data
def main():
'''设置随机数种子 使训练结果可复现'''
def setup_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
torch.backends.cudnn.deterministic = True
setup_seed(20)
# 指定训练设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
'''1、数据预处理模块'''
# 获得数据及长度信息
train_data, test_data = load_data()
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))
# 利用 DataLoader 来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)
'''2、模型构建模块'''
# 创建网络模型,也可单独构建网络文件,实例化即可
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.model = nn.Sequential(
nn.Conv2d(3, 32, 5, 1, 2),
nn.MaxPool2d(2),
nn.Conv2d(32, 32, 5, 1, 2),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 5, 1, 2),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(64 * 4 * 4, 64),
nn.Linear(64, 10)
)
def forward(self, x):
x = self.model(x)
return x
# 实例化模型并指定运行设备
model = Model()
model = model.to(device)
'''3、定义损失函数等'''
# 损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)
# 优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 记录训练的次数
total_train_step = 0
# 记录测试的次数
total_test_step = 0
# 训练的轮数
epoch = 10
# 添加tensorboard
writer = SummaryWriter("../logs_train")
''' 4.构建训练过程 '''
for i in range(epoch):
print("-------第 {} 轮训练开始-------".format(i + 1))
# train
model.train()
for data in train_dataloader:
imgs, targets = data
imgs = imgs.to(device)
targets = targets.to(device)
outputs = model(imgs)
loss = loss_fn(outputs, targets)
# 优化器优化模型
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_train_step = total_train_step + 1
if total_train_step % 100 == 0:
print("训练次数:{}, Loss: {}".format(total_train_step, loss.item()))
writer.add_scalar("train_loss", loss.item(), total_train_step)
# validation
model.eval()
total_test_loss = 0
total_accuracy = 0
with torch.no_grad():
for data in test_dataloader:
imgs, targets = data
imgs = imgs.to(device)
targets = targets.to(device)
outputs = model(imgs)
loss = loss_fn(outputs, targets)
total_test_loss = total_test_loss + loss.item()
accuracy = (outputs.argmax(1) == targets).sum()
total_accuracy = total_accuracy + accuracy
print("整体测试集上的Loss: {}".format(total_test_loss))
print("整体测试集上的正确率: {}".format(total_accuracy / test_data_size))
writer.add_scalar("test_loss", total_test_loss, total_test_step)
writer.add_scalar("test_accuracy", total_accuracy / test_data_size, total_test_step)
total_test_step = total_test_step + 1
torch.save(model, "model{}.pth".format(i))
print("模型已保存")
writer.close()
if __name__ == "__main__":
main()
pytorch提取参数及自定义初始化
面对有时提取出的层结构并不够,还需要对里面的参数进行初始化的问题,本文简单介绍了如何提取出网络的参数并对其初始化。
pytorch常用代码合集
PyTorch常用代码段合集,涵盖基本配置、张量处理、模型定义与操作、数据处理、模型训练与测试等5个方面,还给出了多个值得注意的Tips,内容非常全面。
torchvision.transforms处理模块用法详解
简单介绍了transforms模块的用法,有实例介绍和代码实现。
深度学习中15种损失函数详解
详细介绍了深度学习中的各种损失函数的优点和局限性。
神经网络训练不收敛或训练失败的原因总结
文章分别从数据方面和模型方面分析了导致模型训练不收敛或失败的原因,数据方面总结了四种可能的原因,模型方面总结了九种可能的问题。除此之外,还介绍了每种潜在问题的产生后果或现象,并提供了常规做法。
数据增强方法总结
本文介绍了数据增强的作用,数据增强的分类,数据增强的常用方法,一些特殊的方法,如Cutout,Random Erasing,Mixup,Hide-and-Seek,CutMix,GridMask,FenceMask和KeepAugment等方法,还介绍了一些基于多样本的增强方法,如SMOTE, mosaic和SamplePairing。
神经网络超参数的调参方法总结
从实践的角度,手把手教你如何对神经网络超参数进行调参。本文涉及的调参目标有:学习率、Batch Size、网络深度与宽度、Epochs、L1、L2正则化与平衡系数、Dropout、激活函数
科研工具大合集
作为一个平时就很辛苦的科研er,本着能用工具解决的问题绝对不花苦力的原则,收集了很多科研利器,现在分享给大家,相信大家看完以后科研效率都能够得到质的提升!
欢迎补充~
①极市平台(公众号):专注计算机视觉前沿咨询和技术干货 【吹爆!更新速率远超我的蜗牛进度,上有顶级论文实时解读!下有基础干货普照平民】
②机器之心(公众号):专业的人工智能媒体和产业服务 【看看新的技术产品和一些AI界八卦】
③AI科技评论(公众号)
④跟李沐学AI(bilibili)【沐神版high level课程、论文解读、机器学习深度学习课程】
⑤霹雳吧啦Wz(bilibili)【可以说,懂我者,霹雳老师也;把知识点化繁为简,易懂易上手】
⑥CV技术指南(公众号)【技术总结】
本code虫串山楂技术已出神入化,110串,坐等挑战
无尽江湖:http://t.cn/A6PLFX50
召唤神龙:http://t.cn/A6xgjIKF
交换冰淇淋:http://t.cn/A6JvzNbk
水果大王:http://t.cn/A6VaWJv7
苹果的诱惑:http://t.cn/A6hDZLMR
串山楂:http://t.cn/A6MkRZ8U
我的停车场:http://t.cn/A6MkRZ8G
暴力厨房:http://t.cn/A6xD8SIZ
女皇登基:http://t.cn/A6xjfCb3
龟龟滑雪:http://t.cn/A6Il6q65
车水马龙:http://t.cn/A6c9W6G9
枪王之战: http://t.cn/A6yy20F4
画地为牢: http://t.cn/A6JvUa2A
牛气冲天: http://t.cn/A67ZZWnm
剪指甲: http://t.cn/A6xkrPcZ
小鸭子过河: http://t.cn/A6xkNeKf
倒酒: http://t.cn/A6xpr8SX
凿壁借光: http://t.cn/A6xHzUcf
弹珠碰碰: http://t.cn/A6IK8B3w
转盘小丸子:http://t.cn/A6MKKk6w
合成大西瓜:http://t.cn/A65yQIb7
[1]https://zhuanlan.zhihu.com/p/76472385
[2]www.cvmart.net
[3]https://zhuanlan.zhihu.com/p/285601835
4.15推荐歌曲:听了就知道
4.16推荐乐队:散人乐队!蓬蒿人
4.17推荐乐队:对角巷!我们都是被困在这个城市的精灵~Tonight
4.18放松一下哈哈哈
4.28不好意思断更了,em来一首温柔吧
4.29要放五一啦!跟着PeaceHotel黎明前出发!