• 食物分类问题



    设置随机种子的目的:如果我们得到了一个特别好的模型,但后面可能无法复现了

    1. def seed_everything(seed):
    2. torch.manual_seed(seed)
    3. torch.cuda.manual_seed(seed)
    4. torch.cuda.manual_seed_all(seed)
    5. torch.backends.cudnn.benchmark = False
    6. torch.backends.cudnn.deterministic = True
    7. random.seed(seed)
    8. np.random.seed(seed)
    9. os.environ['PYTHONHASHSEED'] = str(seed)
    10. #################################################################
    11. seed_everything(0)
    12. ###############################################

    数据增广

    计算机不认识有变化的图片。所以我们在训练的时候就要对图片进行各种变换(比如变小和旋转),这样就能让模型见过足够多的照片,这样就相当于把数据集扩充了。

    每次取一个batch的数据,都进行增广。

    1. #数据增广。
    2. train_transform = transforms.Compose([
    3. transforms.ToPILImage(),#将张量(Tensor)转换为 PIL(Python Imaging Library)图像对象
    4. transforms.RandomResizedCrop(224),#把图片随机放大,再从其中拿出224*224.即只拿出原图的一部分。
    5. transforms.RandomRotation(50),#随机旋转
    6. transforms.ToTensor()#转为张量
    7. ])

    在机器学习中,要把数据转换成张量的原因:大多数深度学习框架,如TensorFlow和PyTorch,都是基于张量进行计算的。这些框架提供了大量针对张量的优化算法和函数,可以高效地进行矩阵运算、梯度下降等操作。因此,为了利用这些框架进行深度学习,我们需要将数据转换为张量。

    1. class myModel(nn.Module):
    2. def __init__(self, num_class):#num_class是类别数
    3. super(myModel, self).__init__()
    4. # 3*224*224 -> 512*7*7
    5. self.layer1 = nn.Sequential(
    6. nn.Conv2d(3,64,3,1,1),
    7. nn.BatchNorm2d(64),
    8. nn.ReLU(),#卷积层也是需要激活函数的
    9. nn.MaxPool2d(2)#最大池化
    10. )
    11. # 64*112*112
    12. # self.conv2= nn.Conv2d(64,128,3,1,1)
    13. # self.bn2 = nn.BatchNorm2d(128)
    14. # self.relu2 = nn.ReLU()
    15. # self.pool2 = nn.MaxPool2d(2)
    16. self.layer2 = nn.Sequential(
    17. nn.Conv2d(64,128,3,1,1),
    18. nn.BatchNorm2d(128),
    19. nn.ReLU(),
    20. nn.MaxPool2d(2)
    21. )
    22. #128*56*56
    23. self.layer3 = nn.Sequential(
    24. nn.Conv2d(128,256,3,1,1),
    25. nn.BatchNorm2d(256),
    26. nn.ReLU(),
    27. nn.MaxPool2d(2)
    28. )
    29. #256*28*28
    30. self.layer4 = nn.Sequential(
    31. nn.Conv2d(256,512,3,1,1),
    32. nn.BatchNorm2d(512),
    33. nn.ReLU(),
    34. nn.MaxPool2d(2)
    35. )
    36. # 512*14*14
    37. self.pool1 = nn.MaxPool2d(2)
    38. # 512*7*7 - 25088
    39. self.fc1 = nn.Linear(25088, 1000)
    40. self.relu = nn.ReLU()
    41. self.fc2 = nn.Linear(1000, num_class)

    BatchNorm2d是深度学习中的一种层,主要用于进行批归一化(Batch Normalization)操作。批归一化是一种常用的技术,用于解决深度神经网络训练中的梯度消失和梯度爆炸问题,提高网络的收敛速度和稳定性。它通过对每个小批量样本的特征进行规范化,使得特征的均值接近0,方差接近1,从而使输入数据分布更加稳定,有助于缓解梯度问题,提高网络的泛化能力。

    argmax() 函数的作用是返回数组中最大元素的索引(位置)


    迁移学习:数据量少时的最佳选择。eg:有个模型它训练得很好,已经训练了1000多万图片了,我们的模型效果很差,我们可以直接拿别人的模型。但最后的全连接不一样,我是分11类,他们是分1000类,所以我们只借特征提取器。

    他们有很多预训练,我们只是微调。我们使用他们的参数和架构。

  • 相关阅读:
    【Spring Boot】分页查询
    前端传String字符串 后端使用enun枚举类出现错误
    C++递归函数
    (附源码)php校园寝室分配查询系统 毕业设计 032027
    根据GWAS数据估算样本量N和使用千人基因组填充maf的参考文献
    npm: node package manager,node包管理器
    特征衍生工程
    Linux驱动开发 问题随笔
    docker-compose搭建etcd集群(三节点)
    Android事件分发机制
  • 原文地址:https://blog.csdn.net/m0_64077136/article/details/136351882