【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看
文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930.
本文目录
- 一、前言
- 二、文献阅读-基于深度学习的复杂储层流体性质测井识别
- 2.1 摘要
- 2.2 当前研究不足
- 2.3 本文创新
- 2.4 论文中图表分析
- 2.5 论文框架总结
- 2.6 本文存在不足与研究展望
- 三.模型复现-从实现的角度
- 实现1—数据集样本优化
- (1)数据集介绍
- (2)混合采样技术
- 1)对大样本类下采样
- 2)对小样本类上采样
- 实现2—神经网络结构的优化
- 实现3—论文中的图表
- (1)表1
- (2)表2
- (3)图5
- 四、最后
一、前言
- 本文复现一篇典型应用深度学习模型进行识别分类任务的论文。
- 当然,作为计算机的学生,对这篇论文的理解会基于计算机领域角度,侧重深度学习。而论文第2部分-区域概况与测井响应特征、后文3.2节中识别结果分析,包含了大量地质资料特征分析与解释,这些专业知识是我们计算机学生不具备的,却是做交叉学科融合的同学更应该重点学习的,也是一大亮点与难点。
- 废话不多唠,进入正题。
二、文献阅读-基于深度学习的复杂储层流体性质测井识别
2.1 摘要
先看一下该论文的摘要部分,对论文有个宏观认识,主要内容已标出:
(1) 目的
- 解决复杂储层流体性质识别率低、严重依赖人工经验的问题,提出一种优化深度神经网络识别流体性质的方法。
(2) 方法
- 将深度学习方法引入到复杂储层流体识别中;
- 组合优化常规神经网络,提高网络模型的性能;
- 实验对比了4种组合优化方法对模型性能的影响。
(3) 创新
- 利用混合采用技术进行样本数据集均衡化,避免样本不均衡;
- 在网络中使用
ReLu + Softmax激活函数
,提高的模型多分类问题的准确率; - 在网络中使用
Dropout正则化
,有效防止模型过拟合。
(4) 结果与结论
- 优化后的模型对 4 种性质流体识别准确率达82. 7%,单一流体识别率也均较高。本文使用的组合优化方法的识别效果明显优于其他方法,提高了对小样本类别的识别率。
2.2 当前研究不足
- 仅利用单一的测井资料或者储层参数无法准确识别储层流体性质 。
- 传统识别方法综合多种测井资料及储层参数解释为主要识别手段,智能化程度低。
- 现常用的 BP 神经网络等识别方法网络结构简单,只能挖掘到样本浅层的特征信息。
2.3 本文创新
- 新方法-引入深度学习方法研究流体性质识别;
- 新模型-优化常规神经网络;
- 新结果-对比多种组合优化方法对模型的影响。
2.4 论文中图表分析
- 图1 单个神经元前馈传递过程。神经网络基础原理。
- 图2 不同类型的激活函数。神经网络基础原理。
- 图3
Dropout正则化
示意图。神经网络基础原理。Dropout正则化
模型训练过程中按照一定比例随机丢弃一些“神经元”,每一次训练的网络结构均不同,降低了网络结构复杂的关联性,学习到的样本特征更具鲁棒性,从而避免过拟合。 - 图4 深度神经网络结构。典型多层神经网络,输入9个特征参数—输出4个类别概率。
- 图5 样本集数量分布。数据集样本数量分布。
- 图6 人工解释结论与模型预测结果对比。模型预测结果对比。
- 图7 不同优化方法的识别效果F值对比。本文选用的组合方法最优。
- 表1 目标区测井资料统计。关于数据集的统计信息。
- 表2 识别结果混淆矩阵。混淆矩阵是神经网络多分类器中常用的评价手段。评价模型对不同类别的识别效果。
2.5 论文框架总结
案例:一个案例,对车排子油田某井区12 口井储层流体性质识别。
方法:对样本数据和神经网络结构进行优化,建立储层测井参数与流体性质之间的神经网络模型。
影响因素:
- 数据集样本均衡化方法;
- 神经网络模型中激活函数的组合;
- 避免模型过拟合方法。
评价指标:
- 划分大小样本标准:每种类别中样本数的平均值 k;
- 模型性能评价指标:精准率(
Precision
) ,召回率(Recall
) ,F 值(F-measure
) 。
2.6 本文存在不足与研究展望
- 组合优化方法对比,是简单的“正反面”形式的方法组合对比,没有与其它优化模型方法对比;
- 本文是单一常规神经网络模型的应用,没有与其它经典模型进行对比;
- 本文验证了基于优化组合策略的深度神经网络方法在实际应用中的优越性,为其它模型优化提供了一种思路。
三.模型复现-从实现的角度
实现1—数据集样本优化
(1)数据集介绍
由于论文的原始数据集无法获取,在复现过程中选用葡萄酒(WINE)数据集。这两个数据集(论文数据集和葡萄酒数据集)都可以完成分类任务。
Wine数据集:数据是对生长在意大利同一地区但来自三个不同品种的葡萄酒进行化学分析的结果,数据集中确定了三种葡萄酒中13种成分的含量。即有3个类别,13种特征参数(葡萄酒的13种成分含量)。数据集下载:https://download.csdn.net/download/mdong9/90005091
每个样本的第一个属性是类别(1或2或3),其余按顺序均有如下13个属性:
- Alcohol
- Malic acid
- Ash
- Alcalinity of ash
- Magnesium
- Total phenols
- Flavanoids
- Nonflavanoid phenols
- Proanthocyanins
- Color intensity
- Hue
- OD280/OD315 of diluted wines
- Proline
(2)混合采样技术
论文中的混合采样技术其实就是一种解决不同类别中样本数不平衡策略。比如Wine数据集中,三种葡萄酒的样本数分别是59(label=1)、71(label=2)、48(label=3),很明显第2类葡萄酒样本数最多,第三类最少,夸张的讲这就是一个样本数不均衡的数据集(其实还好)。
而混合采样技术来解决样本不均衡问题,思路是:
- 计算每类中样本数的平均值 k,以k 为分界,大于 k 的类别为大样本类,反之则为小样本类。
- 对于大样本类下采样,下采样过程中采用
K-means
聚类算法减少多样本类别的样本数。 - 对于小样本类上采样,上采样过程中采用
Smote
算法增加少样本类别的样本数。
经过上述步骤的混合采样后每类样本大小均为 k,原始不均衡样本数据集就变成了均衡样本数据集。
知道思路后,下面就一步步来将Wine数据集变成三类样本数平衡的数据集。在Wine数据集中,平均值 k = ( 59 + 71 + 48 ) / 3 = 59.33 k = (59 + 71 + 48) / 3 = 59.33 k=(59+71+48)/3=59.33 ,取整后刚好是类别1的样本数59,则类别2是大样本类,类别3是小样本类。
1)对大样本类下采样
对于大样本类,K-means 算法将样本聚为 k类,仅保留距离每个聚类中心最近的一个样本,聚类后的 k 个样本在降采样的基础上仍保留了原始数据的全部特征。
方便理解,这里给出一个下采样的例子:
"""
在这个示例中,我们将通过 K-means 聚类算法将一组多样本类别减少到 5 个类别。
"""
from sklearn.cluster import KMeans
import numpy as np # 假设你有一个多样本类别的数据集,这里我们随机生成一些数据作为例子
X = np.random.rand(100, 10) # 100个样本,每个样本有10个特征 # 设置聚类的数量
n_clusters = 5 # 创建 KMeans 对象
kmeans = KMeans(n_clusters=n_clusters, random_state=0) # 进行聚类
y_kmeans = kmeans.fit_predict(X) # 输出结果
print("Cluster centers:")
print(kmeans.cluster_centers_)
print("\nLabels:")
print(y_kmeans)# 获取每个聚类的中心
cluster_centers = kmeans.cluster_centers_# 找到每个样本到其所属聚类中心的距离
distances = np.linalg.norm(X[:, np.newaxis] - cluster_centers, axis=2)# 对于每个聚类,找到距离其中心最近的样本的索引
nearest_indices = np.argmin(distances, axis=0)# 输出结果
print("Nearest indices:")
print(nearest_indices)
输出结果:
Cluster centers:
[[0.56870198 0.33340756 0.74812813 0.50208413 0.80879522 0.756915730.28995045 0.58835733 0.53986648 0.52429174][0.24773952 0.29674511 0.39650162 0.65400547 0.28843251 0.559490720.48438144 0.39485121 0.65630189 0.31650354][0.69576183 0.38668387 0.51523792 0.71425985 0.50791891 0.276707770.67150517 0.69364469 0.50809951 0.71037073][0.48304122 0.75197772 0.21397284 0.43701465 0.61980822 0.610628740.49566418 0.50509653 0.42412438 0.71218052][0.65337793 0.6093431 0.78001226 0.25850624 0.32640479 0.319900740.44351127 0.52801434 0.55983808 0.43707075]]Labels:
[0 2 1 0 0 1 3 2 4 0 0 0 2 2 4 1 2 1 1 3 0 0 1 3 3 0 3 0 0 4 0 4 3 0 1 1 14 4 4 4 2 3 2 2 3 2 1 1 0 0 3 3 3 1 3 4 1 3 3 4 1 4 2 4 0 2 4 4 4 0 2 1 03 0 3 2 1 2 1 4 3 3 2 2 4 2 3 0 1 3 0 4 2 4 1 2 2 4]
Nearest indices:
[10 35 46 6 29]
2)对小样本类上采样
对于小样本类,
Smote 算法
以欧式距离为标准计算每个样本到其他所有样本的距离,并得到距离其最近的 p 个样本,即“p 近邻”。根据样本不均衡比例确定上采样倍率,对于每个少数类样本 n i n_i ni 从其“p 近邻”中随机选择若干个样本n分别与原样本按照公式构建新样本 n n e w n_{new} nnew。
公式: n n e w = n i + R ( n − n i ) n_{new} = n_i + R(n - n_i) nnew=ni+R(n−ni) ,R为一个均匀分布在0 ~ 1间的随机数。
Smote 通过创建合成样本来增加少数类的数量。Smote 就是使用欧式距离作为距离度量标准的。在Smote 算法中,首先为每个少数类样本找到其k个最近邻样本,然后从这些邻居中随机选择一个,最后通过插值生成一个新的合成样本。
方便理解,这里给出一个上采样的例子:
from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn import metrics # 创建一个不平衡的数据集
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10) # 数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 输出原始数据集大小
print('Original dataset shape %s' % Counter(comb_y))# 初始化SMOTE实例
smote = SMOTE(random_state=42) # 对训练集进行过采样处理
X_res, y_res = smote.fit_resample(X_train, y_train) # 输出重采样后的数据集大小
print('Resampled dataset shape %s' % Counter(y_res))
输出结果:
Original dataset shape Counter({1: 628, 0: 72})
Resampled dataset shape Counter({1: 628, 0: 628})
理解了上述两个步骤后,我们来完成对Wine数据集的混合采样优化,代码如下:
# 导入需要用到的包
from collections import Counterimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans# 1.数据集
# 读取Excel文件
df = pd.read_excel('./dataset/wine.xlsx')
wine = df# 2.数据集样本优化,混合采样技术
# 在Wine数据集中,平均值k = (59 + 71 + 48) / 3 = 59.33,取整后刚好是类别1的样本数59,则类别2是大样本类,类别3是小样本类。# 2.1 对类别2的样本下采样----KMeans
mask = (wine['label'] == 2)
cls_2 = wine.loc[mask]
print(cls_2)
cls_2_X = np.array(cls_2.iloc[:, 1:]) # 类别2的样本# 设置聚类的数量
n_clusters = 59 # 将样本聚为k类,仅保留距离每个聚类中心最近的一个样本
# 创建 KMeans 对象
kmeans = KMeans(n_clusters=n_clusters, random_state=0)
# 进行聚类
labels = kmeans.fit_predict(cls_2_X) # 对数据进行聚类,并返回每个样本的类别标签
# 获取每个聚类的中心
cluster_centers = kmeans.cluster_centers_
# 找到每个样本到其所属聚类中心的距离
# print(cls_2_X[:, np.newaxis])
distances = np.linalg.norm(cls_2_X[:, np.newaxis] - cluster_centers, axis=2)
# 对于每个聚类,找到距离其中心最近的样本的索引
nearest_indices = np.argmin(distances, axis=0)# 输出结果
print("Nearest indices:")
print(nearest_indices + 59) # 每个聚类中心最近的一个样本的索引,+59得到原始索引# 新类别2样本
nearest_idx = nearest_indices + 59
new_cls_2 = wine.iloc[nearest_idx, :]# 2.2 对类别3的样本上采样----SMOTE
mask = (wine['label'] == 3)
cls_3 = wine.loc[mask]
cls_3_X = np.array(cls_3.iloc[:, 1:]) # 类别3的样本mask = (wine['label'] == 1)
cls_1 = wine.loc[mask] # 类别1comb_dataset = pd.concat([cls_1, new_cls_2, cls_3]) # 组合样本comb_X = comb_dataset.iloc[:, 1:]
comb_y = comb_dataset.label
print('Original dataset shape %s' % Counter(comb_y))# 初始化SMOTE实例
smote = SMOTE(random_state=42)# 对数据集进行过采样处理
X_res, y_res = smote.fit_resample(comb_X, comb_y)# 输出重采样后的数据集大小
print('Resampled dataset shape %s' % Counter(y_res))# 组合出优化后的数据集
new_dataset = X_res.assign(label=y_res)# 保存优化后的数据集
new_dataset.to_excel('./dataset/new_wine.xlsx', index=False)
Wine数据集经混合采样优化后达到均衡,三类样本数为59(label=1)、59(label=2)、59(label=3)。到这里就成功复现了论文中的混合采样技术。
实现2—神经网络结构的优化
从代码实现的角度对本文中储层流体性质识别模型进行复现,对该模型的学习完全可以作为深度学习入门的过程。先来了解一下本文的神经网络结构,一图胜千言:
论文中提到的网络结构优化,是在网络中引入了 ReLU激活函数
、Softmax 层
和 Dropout 正则化
,使得网络模型更好地适应多分类问题,防止出现“过拟合”现象,有效提高训练模型的稳定性。
该网络的代码实现:
class MLP(nn.Module):def __init__(self, input_size, output_size):super(MLP, self).__init__()self.fc1 = nn.Linear(input_size, 20) # 输入层->隐藏层1self.fc2 = nn.Linear(20, 25) # 隐藏层1->隐藏层2self.fc3 = nn.Linear(25, 30) # 隐藏层2->隐藏层3self.fc4 = nn.Linear(30, 25) # 隐藏层3->隐藏层4self.fc5 = nn.Linear(25, 15) # 隐藏层4->隐藏层5self.fc6 = nn.Linear(15, output_size) # 隐藏层5->输出层self.dropout = nn.Dropout(p=0.2) # Dropout层,设置丢弃概率为0.2def forward(self, x):x = F.relu(self.fc1(x)) # 应用激活函数ReLux = self.dropout(x) # 应用Dropout层x = F.relu(self.fc2(x))x = self.dropout(x)x = F.relu(self.fc3(x))x = self.dropout(x)x = F.relu(self.fc4(x))x = self.dropout(x)x = F.relu(self.fc5(x))x = self.dropout(x)x = self.fc6(x)return F.softmax(x, dim=0) # 在这里使用softmax函数
下面我们就利用这个网络结构,用Wind数据集去训练出一个识别葡萄酒类别的模型,完成识别分类任务,近似的去复现复杂储层流体性质识别模型。
完整的模型训练和应用模型识别葡萄酒类别的代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optimimport pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score'''
教程:B站我是土堆 + 博客
'''class MLP(nn.Module):def __init__(self, input_size, output_size):super(MLP, self).__init__()self.fc1 = nn.Linear(input_size, 20) # 输入层->隐藏层1self.fc2 = nn.Linear(20, 25) # 隐藏层1->隐藏层2self.fc3 = nn.Linear(25, 30) # 隐藏层2->隐藏层3self.fc4 = nn.Linear(30, 25) # 隐藏层3->隐藏层4self.fc5 = nn.Linear(25, 15) # 隐藏层4->隐藏层5self.fc6 = nn.Linear(15, output_size) # 隐藏层5->输出层self.dropout = nn.Dropout(p=0.2) # Dropout层,设置丢弃概率为0.2def forward(self, x):x = F.relu(self.fc1(x)) # 应用激活函数ReLux = self.dropout(x) # 应用Dropout层x = F.relu(self.fc2(x))x = self.dropout(x)x = F.relu(self.fc3(x))x = self.dropout(x)x = F.relu(self.fc4(x))x = self.dropout(x)x = F.relu(self.fc5(x))x = self.dropout(x)x = self.fc6(x)return F.softmax(x, dim=0) # 在这里使用softmax函数# 归一化处理
def normalize_features(input_tensor):# 计算每个特征的最大值和最小值v_min = torch.min(input_tensor)v_max = torch.max(input_tensor)# 对特征进行归一化normalized_res = (input_tensor - v_min) / (v_max - v_min)return normalized_res# 设置超参数
num_epochs = 200
learning_rate = 0.001# 创建模型实例
model = MLP(13, 3) # (input_size,output_size)
print(model)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss() # 使用交叉熵作为损失函数
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 输入数据,训练集数据
# 读取 Excel 文件
dataset = pd.read_excel(r'./dataset/new_wine.xlsx')X = torch.tensor(dataset.iloc[:, :-1].values).float()
y = dataset.iloc[:, -1]# 对输入张量的特征进行归一化
normalized_input = normalize_features(X)# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(normalized_input, y, test_size=0.2, random_state=42)# 训练模型
for epoch in range(num_epochs):model.train() # 设置为训练模式for i in range(len(X_train)):outputs = model(X_train[i]) # 前向传播# 计算损失loss = criterion(outputs.unsqueeze(0), # 注意这里需要多一个维度,表示样本的数量torch.tensor([y_train.iloc[i] - 1])) # 索引从0开始,因此类别[1],[2],[3]->[0],[1],[2]# 反向传播和优化optimizer.zero_grad() # 清空梯度loss.backward() # 反向传播,计算梯度optimizer.step() # 更新权重if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')# 保存模型
torch.save(model.state_dict(), 'model.pth') # 保存模型参数到文件'model.pth'中# 设置模型为评估模式
model.eval()y_true = torch.tensor(y_test.tolist()) # 真实值
y_pred = [] # 模型的预测值
# 进行预测
with torch.no_grad(): # 关闭梯度计算以节省内存for i in range(len(X_test)):pre_y = model(X_test[i])# 使用 torch.argmax() 找到最大值的索引_, predicted_class = torch.max(pre_y, 0)# print("Predicted class:", predicted_class.item() + 1)y_pred.append(predicted_class.item() + 1)y_pred = torch.tensor(y_pred)
# 使用 sklearn 的函数来计算 Precision, Recall 和 F1-score
precision = precision_score(y_true.numpy(), y_pred.numpy(), average='macro')
recall = recall_score(y_true.numpy(), y_pred.numpy(), average='macro')
f1 = f1_score(y_true.numpy(), y_pred.numpy(), average='macro')print(f'Precision: {precision}, Recall: {recall}, F1-score: {f1}')
过程中输出的内容:
MLP((fc1): Linear(in_features=13, out_features=20, bias=True)(fc2): Linear(in_features=20, out_features=25, bias=True)(fc3): Linear(in_features=25, out_features=30, bias=True)(fc4): Linear(in_features=30, out_features=25, bias=True)(fc5): Linear(in_features=25, out_features=15, bias=True)(fc6): Linear(in_features=15, out_features=3, bias=True)(dropout): Dropout(p=0.2, inplace=False)
)
Epoch [10/100], Loss: 1.0862
Epoch [20/100], Loss: 1.0778
Epoch [30/100], Loss: 1.0782
Epoch [40/100], Loss: 1.2110
Epoch [50/100], Loss: 1.5514
Epoch [60/100], Loss: 1.5169
Epoch [70/100], Loss: 1.4014
Epoch [80/100], Loss: 1.5513
Epoch [90/100], Loss: 1.5514
Epoch [100/100], Loss: 1.1985
Precision: 0.8260869565217391, Recall: 0.6493506493506493, F1-score: 0.5789341377576672
就我目前训练得到的模型实验情况来看,模型各项评价指标都比较低,说明论文中的网络结构不太适合我们选用的Wine数据集,这是很正常的。因为论文的网络结构是用于测井数据集的,针对这个数据集不断实验训练模型,最终才确定了这样一个网络结构。如果想适配我们选用的Wine数据集,也需要做大量调超参、优化网络结构的模型训练实验。
到这里就成功复现了论文中优化后的模型。我这里给出了一个简单识别葡萄酒类别的例子,完成了深度学习模型进行识别分类任务基本流程,可以作为参考。但是想得到性能优秀的模型,比如针对自己的特定数据集的识别模型,还有很多实验、工作要做,这也是必经之路。
实现3—论文中的图表
这里只复现论文中的表1、表2和图5,比较重要。因为没有去做对比实验,所以没有复现图7,这个对比实验比较简单,知道了表2中的F值如何来的,就能得到图7。
(1)表1
论文中表1:
针对Wine数据集,我们也生成一个和表1一样的资料统计表:
当然还要做出轻微的修改,label行需要删掉。资料统计表通过下面代码生成:
import pandas as pd# 1.数据集资料统计
# 读取Excel文件
df = pd.read_excel('./dataset/wine.xlsx')# 数据集的基本描述
view = df.describe(percentiles=[], include='all').T
view.to_excel('./results/资料统计.xlsx')
(2)表2
论文中表2:
计算评价指标的公式:
针对Wine数据集,我们也做一个和表2一样的识别结果混淆矩阵,得到这个表中数据麻烦一点,需要我们在模型训练那块代码中打印出这些数据。然后评价指标值,我们可以根据论文中给的公式,再依据表中的数据,手动计算出来(偷个懒,不写代码算,代码中也计算了这些评价指标,但是针对所有类别的平均,没有算单个类别)。
直接贴出某一次训练模型时候打印的值:
真实类别:[1, 1, 3, 1, 2, 1, 3, 3, 2, 3, 1, 3, 1, 3, 1, 2, 2, 2, 1, 2, 1, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, 3, 3, 1, 1, 1]
预测类别:[3, 1, 2, 1, 3, 1, 2, 3, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 2, 1, 3, 3, 3, 2, 3, 3, 2, 3, 1, 1, 3, 2, 1, 1, 1]
填入表中:
(3)图5
论文中图5:
针对Wine数据集,我们也生成一个样本集数量分布,这里我使用的是代码进行数据统计+Excel绘制饼状图的方式。
代码进行数据统计,在将样本集划分为训练集和测试集的时候,我打印每个类别的样本数。代码如下:
# 导入需要用到的包
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split# 1.数据集资料统计
# 读取Excel文件
df = pd.read_excel('./dataset/wine.xlsx')
print(df)# 2.样本集数量分布
# 划分训练集和测试集,再绘制饼状图
wine = df
X = wine.iloc[:, 1:]
y = wine.label# 拆分成训练集和测试集,训练集80%和测试集20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
print('------训练集样本数量---------')
print(y_train.value_counts())
print('------测试集样本数量---------')
print(y_test.value_counts())
输出结果:
------训练集样本数量---------
2 54
1 48
3 40
Name: label, dtype: int64
------测试集样本数量---------
2 17
1 11
3 8
Name: label, dtype: int64
将数值用Excel表画成饼状图,如下图:
四、最后
至此,《基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例》论文复现之旅也将行至终点,当然还有很多细节没考虑到,后面肯定还会完善这块模型内容,期待。不得不说,这个搭建模型的整个过程完全可以作为深度学习入门,也让我更理解了之前学的碎片化知识,收获满满。
纸上得来终觉浅,绝知此事要躬行。动手学深度学习才是最快提升方法,没有之一,共勉之。
以上就是本文的全部内容,欢迎点赞评论,指出不足,笔者由衷感谢!~
相关文章:
【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看
文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…...
树的直径计算:算法详解与实现
树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...
conda创建 、查看、 激活、删除 python 虚拟环境
1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all 助力快速掌握数据集…...
vs2022搭建opencv开发环境
1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…...
NVIDIA NIM 开发者指南:入门
NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...
探索Python网络请求新纪元:httpx库的崛起
文章目录 **探索Python网络请求新纪元:httpx库的崛起**第一部分:背景介绍第二部分:httpx库是什么?第三部分:如何安装httpx库?第四部分:简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...
学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着
ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …...
QQ 小程序已发布,但无法被搜索的解决方案
前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规…...
【C++】拷贝构造 和 赋值运算符重载
目录: 一、拷贝构造 (一)拷贝函数的特点 二、赋值运算符重载 (一)运算符重载 (二)赋值运算符重载 正文 一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何…...
21.UE5游戏存档,读档,函数库
2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…...
「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号
本篇将继续讲解PTA平台上的题目 L1-005 考试座位号,通过考生准考证号与座位号的对应关系,掌握简单的数据查询与映射操作,进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…...
Vue3引用高德地图,进行位置标记获取标记信息
首先安装地图插件 cnpm i amap/amap-jsapi-loader --save封装地图子组件 <template><el-dialogtitle"选择地点"width"740px"class"select-map-dialog"v-model"dialogShow":close-on-click-modal"false":modal-or…...
《C++设计模式:重塑游戏角色系统类结构的秘籍》
在游戏开发领域,游戏角色系统的类结构设计至关重要。一个良好的类结构可以使游戏更易于扩展、维护和优化,而 C中的设计模式为我们提供了强大的工具来实现这一目标。 一、理解游戏角色系统的复杂性 游戏角色系统通常具有高度的复杂性。每个角色都有自己…...
深入浅出 Go 语言:现代编程的高效选择
深入浅出 Go 语言:现代编程的高效选择 引言 Go 语言(也称 Golang)是由 Google 开发的一种现代编程语言,面向高效、简单和并发。自 2009 年问世以来,它已迅速成长为许多企业和开发者首选的语言,尤其是在后端开发、云计算和微服务领域。 本文旨在从 Go 语言的设计哲学、…...
RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)
RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整,全面重新设计业务逻辑代码,代码量减少一半以上,开发更加高效。全系统引入全新字体图标,整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar,让开发更加…...
vue路由的钩子函数?
在 Vue 中,路由的钩子函数可以用来在导航过程中执行一些操作,比如进行权限验证、页面加载前后的处理等。常用的路由钩子函数包括全局前置守卫、全局解析守卫、全局后置钩子以及路由独享守卫。下面是这些路由守卫函数的简要说明: 全局前置守卫…...
【Java】枚举类映射
在数据库中常用数字来代替字符串类型,编写一个枚举映射类 当数据库的介质类型要存储数字,前端可以任意传参,通过枚举转换后端都会转成数字对应类型 import lombok.Getter;/*** <p>* 存档介质类型* </p>** author Jyang* date 2…...
精华帖分享|浅谈金融时间序列分析与股价随机游走
本文来源于量化小论坛公共讨论区板块精华帖,作者为正扬,发布于2024年6月3日。 以下为精华帖正文: 01 引 时间序列分析是个很唬人的术语,实际上它也不是一个很容易接近的话题。我本科曾经短暂地学过一点点,又看到互联…...
任意文件下载漏洞
1.漏洞简介 任意文件下载漏洞是指攻击者能够通过操控请求参数,下载服务器上未经授权的文件。 攻击者可以利用该漏洞访问敏感文件,如配置文件、日志文件等,甚至可以下载包含恶意代码的文件。 这里再导入一个基础: 你要在网站下…...
LeetCode 445.两数相加 II
题目: 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 思路:反转链表 两数相加 I 代码&…...
CentOS 7中查找已安装JDK路径的方法
使用yum安装了jdk8,但是其他中间件需要配置路径的时候,却没办法找到,如何获取jdk路径: 一、确认服务器是否存在jdk java -version 二、查找jdk的 java 命令在哪里 which java 三、找到软链指向的地址 ls -lrt /usr/bin/java l…...
springboot基于Web足球青训俱乐部管理后台系统开发(代码+数据库+LW)
摘 要 随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率…...
RHCE的学习(21)
第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中…...
Ubuntu 18.04 配置sources.list源文件(无法安全地用该源进行更新,所以默认禁用该源)
如果你 sudo apt update 时出现诸如 无法安全地用该源进行更新,所以默认禁用该源 的错误,那就换换源吧,链接: https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/ 注意版本: 修改源文件: sudo nano /etc…...
19.UE5道具掉落
2-21 道具掉落,回血、回蓝、升级提升伤害_哔哩哔哩_bilibili 目录 1.道具的创建,道具功能的实现 2.随机掉落 1.道具的创建,道具功能的实现 新建Actor蓝图,并命名为道具总类,添加一个Niagara粒子组件和一个碰撞箱bo…...
MySQL —— MySQL逻辑架构与查询过程
文章目录 MySQL逻辑架构整体分为三层连接层服务层查询缓存解析器优化器执行器 存储引擎层系统文件层 MySQL 查询过程查询过程框图 博客1 博客2 MySQL逻辑架构整体分为三层 最上层为客户端层,并非MySQL所独有,诸如:连接管理、授权认证、权限校…...
ODOO学习笔记(12):自定义模块开发
一、Odoo模块结构基础 基本目录结构 Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹: __init__.py:这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中,你可以通过from. impo…...
Excel单元格中自适应填充多图
实例需求:在Excel插入图片时,由于图片尺寸各不相同,如果希望多个图片填充指定单元格,依靠用户手工调整,不仅费时费力,而且很难实现完全填充。如下图中的产品图册,有三个图片,如下图所…...
20.useMediaQuery
React useMediaQuery 钩子:如何优雅地实现响应式设计? 在现代 Web 开发中,响应式设计是一个关键概念,它允许应用根据不同的屏幕尺寸和设备特性调整其布局和行为。useMediaQuery 钩子提供了一种声明式的方法来在 React 组件中使用媒体查询,使得响应式逻辑的实现变得简单而…...
无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:无人机场景车辆检测数据集,真实场景高质量图片数据,涉及场景丰富,比如无人机场景城市道路行驶车辆图片、无人机场景城市道边停车车辆图片、无人机场景停车场车辆图片、无人机场景小区车辆图片、无人机场景车辆遮挡、车…...
阆中市网站建设服务/长沙seo网站推广
为什么80%的码农都做不了架构师?>>> 目的:通过java concurrent调用XML Publisher API处理XML Data Definition和rtf 模板生成PDF报表。 环境:Oracle EBS R12.0.4 技术:Oracle, Java, XML Publisher 步骤: …...
寮步镇网站建设公司/营销策略
主机A的处理:发送方从第7层、第6层到第1层由上至下按照顺序传输数据,而接收端则从第1层、第2层到第7层由下至上向每个上一级分层传输数据。每个分层上,在处理由上一层传过来的数据时可以附上当前分层的协议所必须的“首部”信息。然后接收端对…...
龙岗网站建设培训/南昌seo推广公司
1.项目规划 博客网站是一个JSP与数据库技术结合的应用,由前台用户操作和后台管理员操作模块组成。其规划功能模块如下: 查看文章 查看文章模块主要实现了查看博主发表的博客文章,并通过该模块可以对博主发表的文章添加评论信息。 查看相片 …...
怎么做黑客把网站余额更改/百度网站优化软件
实验一 MATLAB工作环境一、实验目的1、掌握MATLAB的启动与退出;2、熟悉MATLAB的命令窗口和其他窗口;3、熟悉常用菜单和工具栏;4、使用“帮助”查找帮助信息。二、实验内容1、启动MATLAB2、使用命令窗口:(1)在命令窗口中键入如下命…...
vs2010可以做动态网站吗/缅甸在线今日新闻
提前半年定的亲 订婚前男方带着女方家人认一下男方的家,之后双方一起去订婚宴; 订婚宴邀请双方父母及近的亲戚,比如叔、婶子、媒人、姑,也可以叫上舅,大概三桌,三十来个人,双方父母及最近的人…...
临沂兰山建设局网站/如何在百度上开店铺
CSS几种定位方式以及定位的叠放次序z-index,绝对定位的盒子居中算法,定位的特殊特性 边偏移 top、left、right、bottom属性可以偏移定位 静态定位「默认」 静态定位是元素的默认定位方式,🈚️定位的意思。 静态定位按照标准流…...