一、代码理解
目的:设计思路(根据)
【主程序】多进程,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(弹性变换)是一种数据增强技术,特别适用于图像数据集的增强。它通过模拟图像的物理弹性变形来增加数据的多样性,有助于提高深度学习模型的泛化能力。以下是使用弹性变换进行数据增强的一些关键点:
-
原理:弹性变换通过在图像上应用随机生成的位移场来模拟弹性变形。位移场通常是通过高斯分布生成的随机向量,然后使用高斯滤波器进行平滑处理。
-
参数:弹性变换的两个关键参数是
alpha
和sigma
。alpha
控制位移的大小,而sigma
控制高斯滤波器的平滑程度。 -
应用:弹性变换可以应用于医学图像分析、手写识别、自然语言处理等领域,以增加数据集中样本的多样性。
-
实现:在Python中,可以使用像PyTorch这样的深度学习框架来实现弹性变换。例如,
torchvision.transforms
模块提供了ElasticTransform
类,可以轻松地将弹性变换应用到图像数据上。 -
效果:弹性变换能够模拟图像的复杂变形,包括拉伸、压缩和扭曲,这有助于模型学习到更加鲁棒的特征表示。
-
与其他数据增强技术的比较:与传统的旋转、翻转或裁剪等数据增强技术相比,弹性变换可以引入更复杂的图像变形,从而更有效地提高模型对图像变形的适应能力。
-
使用注意事项:在使用弹性变换时,需要仔细调整
alpha
和sigma
的值,以确保生成的图像既具有多样性,又不会失去重要的视觉信息。
通过使用弹性变换,可以有效地扩充图像数据集,提高模型对新情况的适应性,从而在各种视觉识别任务中取得更好的性能。——此弹性非彼弹性(不是弹性波,只是图像上的扰动)
- Mapping文献中,高斯随机场用于产生横向平滑模型的坐标偏移目的:
- 水平方向的大相关半径- -为保持其近乎水平层状
- 垂直方向上的小相关半径- -为使其代表不同的分层场景
- 水平分量和垂直分量的参数相同,但场不同
- 大的垂直位移和小的水平位移- -为保持其横向缓慢变化
下一步工作
1.了解Seismic Unix(SU)工具集。
2.把cmp输入数据的形式和处理目的理解清楚,把速度分析和地震反演两个问题的网络合理结合,目的是将其作为深度网络的输入数据。
需要理解的资料主要是有openfwi数据集所提到的3种网络。