STANet训练时在计算损失函数阶段出现的tar和pred的shape不匹配问题
作者您好!
我在训练STANet时出现了在计算损失函数阶段tar和pred的shape不匹配问题(我没有对核心代码做过修改),报错信息如下:
然后我打断点进行排查: 在 src/impl/trainers/cd_trainer.py 的 train_epoch 方法中定位到 pred = self._process_model_out(out) 这行代码(见下图),此时 out 的 shape 为 [batch, 64, 256, 256]
紧接着代码跳到 src/impl/trainers/cd_trainer_metric.py 的 _process_model_out 方法(见下图),此时执行 out.squeeze(1) ,但是 out 的 shape 为 [batch, 64, 256, 256] ,所以 out.squeeze(1) 不会对 out 做任何操作,out 的 shape 仍为 [batch, 64, 256, 256]
然后代码跳到 src/impl/trainers/cd_trainer_metric.py 中计算损失函数(见下图),此时 tar 的 shape 为 [batch, 256 , 256] ,但 pred 的 shape 为 [batch, 64, 256, 256] 所以直接进行乘法运算就出现了错误
想请教下作者这个问题该如何解决,是否需要对代码做些改动?
@Bobholamovic 求作者解答一下,感激不尽!
使用的配置文件和数据集都是默认的吗
使用的配置文件和数据集都是默认的吗
数据集用的SYSU,前后时相图像是3通道256×256的,标签是单通道的黑白图
配置文件是直接复制了原有的配置文件,没做修改,具体如下:
config_sysu.yaml # Basic configurations on SYSU dataset
# Data dataset: SYSU num_workers: 2 repeats: 5 subset: val crop_size: 256
# Optimizer optimizer: Adam lr: 0.0004 weight_decay: 0.0 load_optim: False save_optim: False sched_on: True schedulers: - name: StepLR step_size: 15 gamma: 0.2
# Training related batch_size: 4 num_epochs: 30 resume: '' anew: False device: cuda
# Experiment exp_dir: ../exp/ # tag: '' # suffix: '' # DO NOT specify exp_config debug_on: False inherit_off: False log_off: False track_intvl: 10 tb_on: False tb_intvl: 500 suffix_off: True save_on: False out_dir: ''
# Criterion criterion: WNLL weights: - 0.5 # Weight of no-change class - 0.5 # Weight of change class
# Model model: out_type: logits2
config_sysu_stanet.yaml # SYSU+STANet
out_dir: stanet criterion: BC model: STANet out_type: dist
stanet_model: in_ch: 3 width: 64 att_type: PAM ds: 1 threshold: 1
这个数据集我没有尝试过,建议可以看看配置中哪些配置项会影响最终输出以及标签的形状,然后确认下是否都设置为正确的值。