【深度学习+】基于卷积和全连接神经网络的主动学习岩土力学模型训练方案(Pytorch框架实现)

前言

本文节选自笔者承接某外包平台订单时设计和编写的方案和代码,供广大爱好者和从业者参考,如需咨询和定制相关方案和模型,欢迎评论区讨论或私信联系。

方案背景

主动学习

主动学习,即在拥有少部分监督数据的情况下,主动的去选择一部分对训练模型有较大提高的未标注数据,然后对选择出来的数据进行标注,标注后加入到训练集进行训练。为什么这么做的,我们把数据都标注一下不行吗?当然可以,但是标注是要时间和金钱的,特别是对于科研数据、工程数据来说,我们希望选择更有助于模型提高的数据先进行标注。如下图所示:

数据集

在这个方案针对的岩土力学数据中,前两个通道是土的力学参数,是随机场生成的,第三个数据是桩位,每条数据的形状为3信道40*70的形式,这形式彷佛一个有三种颜色的40*70大小的图片,有标注数据共2000+条,无标记数据4000+条。

工具与方法

Pytorch

PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。由Facebook人工智能研究院(FAIR)基于Torch推出。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络。

对Loss进行学习和回归

用另外一个模型来学习当前模型的损失,这是一个很有创新的想法,而且非常有用。既然我们选择数据的时候没有标签(未打标签),那么是不是可以先选择出预测较差的数据进行打标签。这时候loss确实是一个可以用来做这种选择的东西。当loss较大的时候说明和真实标签的差异性很大,loss较小则差异较小。其实最终我们是要对未打标签的数据进行排序,先是模型较难预测的,然后再是较好预测的。

实施方案和代码

开发环境

Kaggle Notebook 在线环境 2023.1.6版

必要的库的引入

import scipy.io as sio
import os
import pandas as pd
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

有标签数据的读取

load_data = os.path.join(os.getcwd(),'/kaggle/input/mat-train/traindata.mat')
data = sio.loadmat(load_data) #a dict 
features = data['input_database']
label = data['output_database']
features = features.T

硬件选择

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# Assuming that we are on a CUDA machine, this should print a CUDA device:
print(device)

配置特征和标签变量

x = torch.from_numpy(features).float().to(device)
y = torch.from_numpy(label).float().to(device)

设计神经网络

class Cnn(nn.Module):
    def __init__(self):
        super(Cnn, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=10, kernel_size=3, stride=1), #卷积层
            nn.ReLU(True),
            nn.MaxPool2d(kernel_size=2, stride=1),#最大池化层
            nn.Conv2d(in_channels=10, out_channels=10, kernel_size=3, stride=1),
            nn.ReLU(True),
            nn.MaxPool2d(kernel_size=2, stride=1),
            nn.Flatten() # 展平操作,为了与全连接层匹配
        )
        self.fc = nn.Sequential(
            nn.Linear(21760,100), #线性层
            nn.ReLU(inplace=True), # relu激活函数
            nn.Dropout(0.1),
            nn.Linear(100, 1),
            nn.ReLU(inplace=True),
        )

    def forward(self, x):  #
        out = self.conv(x)
        # out = out.view(out.size(0), 10 * 25 * 25)
        # print(out.shape)
        out = self.fc(out)
        # print(out.shape)
        return out

网络选择两层卷积+两层池化层+全连接,激活函数选择Relu,全连接中添加Dropout层。

配置并进行训练

#把模型装到CUDA显存
net = Cnn().to(device)
#优化器选用SGD(随机梯度下降法)进行学习率优化,可换Adam、Adamax、ASGD等
optimizer = torch.optim.Adamax(net.parameters(),lr = 0.01)
#使用MSE作为loss,可以换MAE、R2等
loss_func = torch.nn.MSELoss()
losslist = []
#此处选择训练轮数
epochs = 1000
#训练外循环
for t in range(epochs):
    #用当前网络进行预测
    prediction = net(x)
    #计算loss
    loss = loss_func(prediction,y)
    #加入loss列表
    losslist.append(float(loss.cpu().detach().numpy()))
    #优化器梯度重置
    optimizer.zero_grad()
    #反向传播
    loss.backward()
    #优化器迭代
    optimizer.step()
    #此处用于查看loss
    if t%100 == 0:
        print('loss:',loss.cpu().detach().numpy())

查看Loss下降过程

import seaborn as sns
sns.lineplot(y=losslist,x=range(epochs))

实例化模型并用于读取全部loss

#将模型用于预测
net.eval()
#预测全部数据点
outputs=net(x)

List = []
#计算并储存全部数据点loss,从而获得哪个数据点的类型需要更多标注
for i in range(2982):
    value = loss_func(outputs[i],y[i]).cpu().detach().numpy()
    List.append(float(value))
Loss = pd.DataFrame(List)
Loss = Loss.to_numpy()
Loss.shape

将标签换为主模型的loss

x = torch.from_numpy(features).float().to(device)
#此时将Label换成Loss
y = torch.from_numpy(Loss).float().to(device)

进行对loss的回归训练

#把模型装到CUDA显存
net = Cnn().to(device)
#优化器选用SGD(随机梯度下降法)进行学习率优化,可换Adam、Adamax、ASGD等
optimizer = torch.optim.SGD(net.parameters(),lr = 0.1)
#使用MSE作为loss,可以换MAE、R2等
loss_func = torch.nn.MSELoss()
losslist = []
#此处选择训练轮数
epochs = 1000
#训练外循环
for t in range(epochs):
    #用当前网络进行预测
    prediction = net(x)
    #计算loss
    loss = loss_func(prediction,y)
    #加入loss列表
    losslist.append(float(loss.cpu().detach().numpy()))
    #优化器梯度重置
    optimizer.zero_grad()
    #反向传播
    loss.backward()
    #优化器迭代
    optimizer.step()
    #此处用于查看loss
    if t%100 == 0:
        print('loss:',loss.cpu().detach().numpy())

对无标签数据的loss进行预测

load_data = os.path.join(os.getcwd(),'/kaggle/input/mat-train/test_input.mat')
data = sio.loadmat(load_data) #a dict 
features = data['input_database']
features = features.T
features.shape
features_test = features.reshape(4694,3*70*40)
test = pd.DataFrame(features_test)
test.to_csv('active_test.csv')
outputs_test=net(x).cpu().detach().numpy()

保存结果

outputs_test = pd.DataFrame(outputs_test)
outputs_test.to_csv('prediction_Loss.csv')

结语

监督学习问题中,存在标记成本较为昂贵且标记难以大量获取的问题。 针对一些特定任务,只有行业专家才能为样本做上准确标记。在此问题背景下,主动学习(Active Learning, AL)尝试通过选择性的标记较少数据而训练出表现较好的模型。主动学习已经是一个较为成熟的技术,已经有很多研究工作将其应用于不同学科和领域,本文仅从最简单方法出发,作为示例。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
PyTorch深度学习实战中,可以使用卷积神经网络来进行图像分类任务。在实战中,可以使用经典的卷积神经网络模型,如VGG、ResNet、Inception和DenseNet等。这些模型都是在深度学习的发展过程中出现的经典模型,对深度学习的学术研究和工业生产都起到了巨大的促进作用。初学者可以通过阅读论文和实现代码来全面了解这些模型。例如,可以使用PyTorch中的torchvision.models模块来加载预训练卷积神经网络模型,如VGG-16、VGG-19和ResNet等\[1\]。其中,VGG-16和VGG-19是由卷积层、池化层和全连接层等不同组合构成的经典卷积神经网络模型\[1\]。而ResNet是一种使用残差单元连接而成的卷积神经网络模型,通过跨层的短接来突出微小的变化,使得网络对误差更加敏感,并解决了网络退化现象,具有良好的学习效果\[2\]\[3\]。因此,在PyTorch深度学习实战中,可以选择合适的卷积神经网络模型来进行图像分类任务。 #### 引用[.reference_title] - *1* *2* *3* [PyTorch深度学习实战 | 典型卷积神经网络](https://blog.csdn.net/qq_41640218/article/details/129832298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wormhacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值