食物分类问题


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

python 复制代码
def seed_everything(seed):
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.deterministic = True
    random.seed(seed)
    np.random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
#################################################################
seed_everything(0)
###############################################

数据增广:

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

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

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

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

python 复制代码
class myModel(nn.Module):
    def __init__(self, num_class):#num_class是类别数
        super(myModel, self).__init__()
        #  3*224*224  -> 512*7*7
        self.layer1 = nn.Sequential(
            nn.Conv2d(3,64,3,1,1),
            nn.BatchNorm2d(64),
            nn.ReLU(),#卷积层也是需要激活函数的
            nn.MaxPool2d(2)#最大池化
        )
        #  64*112*112

        # self.conv2= nn.Conv2d(64,128,3,1,1)
        # self.bn2 = nn.BatchNorm2d(128)
        # self.relu2 = nn.ReLU()
        # self.pool2 = nn.MaxPool2d(2)
        self.layer2 = nn.Sequential(
            nn.Conv2d(64,128,3,1,1),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        #128*56*56

        self.layer3 = nn.Sequential(
            nn.Conv2d(128,256,3,1,1),
            nn.BatchNorm2d(256),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )

        #256*28*28
        self.layer4 = nn.Sequential(
            nn.Conv2d(256,512,3,1,1),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        # 512*14*14
        self.pool1 = nn.MaxPool2d(2)
        # 512*7*7 - 25088
        self.fc1 = nn.Linear(25088, 1000)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(1000, num_class)

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

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


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

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

相关推荐
神经星星2 分钟前
在线教程丨一句话精准P图,FLUX.1 Kontext可实现图像编辑/风格迁移/文本编辑/角色一致性编辑
人工智能·深度学习·机器学习
UQI-LIUWJ9 分钟前
论文略读:Prefix-Tuning: Optimizing Continuous Prompts for Generation
人工智能·深度学习
机器之心27 分钟前
是的,LeCun要向28岁的Alexandr Wang汇报!这是Meta新AI团队的一些独家内部消息
人工智能
1892280486139 分钟前
NW710NW713美光固态闪存NW719NW720
大数据·服务器·网络·人工智能·科技
azoo39 分钟前
Canny边缘检测(cv2.Canny())
人工智能·opencv·计算机视觉
向哆哆40 分钟前
YOLO在自动驾驶交通标志识别中的应用与优化【附代码】
人工智能·深度学习·yolo·自动驾驶·yolov8
硬核隔壁老王1 小时前
AI大模型从入门到精通系列教程(二):解锁Prompt Engineering——从原理到高阶技巧的AI交互指南
人工智能·程序员·llm
聚客AI1 小时前
搜索引擎vs向量数据库:LangChain混合检索架构实战解析
人工智能·pytorch·语言模型·自然语言处理·数据分析·gpt-3·文心一言
云畅新视界1 小时前
从 CODING 停服到极狐 GitLab “接棒”,软件研发工具市场风云再起
人工智能·gitlab
一ge科研小菜鸡1 小时前
人工智能驱动下的可再生能源气象预测:构建绿色能源时代的新大脑
人工智能·能源