文章目錄
- 一、前言
- 二、DDNet架構學習
- 2.1 數據預處理
- 2.2 網絡模型構建
- 三、基于深度學習地震數據去噪處理
- 3.1 深度學習在地震數據去噪中的研究方向
- 3.2 深度學習地震數據去噪流程
- 3.2.1 數據集準備
- 3.2.2 模型構建
- 3.2.3 訓練網絡
- 3.3 基于DnCNN的地震數據去噪實驗
- 四、小結
- 4.1 存在的問題及解決
- 4.2 下周安排
一、前言
??放假前一周主要完成了DDNet論文閱讀,并嘗試思考新的點子修改網絡架構。
??這段時間主要學習了數學表達式的簡單書寫(包括常用符號、集合的表示與運算、向量與矩陣、二元關系等,但是還有一大部分數學表達式沒有學習完成,并且對一些概念掌握較差,如范數等)、深度學習地震數據去噪、DDNet架構學習。
二、DDNet架構學習
??DDNet工程文件基于模塊化的設計思路,主要包含data、func、models、net四個文件夾,以及model_test.py、model_test.py等文件,如圖1所示。
- data文件夾:存放實驗數據;
- func文件夾:包括datasets_reader.py(讀取數據集)與utils.py(存放一些方法,如繪圖方法、canny邊緣檢測算法、添加高斯噪聲等);
- models文件夾:存放訓練好的網絡模型(pkl文件);
- net文件夾:存放網絡結構;
2.1 數據預處理
??數據預處理的操作主要在func文件夾中完成,該文件夾下包括datasets_reader.py(讀取數據集)與utils.py(存放一些數據預處理方法),很大一部分方法在之前的OpenFWI與FCNVMB的介紹中提及過了,下面介紹一下canny邊緣檢測算法;
# 使用Canny邊緣檢測算法從輸入的圖像(通常是一個速度模型)中提取輪廓特征
def extract_contours(para_image):'''Use Canny to extract contour features:param image: Velocity model (numpy) 速度模型圖像(numpy數組):return: Binary contour structure of the velocity model (numpy)'''image = para_image# OpenCV的normalize函數對輸入的圖像進行歸一化,將圖像的像素值范圍調整為[0, 1]。# NORM_MINMAX表示使用圖像的最小和最大值進行歸一化。# dtype=cv2.CV_32F指定了輸出圖像的數據類型為32位浮點數。norm_image = cv2.normalize(image, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)# 將歸一化后的在[0, 1]之間的圖像像素值范圍轉換為0 - 255的范圍(這是Canny邊緣檢測算法通常需要的)。# 將每個像素值乘以255,并將數據類型轉換為8位無符號整數(np.uint8)。norm_image_to_255 = norm_image * 255norm_image_to_255 = norm_image_to_255.astype(np.uint8)# 使用OpenCV的Canny函數對歸一化并轉換后的圖像進行邊緣檢測。# Canny函數接受三個參數:輸入圖像、低閾值和高閾值。這里,低閾值設置為10,高閾值設置為15。canny = cv2.Canny(norm_image_to_255, 10, 15)# 將Canny輸出轉換為布爾值# 使用clip函數將Canny輸出的像素值限制在[0, 1]范圍內,并返回一個布爾值數組。在這個數組中,值為1的像素表示邊緣,值為0的像素表示非邊緣。bool_canny = np.clip(canny, 0, 1)# 函數返回處理后的布爾值數組,代表輸入圖像的速度模型的輪廓特征。return bool_canny
2.2 網絡模型構建
??DDNet的架構如下圖所示,其基本思想來自Unet,具有明顯的左右高度對稱的編解碼器結構,整體結構呈Y形,如圖2所示。
??不同的解碼器將U-Net變成一個多任務學習環境,子任務解碼器還可以為主任務或后續任務提供參數上下文。
- 左側的編碼器組件負責地震數據的壓縮過程,將29炮的地震觀測記錄壓縮成1024維的抽象結構化信息。
- 右邊的兩個解碼器使用不同的想法來解釋高維抽象信息。第一解碼器的目標是常規的速度模型,是預測的主要解碼器,關注速度值的準確擬合。然后,Canny輪廓提取后的二進制速度模型進一步用作第二解碼器的擬合目標。該解碼器將用作訓練輪廓信息的輔助解碼器。輪廓解碼器以確保分割預測的平滑性。
??DD-Net 70在網絡前面擴展了一個預網絡降維器。因為輸入圖像的時間維度(圖像的高)相比于寬度是很高的,所以需要使用一些比較窄的卷積將時間域壓縮來與寬度差不多的程度,先經歷寬度不變,高度被壓縮的過程。引入非方形卷積來壓縮時間維度(圖像高度),確保地震數據被約束到與速度模型相同的大小。降維器將使用多個卷積來協調,以防止由一個卷積壓縮引起的信息丟失。
??之前提到可以使用Tensorboard查看網絡的架構,下面介紹另一種方法查看網絡模型的詳細信息:
- torchsummary 是一個用于 PyTorch 的庫,可以為給定的神經網絡模型生成一個簡潔的摘要,展示模型的每一層的詳細信息,包括層類型、輸出形狀、參數數量等。summary 函數會打印出模型的每一層及其詳細信息。
from torchsummary import summary # 從 torchsummary 庫中導入了 summary 函數
# model:想要獲取摘要的 PyTorch 神經網絡模型
# input_size:模型預期接收的數據大小
summary(model, input_size=[(7, 1000, 70)])
??網絡的詳細介紹如下:
- 深藍色箭頭:高度為3、寬度為1的卷積核、高度為2、寬度為1的步長、高度為1、寬度為1的填充;
- 棕色箭頭:調整張量(特征圖)的尺寸;
- 紅色箭頭:3x3的卷積核、BN批量歸一化、ReLU激活函數;
- 紫色箭頭:2x2的最大池化操作;
- 黃色箭頭:2x2的反卷積操作;
- 淺藍色箭頭:1x1的卷積操作;
三、基于深度學習地震數據去噪處理
??本節知識主要包含以下幾個板塊:深度學習在地震數據去噪中的研究方向、深度學習地震數據去噪流程、基于DnCNN的地震數據去噪實驗,參考如下:
- 學習參考(B站夜劍聽雨博主):https://www.bilibili.com/video/BV1734y1a77W/?spm_id_from=333.788&vd_source=af74aafa4645f30fd97c16896b278128
- 數據和代碼(阿里云):https://www.aliyundrive.com/s/ApwRi7zJtBy
3.1 深度學習在地震數據去噪中的研究方向
??卷積神經網絡(CNN)具有自動學習高度復雜的非線性特征的能力,將其應用與疊前地震數據隨機噪聲處理的壓制中,通過對疊前地震數據中隨機噪聲特征的自動學習,實現自動且高效的隨機噪聲分離。(李海山等,2020)
??面波作為很強的干擾波出現在地震勘探中,大大降低了地震記錄的分辨率和信噪比。深度學習作為一種數據驅動類方法,能夠從大量數據樣本中學習得到有效信號與噪聲的區別,自適應建立深度神經網絡來壓制噪聲。
注意:信號與噪聲是一個相對的概念。使用反射波的時候面波是噪聲,在一些使用面波的成像技術中面波是需要保留的信號。
??大多數傳統三維地震數據重建方法對噪聲較為敏感,且不能應對規則缺失的數據。相比于傳統的方法,基于深度學習的方法可以克服傳統方法對數據先驗信息的要求,使得在對地震數據的去噪和重建過程中只需要考慮數據的分布,大大降低了重建過程中的復雜度(王峰, 2020)。
3.2 深度學習地震數據去噪流程
??深度學習技術存在較多的不可解釋性,更強調工程實用性。因此需要大量實踐經驗,數據科學家更像是工程師,每個環節的處理經驗對訓練效果具有顯著影響。
- 準備數據:在深度學習中,數據集通常被劃分為訓練集、驗證集和測試集三個部分;
1.訓練集: 用于訓練模型的數據集,即模型通過學習訓練集中的數據來更新其參數,從而獲得更好的性能。訓練集相當于教材或例題,通過訓練集,模型可以學習到數據中的規律和特征;
2.驗證集: 用于在模型訓練過程中驗證模型性能的數據集。驗證集相當于模擬考試,用于調整模型的參數和超參數,以及選擇最佳的模型。驗證集的作用是幫助我們在多個可能的模型中選出表現最好的那個;
3.測試集: 用于評估模型最終性能的數據集,通常是在模型訓練完成后,使用測試集來評估模型的性能。測試集相當于高考,其特點是數據不參與訓練,用于檢驗模型的泛化能力,即在未知數據集下反映出的性能。測試集的特點是數據不參與訓練,用于檢驗模型在未見過的數據上的表現能力; - 搭建網絡:例如DnCNN(用于去噪的卷積神經網絡)、Unet、GAN等;
- 訓練網絡:獲得在訓練集、測試集中表現最好,也就是誤差最小的模型;
- 最優模型:某次實驗的最佳模型保存本地,必要的時候可以繼續訓練不斷優化;
超參數:學習率 η \eta η、正則化參數 λ \lambda λ、神經網絡的層數 L L L、每一個隱藏層中神經元的個數 j j j、學習的回合數 e p o c h epoch epoch、小批量數據 m i n i b a t c h minibatch minibatch 的大小、輸出神經元的編碼方式、代價函數的選擇、權重初始化方法、神經元激活函數的種類(目前來說影響并不是這么大)、參與訓練模型數據的規模等。
3.2.1 數據集準備
??正演地震記錄:通過正演軟件得到炮集記錄以及結合部分實際的地震記錄。一些公開炮集記錄數據包含地震道道頭信息,因此首先需要剝離道頭信息,剝離之后再對其進行不同輔助噪聲的增加,增加噪聲的多樣性。
??地震數據切片:對無噪聲數據和含噪聲數據采用相同的方式,在炮集記錄的高、寬方向滑動一定的步長, 該種方式切片可以是數據具有一定的相似度,從而得到同一個位置的特征和標簽,增加了數據的豐富度。
- 類似的數據集可點擊鏈接:https://wiki.seg.org/wiki/Open_data;
3.2.2 模型構建
??假設無噪聲數據為 x x x,每個像素都有一個噪聲偏量 v v v,得到的含噪數據(觀測數據)為 y y y,即:
y = x + v (1) y =x + v \tag{1} y=x+v(1)
??去噪任務的目的,就是根據噪聲圖像 y = x + v y =x + v y=x+v會付出干凈圖像的過程。
??DnCNN在VGG的基礎上進行修改,網絡結構是(卷積、BN、 ReLU) 級聯的結構,模型內部并不像ResNet一樣存在跳躍連接,而是在網絡的輸出使用殘差學習。殘差學習策略是指在網絡中輸入含有噪聲的觀測圖片,通過網絡的隱藏層隱式地移除干凈圖片,以噪聲數據作為輸出(于四偉等, 2021)。于四偉老師提出的網絡結構如圖8所示。
??該模型的輸入為一個40x40大小的信號,第1層卷積層(Convolution)的卷積核大小設置為 3×3,卷積的步長(Strides)設置為 1,卷積核的數量為 64,激活函數采用ReLu。第2~16層在每次卷積方式同第一層一樣,增加了批歸一化(Batchnormalization),對數據中心做偏移處理,用于加快網絡的收斂速度使特征圖的大小和輸入相等,避免因為卷積而損失特征,然后再用激活函數ReLu。最后一層卷積層的卷積核大小也設置為 3*3,卷積核的數量為 1(合并通道數),此時的結果是信號,最后用輸入數據減去此時結果,就得到了噪聲(殘差學習) 。
??根據噪聲圖像 y = x + v y=x+v y=x+v,殘差訓練可表示三維根據噪聲圖像 R ( y ) = v ′ ≈ v R(y) = v^{'} \approx v R(y)=v′≈v
- 損失函數:
L ( θ ) = 1 2 M ∑ i = 1 M ∥ R ( y i ; θ ) ? ( y i ? x i ) ∥ F 2 (2) L(\theta) = \frac{1}{2M} \sum_{i=1}^{M} \Vert R\left(y_{i};\theta\right) - \left(y_{i}-x_{i} \right) \Vert_{F}^{2} \tag{2} L(θ)=2M1?i=1∑M?∥R(yi?;θ)?(yi??xi?)∥F2?(2)
源碼為:L(\theta) = \frac{1}{2M} \sum_{i=1}^{M} \Vert R\left(y_{i};\theta\right) - \left(y_{i}-x_{i} \right) \Vert_{F}^{2} \tag{2};
其中, θ \theta θ 是可訓練的參數。
3.2.3 訓練網絡
- 搭建網絡:利用Pytorch或TensorFlow搭建深度學習框架;
- 訓練網絡:訓練過程中查看訓練集、驗證集損失函數的最小值,以及測試集在評估指標上的最大值;
S N R = 10 log ? 10 ( ∑ i = 1 N ∑ j = 1 M ( X ( i , j ) ? x ˉ ) 2 ∑ i = 1 N ∑ j = 1 M ( Y ( i , j ) ? X ( i , j ) ) 2 ) (3) SNR = 10 \log_{10} \left( \frac{\sum_{i=1}^{N} \sum_{j=1}^{M} \left( X \left( i,j \right) - \bar{x} \right)^{2}}{\sum_{i=1}^{N} \sum_{j=1}^{M} \left( Y \left( i,j \right) - X \left( i,j \right) \right)^{2}} \right) \tag{3} SNR=10log10?(∑i=1N?∑j=1M?(Y(i,j)?X(i,j))2∑i=1N?∑j=1M?(X(i,j)?xˉ)2?)(3)
3.3 基于DnCNN的地震數據去噪實驗
??基于模塊化的設計思路,將深度學習研究變成易操作的流水線作業。代碼模塊化的意義在于:可以讓后面的研究可以專注于修改神經網絡模型(調結構或換網絡),不用花費大量時間在其他的基礎工作上,方便后期的研究和代碼的維護。
??本工程一共有data、model、utils三個文件夾:
- data文件夾:實驗數據;sgy_data中synthetic.sgy是一個30炮干凈的地震記錄,運行utils/sgy-nyp.py這個代碼,可以將這個sgy文件分割成單炮的地震記錄,并且去除道頭,只保留了地震道信息,同時對30炮地震記錄加入隨機噪聲;無噪聲數據存儲在clean文件夾中,含噪聲數據存儲在noise文件夾中。然后運行utils/GetPatches.py代碼,將含噪聲和干凈的炮集記錄,切分為一些列64*64大小的patches,并且使用了數據增強;含噪聲數據patches作為特征放在feature文件中,干凈數據patches作為標簽放在label文件中,這樣就完成了數據集的制作。
- model文件夾:網絡模型、網絡預測、網絡信念以及最佳網絡模型(pth文件);dncnn是網絡架構文件,這里的DNCNN輸出的是殘差,運model/train.py文件,通過utils/dataset.py自定義加載數據集,并且按照8:1:1劃分數據集,每訓練一次就會驗證并測試一次。訓練和驗證用的loss會保存到loss_sets.txt文件中,測試用的評估指標是信噪比,結果將保存到snr_sets.txt文件中,訓練時間.txt記錄的是訓練用的時間;
- utils文件夾:數據集切片程序、數據集加載、數據繪圖、信號處理工具包;utils/SignalProcess中有信噪比,傅里葉分析,f-k分析,各種濾波方法,用于驗證網絡結果好壞;
四、小結
4.1 存在的問題及解決
??在這段時間中,遺忘了之前的一些概念,有點模模糊糊。
??1.疊前地震數據 如何理解?
??疊前地震數據是指在地震數據處理中,對常規水平疊加之前的地震數據進行偏移處理所得到的數據。這些數據包含了豐富的地震信息,且具有較高的精度,因此在解決地層傾角大或者構造復雜地區的問題時非常實用。然而,疊前數據處理過程相對復雜,所需時間也較長。
??疊前地震信號是指多個一維地震信號按照入射角或者方位角排列形成的高維數據集合,也稱為疊前道集。與之相對,疊后地震數據是通過將疊前地震信號以一定方法疊加起來形成的,這種方式增加了地震信號的信噪比,但可能會降低分辨率,并丟失疊前信號中的道間變化特征。
??2. 數據先驗信息怎么理解?
??地震數據的先驗信息是指在獲得地震樣本或模型之前,已經存在的經驗、可參考的歷史資料或其他相關信息。這些信息可以提供關于地下介質結構、性質和地震波傳播規律的初步了解。
??在地震數據處理和解釋中,先驗信息具有重要的作用。首先,它可以幫助建立合理的地下模型,從而更準確地預測地震波的傳播路徑和反射特征。
??其次,先驗信息還可以用來約束地震數據的處理過程,減少多解性和不確定性。例如,在地震反演中,可以利用先驗信息來設置合理的搜索范圍或約束條件,從而避免得到不合理的反演結果。
??此外,先驗信息還可以用來評估地震數據的可靠性和質量。通過與歷史資料或其他可靠數據的對比,可以判斷當前地震數據的準確性和可信度,從而為后續的數據處理和解釋提供更為可靠的依據。
??3. in-line和cross-line怎么理解?
??三維資料處理后,可以得到一個完整的、能反映地質體時空變化的三維數據體。由該數據體可以驗出全P的水平切片和垂直剖面圖供人員解釋。使用三維切片圖可分為:垂直剖面和水平切片。
- 拉剖面是沿垂直方向的剖面,一般垂直于構造的剖面為主測線(EFGH剖面)通常用Inline或Subline表示,為便于手工解釋,顯示的測線間隔一般為50m;
- 與主測線垂直的為聯絡測線(MNOP剖面)通常用Crossline表示,顯示的測線間隔可根據需要選擇。一般為20、50或100m,為確定地質層位,實現地震與地質直接對比而連接部分鉆井的測張.稱可并井測線通常用select profile表示。
- 主線一般情況下垂直于構造的走向,聯絡線沿著構造的走向。主測線上看構造的形態是最清楚的。
??4.數據增強包括哪些操作?為什么要進行數據增強?
??數據增強(Data Augmentation)是一種在機器學習和深度學習中常用的技術,主要目的是在不實質性增加數據的情況下,讓有限的數據產生等價于更多數據的價值。通常通過在已有數據的基礎上,應用一系列隨機變換來生成新的、但又保持標簽不變的樣本,從而增加數據集的多樣性和規模,提高模型的泛化能力。
??數據增強的主要方式包括旋轉、平移、縮放、裁剪、翻轉、顏色變換等,這些變換可以單獨或組合使用。例如,對于圖像數據,可以通過隨機裁剪、旋轉、調整亮度等操作來生成新的樣本;對于文本數據,可以通過同義詞替換、隨機插入、隨機刪除等方式來增加數據的多樣性。
??數據增強是一種低成本和有效的方法,可以顯著提高機器學習模型的性能和準確性,特別是在訓練數據有限的情況下。然而,需要注意的是,對于一些復雜的任務和數據分布,單純的數據增強可能無法取得理想的效果。因此,在使用數據增強時,需要根據具體任務和數據特點來選擇合適的變換方式和參數設置。
??5.如何提高深度學習代碼能力?
- 實現了巨多的深度學習模型:https://github.com/lucidrains
- 一行行進行代碼模型解讀:https://nn.labml.ai/
4.2 下周安排
??1.完善開題報告書,準備開題答辯
??2.思考:先進行數據增強,再反演會不會效果好一些呢?
??3.找到了一些即插即用的模塊,但是在訓練過程中,5000個數據如何判斷他們效果的好壞呢?會不會數據量增大之后,效果反而降低?