Real-World Super-Resolution via Kernel Estimation and Noise Injection(realSR)代码怎么跑起来?

论文名称:Real-World Super-Resolution via Kernel Estimation and Noise Injection

代码地址:

https://github.com/Tencent/Real-SR

环境配置

可以按照仓库中给的库版本进行配置,也可以搜索basicSR的代码,配置basicSR环境

跑track1的代码

要运行这两个文件,首先要在path.yml中将路径修改,格式如下:

df2k:
  tdsr:
    source: '../../ntire20/Corrupted-tr-x'
    target: '../../ntire20/Corrupted-tr-y'
    valid:
datasets:       # 输出的目录
  df2k: '../datasets/DF2K'

确定输入输出路径:

输入:source是低分辨率图片,而target是高清图片。在df2k中:Corrupted-tr-x是NEIRE中的source data Corrupted-tr-y是高清的target data

输出:dataset:下的内容

如果是自己的数据集还有修改create_bicubic_dataset.py中的程序

因为还要将路径从yml文件中读取出来,赋值给变量

也是仿照tf2k的写法就可以了

elif opt.dataset == 'hcp':          # 通过读取yaml文件指定路径,这个也是通过键值对的形式,df2k就是有LR,HR对的,else里面是没有的那一种
    path_sdsr = PATHS['datasets']['hcp'] + '/generated/sdsr/'
    path_tdsr = PATHS['datasets']['hcp'] + '/generated/tdsr/'
    input_source_dir = PATHS['hcp']['tdsr']['source']
    input_target_dir = PATHS['hcp']['tdsr']['target']
    source_files = [os.path.join(input_source_dir, x) for x in os.listdir(input_source_dir) if utils.is_image_file(x)]
    target_files = [os.path.join(input_target_dir, x) for x in os.listdir(input_target_dir) if utils.is_image_file(x)]

然后开始下采样和采集噪声

create_bicubic_dataset.py 会进行下采样,然后,对源域和目标域进行下采样。

python3 ./preprocess/create_bicubic_dataset.py --dataset df2k --artifacts tdsr

这一步回创建dataset文件夹中的/generated/tdsr/中的hr和lr

collect_noise.py 好像就是把图像变成灰度,然后随机裁剪保留高频?

python3 ./preprocess/collect_noise.py --dataset df2k --artifacts tdsr

同样在运行这个程序的时候也要将collect_noise.py 中的路径更改

然后运行训练程序即可

bug:

https://github.com/Tencent/Real-SR/issues/16

按照方法2解决了

bug

ValueError: Required crop size (80, 80) is larger then input image size (50, 50)

self.noises = noiseDataset(opt['noise_data'], opt['GT_size']/opt['scale'])

这里是决定crop_size的

RuntimeError: The size of tensor a (192) must match the size of tensor b (96) at non-singleton dimension 3

应该是scale改了2但是没有起作用,还是4x超分了

RuntimeError: mat1 and mat2 shapes cannot be multiplied (16x4608 and 8192x100)

论文的判别器一定要是128或者是256.这可咋整

只能将<128的图片去掉

要求noise_img也大于64

<think>嗯,用户遇到了一个ValueError,错误信息是“Target size must be the same as input size”。我需要仔细分析这个问题,找出可能的原因和解决方法。首先,这个错误通常发生在使用PyTorch进行深度学习模型训练的时候,尤其是在计算损失函数时,比如交叉熵损失(CrossEntropyLoss)或者均方误差损失(MSELoss)。接下来,我得回忆一下常见的触发场景。 首先,输入和目标的形状不匹配可能是主要原因。比如,CrossEntropyLoss期望的输入是未经归一化的原始分数(logits),形状通常是(batch_size, num_classes),而目标应该是(batch_size)的标签,每个元素是类别的索引。如果目标被错误地做成了one-hot编码,形状可能变成(batch_size, num_classes),这时候就会报错。这时候需要检查目标的形状,确保是1D的张量,或者使用squeeze()去掉多余的维度。 其次,模型的输出可能不符合预期。例如,模型最后没有正确的输出层,导致输出维度与类别数不符。比如,分类任务中,模型的最后一层应该输出num_classes个节点,如果输出节点数不对,输入损失函数时就会形状不匹配。这时候需要检查模型的输出层,确认输出维度是否正确。 另外,数据预处理的问题也可能导致形状不一致。比如图像任务中,输入图像可能被错误地调整了尺寸,导致模型输出的特征图尺寸与目标尺寸不符。这时候需要检查数据预处理步骤,确保输入和目标的尺寸匹配。 还有,损失函数的选择是否正确。比如,使用MSELoss时,输入和目标的形状必须完全相同,而CrossEntropyLoss则对形状有特定要求。如果选错了损失函数,或者输入与损失函数的要求不符,就会报错。需要确认损失函数是否适合当前任务,并检查输入和目标的形状是否符合该损失函数的要求。 此外,批量处理时可能存在不一致的情况。比如,某些样本被错误地处理,导致在一个批次中出现不同的形状。这时候需要检查数据加载器,确保每个批次的数据形状一致。 总结下来,解决这个问题的步骤大致是:首先打印输入和目标张量的形状,确认是否匹配;然后检查模型输出层的维度是否正确;接着检查数据预处理流程;再核对损失函数的选择是否符合预期;最后确保批量处理的数据一致性。通过这些步骤,逐步排查问题所在,并进行相应的调整,应该能够解决这个ValueError。</think>在PyTorch中遇到`ValueError: &#39;Target size must be the same as input size&#39;`错误时,通常是因为**损失函数输入张量(模型输出)与目标张量的形状不匹配**。以下是逐步排查和解决方法: --- ### 1. 明确错误场景 常见于以下损失函数: - **交叉熵损失**(`CrossEntropyLoss`):输入应为 `(batch_size, num_classes)`,目标应为 `(batch_size)` 的类别索引。 - **均方误差损失**(`MSELoss`):输入和目标的形状必须完全相同。 --- ### 2. 检查张量形状 **步骤:** 1. **打印输入和目标张量的形状**: ```python print("Input shape:", outputs.shape) # 模型输出 print("Target shape:", targets.shape) # 真实标签 ``` 2. **对比形状差异**: - 例如:若输出是 `(batch_size, 10)`(10分类任务),但目标是 `(batch_size, 1)`,需将目标压缩为 `(batch_size)`: ```python targets = targets.squeeze() # 删除多余的维度 ``` - 若目标是one-hot编码(如 `(batch_size, num_classes)`),需转换为类别索引: ```python targets = torch.argmax(targets, dim=1) ``` --- ### 3. 检查模型输出层 **问题原因**: - 模型最后一层输出维度与类别数不符。 **示例修正**: - 分类任务中,若类别数为5,最后一层应为: ```python self.fc = nn.Linear(hidden_dim, 5) # 输出维度=类别数 ``` --- ### 4. 检查数据预处理 **图像任务示例**: - 若输入图像尺寸为 `224x224`,但目标(如分割掩码)被错误调整为 `112x112`,需确保输入和目标的尺寸一致: ```python transform = transforms.Compose([ transforms.Resize((224, 224)), # 调整输入 transforms.ToTensor(), ]) ``` --- ### 5. 核对损失函数选择 **常见要求**: - **`CrossEntropyLoss`**: 输入形状:`(batch_size, num_classes)` 目标形状:`(batch_size)` 无需对输入做softmax(损失函数内部已处理)。 - **`BCEWithLogitsLoss`**: 输入形状:`(batch_size, *)`(未归一化的概率) 目标形状:`必须与输入相同`。 --- ### 6. 示例修正代码 **错误代码**: ```python outputs = model(inputs) # shape=(32, 10) targets = torch.randn(32, 1) # shape=(32, 1) loss = criterion(outputs, targets) ``` **修正方法**: ```python outputs = model(inputs) # shape=(32, 10) targets = torch.randint(0, 10, (32,)) # shape=(32,) loss = criterion(outputs, targets) ``` --- ### 总结 1. **打印形状**:确认输入和目标的维度。 2. **调整维度**:使用`view()`、`squeeze()`或`unsqueeze()`对齐形状。 3. **检查模型**:确保输出层维度匹配任务需求。 4. **核对数据流**:确保预处理后的数据形状一致。 通过逐步排查输入、目标和模型的形状,即可定位并解决该问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值