周报0624-0701--输入CMP数据的准备

一、代码理解

目的:设计思路(根据)
【主程序】多进程,linux,tensorflow
随机生成速度模型的显示颜色,位置,大小
训练的多进程安排
创建目录、环境变量,来存储CMP地震数据
定义变量,来控制程序的生成和训练

先是生成速度模型->正演数据集
建立网络(在jupyter notebook)->训练网络->测试网络

【CNN】
1.利用 Seismic Unix(SU)工具集。将模型分解为CMP(Common Mid-Point)集合,并进行可视化。——没明白怎么分解的

 # sort into cmp gathers and discard odd cmps
    print(f"sfshot2cmp < shots_decimated.rsf half=n | sfwindow j3=2 min3={(-gxbeg+2*sxbeg)*dx} max3={(Nx-(2*sxbeg))*dx} > {shots_out}")
    cmd(f"sfshot2cmp < shots_decimated.rsf half=n | sfwindow j3=2 min3={(-1.5*gxbeg+1.5*sxbeg)*dx} max3={(Nx-(2.5*sxbeg-.5*gxbeg))*dx} > {shots_out}")

2.将地震数据转化成多个CMP输入(10炮)——没明白怎么转化的

# expand to multiple CMPs as channels in input
def make_multi_CMP_inputs(X_data, T_data, nCMP, n_models=1):
    # first we prepare array for X_data_multi_CMP
    X_data_multi_CMP = np.zeros((n_models, 
                                 X_data.shape[0]//n_models-nCMP+1,
                                 X_data.shape[1],
                                 X_data.shape[2],
                                 nCMP))//5D 数据
    
    # add model dimension
    X_data = X_data.reshape(n_models, X_data.shape[0]//n_models, X_data.shape[1], X_data.shape[2], 1)
    T_data = T_data.reshape(n_models, T_data.shape[0]//n_models, T_data.shape[1])
    
    for i in range(nCMP-1):
        print(i)
        #print(np.shape(X_data_multi_CMP))
        #print(np.shape(X_data))
        #print(nCMP)
        #print(-nCMP+i+1)
        X_data_multi_CMP[:,:,:,:,i] = X_data[:,i:-nCMP+i+1,:,:,0]//对原始地震数据做处理得到多通道的CMPs
        
    X_data_multi_CMP[:,:,:,:,nCMP-1] = X_data[:,nCMP-1:,:,:,0]
    
    if nCMP==1 :
        T_data_multi_CMP = T_data
    else :
        T_data_multi_CMP = T_data[:, (nCMP-1)//2 : -(nCMP-1)//2, :]
        
    X_data_multi_CMP = X_data_multi_CMP.reshape(X_data_multi_CMP.shape[0]*X_data_multi_CMP.shape[1], 
                                                X_data_multi_CMP.shape[2], 
                                                X_data_multi_CMP.shape[3],
                                                X_data_multi_CMP.shape[4])
    T_data_multi_CMP = T_data_multi_CMP.reshape(T_data_multi_CMP.shape[0]*T_data_multi_CMP.shape[1], 
                                                T_data_multi_CMP.shape[2])
                                                
    #print(-(nCMP+1)//2) print(np.shape(X_data_multi_CMP)) print(np.shape(T_data_multi_CMP))
    
    assert (X_data_multi_CMP.shape[0] == T_data_multi_CMP.shape[0])
    
    return X_data_multi_CMP, T_data_multi_CMP

nCMP = 1

X_scaled, T_scaled = make_multi_CMP_inputs(X_scaled, T_scaled, nCMP, n_models=random_model_repeat)

nCMP = 11

X_scaled_multi, T_scaled_multi = make_multi_CMP_inputs(X_scaled, T_scaled, nCMP, n_models=random_model_repeat)
plt_nb_T(T_data, dx=jgx*dx, dz=jlogz*dx, fname="../latex/Fig/T_data")

plt_nb_T(1e3*T_scaled, dx=jgx*dx, dz=jlogz*dx, fname="../latex/Fig/T_scaled")

3.地震数据的拼接(经过翻转再拼接)——但不理解为什么只要第一个和最后一个的拼接

plt_nb_T(1e3*np.concatenate((np.squeeze(X_scaled[sample_reveal-nCMP,:,:,-1]), np.flipud(np.squeeze(X_scaled[sample_reveal,:,:,0]))), axis=0),
        title="CMP first | CMP last", dx=200, dz=1e3*dt*jdt, 
        origin_in_middle=True, ylabel="Time(s)", fname="../latex/Fig/X_scaled")
print(np.shape(1e3*T_scaled[sample_reveal-(nCMP+1)//2:sample_reveal+(nCMP-1)//2:nCMP]))

使用 plt_nb_T 函数绘制了 X_scaled 数组中的特定样本。这个样本是将第 nCMP 个最后一个CMP的数据和第一个CMP的数据拼接在一起,然后放大1000倍(可能是为了清晰度,因为地震数据通常在很大的数量级上)。

np.squeeze(…):
使用 NumPy 的 squeeze 函数去除数组中的单维度条目(即去除大小为1的维度)

plt_nb_T(1e3*np.concatenate((np.squeeze(X_data_cut[sample_reveal-nCMP,:,:,-1]), np.flipud(np.squeeze(X_data_cut[sample_reveal,:,:,0]))), axis=0),
        title="CMP first | CMP last", dx=200, dz=1e3*dt*jdt, 
        origin_in_middle=True, ylabel="Time(s)", fname="../latex/Fig/X_muted")

title=“CMP first | CMP last”:
设置图表的标题,表示图表展示了第一个和最后一个CMP的数据。

np.concatenate(…, axis=0):
使用 NumPy 的 concatenate 函数沿 axis=0 将两个数组拼接在一起。这里拼接的是特定样本的最后一个CMP和翻转后的(翻转使用 np.flipud)第一个CMP的数据。

dx=200, dz=1e3dtjdt:
设置图表的水平和垂直采样间隔。dt 和 jdt 可能是之前定义的时间步长和某个时间缩放因子。

origin_in_middle=True:
设置图像原点在中间,这通常用于对称的图形表示。

ylabel=“Time(s)”:
设置Y轴标签为“Time(s)”,表示Y轴的单位是秒。

fname="…/latex/Fig/X_scaled":
设置保存图像的文件名。
在这里插入图片描述
4.架构

def create_model(inp_shape, out_shape, jlogz=jlogz):
    model = keras.models.Sequential()
    activation = 'relu'
    activation_dense = activation
    padding = 'same'
    dropout = 0.1
    model.add(Conv2D(filters=4, kernel_size=(5, 21), strides=(2,5), activation=activation, padding=padding, input_shape=inp_shape))       
    model.add(Dropout(dropout))
    model.add(Conv2D(filters=16, kernel_size=(7, 11), activation=activation, padding=padding))
    model.add(MaxPool2D([1,2]))
    model.add(Dropout(dropout))
    model.add(Conv2D(filters=32, kernel_size=(3, 11), activation=activation, padding="valid"))
    model.add(Dropout(dropout))
    model.add(Conv2D(filters=32, kernel_size=(3, 7), activation=activation, padding=padding))
    model.add(Dropout(dropout))
    model.add(Conv2D(filters=32, kernel_size=(5, 5), activation=activation, padding=padding))
    model.add(Dropout(dropout))
    model.add(Conv2D(filters=1, kernel_size=(7, 60), strides=(10,jlogz//2), activation="linear", padding=padding))
    model.add(Dropout(dropout))
    model.add(Flatten())
    
    #model.add(Dense(2*out_shape[0], activation=activation_dense))
    #model.add(Dense(out_shape[0], activation=activation_dense))
    #model.add(Dropout(0.1))
    #model.add(Dense(out_shape[0], activation='linear'))
    #model.add(Reshape(out_shape))

    model.compile(loss='mse',
                  optimizer=keras.optimizers.Nadam(),
                  metrics=['accuracy'])
    return model

二、问题

1.CNN得到的是频率,怎么生成的速度模型呢?好突然,
A:速度模型作为初始模型。经正演得到波形,频率指的是波形的高频、低频。
参考意义:生成数据的迭代阶段。凡是有速度模型,可以在此基础上去正演得到波形,利用波形的高频信息恢复/外推波形低频信息。由波形出发反演速度模型。

2.SimpleFWI中,波形和地震记录(raw data体现在哪)什么对应关系?
为什么作者反演的深度这么浅?
为什么从2-4Hz开始?这也不算高频呀?

3.Mapping中的
什么是“源中心频率为5Hz的全频段数据”?

4.不理解对第i个CMP处理在干嘛:X_data_multi_CMP[:,:,:,:,i] = X_data[:,i:-nCMP+i+1,:,:,0]?
输出X_data_multi_CMP为什么是这个样子?(10个CMP的原始数据)
在这里插入图片描述

三、已解答的问题

  • Elastic Transform(弹性变换)是一种数据增强技术,特别适用于图像数据集的增强。它通过模拟图像的物理弹性变形来增加数据的多样性,有助于提高深度学习模型的泛化能力。以下是使用弹性变换进行数据增强的一些关键点:
  1. 原理:弹性变换通过在图像上应用随机生成的位移场来模拟弹性变形。位移场通常是通过高斯分布生成的随机向量,然后使用高斯滤波器进行平滑处理。

  2. 参数:弹性变换的两个关键参数是 alphasigmaalpha 控制位移的大小,而 sigma 控制高斯滤波器的平滑程度。

  3. 应用:弹性变换可以应用于医学图像分析、手写识别、自然语言处理等领域,以增加数据集中样本的多样性。

  4. 实现:在Python中,可以使用像PyTorch这样的深度学习框架来实现弹性变换。例如,torchvision.transforms 模块提供了 ElasticTransform 类,可以轻松地将弹性变换应用到图像数据上。

  5. 效果:弹性变换能够模拟图像的复杂变形,包括拉伸、压缩和扭曲,这有助于模型学习到更加鲁棒的特征表示。

  6. 与其他数据增强技术的比较:与传统的旋转、翻转或裁剪等数据增强技术相比,弹性变换可以引入更复杂的图像变形,从而更有效地提高模型对图像变形的适应能力。

  7. 使用注意事项:在使用弹性变换时,需要仔细调整 alphasigma 的值,以确保生成的图像既具有多样性,又不会失去重要的视觉信息。

通过使用弹性变换,可以有效地扩充图像数据集,提高模型对新情况的适应性,从而在各种视觉识别任务中取得更好的性能。——此弹性非彼弹性(不是弹性波,只是图像上的扰动)

  • Mapping文献中,高斯随机场用于产生横向平滑模型的坐标偏移目的:
    • 水平方向的大相关半径- -为保持其近乎水平层状
    • 垂直方向上的小相关半径- -为使其代表不同的分层场景
    • 水平分量和垂直分量的参数相同,但场不同
    • 大的垂直位移和小的水平位移- -为保持其横向缓慢变化

下一步工作

1.了解Seismic Unix(SU)工具集。
2.把cmp输入数据的形式和处理目的理解清楚,把速度分析和地震反演两个问题的网络合理结合,目的是将其作为深度网络的输入数据。

需要理解的资料主要是有openfwi数据集所提到的3种网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值