网络结构
InversionNet构建了一个具有编码器与解码器的端到端卷积神经网络结构,以模拟地震数据与速度模型之间的关系。
输入地震数据的通道数为6,时间维度为1000,表示为
(
6
,
1000
,
32
)
(6, 1000, 32)
(6,1000,32),编码器将特征调整为
(
512
,
1
,
1
)
(512, 1, 1)
(512,1,1)的形式,最后解码器将其拟合为
(
1
,
75
,
75
)
(1, 75, 75)
(1,75,75)的速度模型。
编码器
输入数据为 ( 6 , 1000 , 32 ) (6, 1000, 32) (6,1000,32),应先将时间域降维至32,之后两个维度一起降维。
self.convblock1 = ConvBlock(5, dim1, kernel_size=(7, 1), stride=(2, 1), padding=(3, 0))
self.convblock2_1 = ConvBlock(dim1, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))
self.convblock2_2 = ConvBlock(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))
self.convblock3_1 = ConvBlock(dim2, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))
self.convblock3_2 = ConvBlock(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))
self.convblock4_1 = ConvBlock(dim2, dim3, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))
self.convblock4_2 = ConvBlock(dim3, dim3, kernel_size=(3, 1), padding=(1, 0))
x = self.convblock1(x) # (None, 32, 500, 32)
x = self.convblock2_1(x) # (None, 64, 250, 32)
x = self.convblock2_2(x) # (None, 64, 250, 32)
x = self.convblock3_1(x) # (None, 64, 125, 32)
x = self.convblock3_2(x) # (None, 64, 125, 32)
x = self.convblock4_1(x) # (None, 128, 63, 32)
x = self.convblock4_2(x) # (None, 128, 63, 32)
单方向降维后进行两个维度同时降维,由 ( 128 , 32 , 32 ) (128, 32, 32) (128,32,32)降至 ( 512 , 1 , 1 ) (512, 1, 1) (512,1,1),代码同理。
解码器
解码部分则是将 ( 512 , 1 , 1 ) (512, 1, 1) (512,1,1)升维至 ( 1 , 80 , 80 ) (1, 80, 80) (1,80,80),后通过裁剪拟合为 ( 1 , 75 , 75 ) (1, 75, 75) (1,75,75)的速度模型。
self.deconv1_1 = DeconvBlock(dim5, dim5, kernel_size=5)
self.deconv1_2 = ConvBlock(dim5, dim5)
self.deconv2_1 = DeconvBlock(dim5, dim4, kernel_size=4, stride=2, padding=1)
self.deconv2_2 = ConvBlock(dim4, dim4)
self.deconv3_1 = DeconvBlock(dim4, dim3, kernel_size=4, stride=2, padding=1)
self.deconv3_2 = ConvBlock(dim3, dim3)
self.deconv4_1 = DeconvBlock(dim3, dim2, kernel_size=4, stride=2, padding=1)
self.deconv4_2 = ConvBlock(dim2, dim2)
self.deconv5_1 = DeconvBlock(dim2, dim1, kernel_size=4, stride=2, padding=1)
self.deconv5_2 = ConvBlock(dim1, dim1)
self.deconv6 = ConvBlock_Tanh(dim1, 1)
x = self.deconv1_1(x) # (None, 512, 5, 5)
x = self.deconv1_2(x) # (None, 512, 5, 5)
x = self.deconv2_1(x) # (None, 256, 10, 10)
x = self.deconv2_2(x) # (None, 256, 10, 10)
x = self.deconv3_1(x) # (None, 128, 20, 20)
x = self.deconv3_2(x) # (None, 128, 20, 20)
x = self.deconv4_1(x) # (None, 64, 40, 40)
x = self.deconv4_2(x) # (None, 64, 40, 40)
x = self.deconv5_1(x) # (None, 32, 80, 80)
x = self.deconv5_2(x) # (None, 32, 80, 80)
x = F.pad(x, [-5, 0, -5, 0], mode="constant", value=0)
# (None, 32, 75, 75) 125, 100
x = self.deconv6(x) # (None, 1, 75, 75)
拟合结果:
评价指标
InversionNet的末端采用的标准损失函数是ℒ_1规范的损失函数
𝑦_𝑖 是真实速度模型, 𝑧_𝑖 预测速度模型 𝑛是速度模型中空间像素的数量. 输出的最后, 我们会裁剪输出层以符合目标速度模型的大小。
但是使用 ℒ_1损失训练的 CNN 无法完全捕捉速度模型的结构特征, 因为它没有对每个位置之间的相互作用进行建模. 为了更好地反映地质特征, 即速度在每个地下层内保持一致, 我们构建了一个局部连接的 CRF (Conditional Random Fields) 来改进 CNN 预测的速度模型。