Open rongtongxueya opened 1 year ago
一直没有看issue,不好意思。我针对这几个问题分别回答。
generate_training_data
,调用rasterio.mask
提取目标区域的影像值。不好意思,我又来了,我详细的阅读了您的代码之后,我一直困惑一个参数“sequencelength”,我看您回复我的这个“如果是 34 张 3 波段tif 影像截取后的相关影像,.shp 文件覆盖了 1994 个像元,那么最后的 csv 的尺寸为(1994, 103)。”这应该是整个周期内的所有影像在波段维度上进行了叠加,但是如果是叠加之后呢数据为啥会变成NTD,N是样本数量1994,D是102,那这个T应该是多少呢 def get_model(model, ndims, num_classes, sequencelength, device, hyperparameter): if model == "OmniScaleCNN": model = OmniScaleCNN(input_dim=ndims, num_classes=num_classes, sequencelength=sequencelength, hyperparameter).to(device) elif model == "LSTM": model = LSTM(input_dim=ndims, num_classes=num_classes, hyperparameter).to(device) elif model == "StarRNN": model = StarRNN(input_dim=ndims, num_classes=num_classes, bidirectional=False, use_batchnorm=False, use_layernorm=True, device=device, hyperparameter).to(device)
# model = InceptionTime(input_dim=ndims, num_classes=num_classes, device=device,
# **hyperparameter).to(device)
elif model == "MSResNet":
model = MSResNet(input_dim=ndims, num_classes=num_classes, **hyperparameter).to(device)
elif model == "TransformerModel":
model = TransformerModel(input_dim=ndims, num_classes=num_classes, activation="relu", **hyperparameter).to(device)
elif model == "TempCNN":
model = TempCNN(input_dim=ndims, num_classes=num_classes, sequencelength=sequencelength, **hyperparameter).to(device)
else:
raise ValueError("invalid model argument.")
#完成模型的初始化
return model
训练模型涉及到两次维度转换,第一次是生成数据集、第二次是数据集的训练。在生成数据集时,因为csv表格只支持二维数据,所以将影像的数量(即时间序列的长度)与单个影像的波段数融合成一个维度。然后在数据集的训练中,又将这个维度拆分成影像的数量与单个影像的波段数。所以这里的sequencelength
代表的是影像的数量。
非常感谢您愿意回答我。那其实我没明白,你看这个训练数据,那其实在波段维度进行了叠加之后,sequencelength直接设置成1也可以吧,直接不用转换成C*T了,这个T直接设置成1也可以吗还是那样会造成一些不好的结果(比如影响精度等)
哈哈,这就不是我能回答的了。这个库的核心是MarcCoru的BreizhCrops库中的时间序列模型,我fork过来之后加入了部分数据处理的代码,来适配时间序列模型的输入输出格式,至于为什么要转换成C*T,应该跟模型的训练机制有关。
我可能要冒昧的请教您,我看了您上一个代码关于高分影像农作物分类的代码,我想请教您这个时间序列的数据集是如何制作的呢?难道是一整年度的影像对应一个shp的分类样本数据吗?难道一整年中shp对应的块种类不会变吗?上个代码我debug之后是(1994,34,3),我想询问一下您这个1994和34对应的是?1994代表每个类别都是1994个样本吗,一共所有tif中的改类别的块数吗?34是时间序列34张tif吗?