利用samples数据集跑通STANet

该文描述了一个使用Python进行深度学习模型训练的流程,包括使用GPU或CPU,设置学习率,以及在训练完成后如何进行验证和测试。当学习率收敛到0时,训练停止。测试阶段涉及创建测试数据集,加载模型并进行预测,最后保存预测结果。
摘要由CSDN通过智能技术生成

训练

命令

python ./train.py --gpu_ids -1 --num_threads 0 --save_epoch_freq 1 --dataroot ./samples --val_dataroot ./samples --name samples --lr 0.001 --model CDF0 --SA_mode PAM --batch_size 2 --load_size 256 --crop_size 256 --preprocess rotate_and_crop

注意–gpu_ids -1 的意思是利用CPU
如果遇见下面的错误,请参考here

IndexError: boolean index did not match indexed array along dimension 0; dimension is 4194304 but corresponding boolean dimension is 65536

学习率收敛到0时,即停止
在这里插入图片描述

验证

测试

修改val.py,改成测试代码,我在这里重新建一个,命名为test_run.py

from options.test_options import TestOptions
from data import create_dataset
from models import create_model
import numpy as np
from util.util import mkdir
from util.util import save_images

def make_test_opt(opt):

    # hard-code some parameters for test
    opt.num_threads = 0   # test code only supports num_threads = 1
    opt.batch_size = 1    # test code only supports batch_size = 1
    opt.serial_batches = True  # disable data shuffling; comment this line if results on randomly chosen images are needed.
    opt.no_flip = True    # no flip; comment this line if results on flipped images are needed.
    opt.no_flip2 = True    # no flip; comment this line if results on flipped images are needed.

    opt.display_id = -1   # no visdom display; the test code saves the results to a HTML file.
    opt.phase = 'test'
    opt.preprocess = 'none1'
    opt.isTrain = False
    opt.aspect_ratio = 1
    opt.eval = True

    return opt

def prdeict(opt):

    dataset = create_dataset(opt)  # create a dataset given opt.dataset_mode and other options
    model = create_model(opt)      # create a model given opt.model and other options
    model.setup(opt)               # regular setup: load and print networks; create schedulers
    # save_path = os.path.join(opt.checkpoints_dir, opt.name, '%s_%s' % (opt.phase, opt.epoch)) # ./checkpoints/samples/test_epoch
    save_path = 'samples/output'
    mkdir(save_path)

    model.eval()
    for i, data in enumerate(dataset):
        # data的结构
        '''{'A': A, 'A_paths': A_path,
            'B': B, 'B_paths': B_path}'''
        model.set_input(data)  # unpack data from data loader
        pred = model.test(val=False)  # run inference return pred
        # print('pred=='+str(type(pred)))
        img_path = model.get_image_paths()     # get image paths
        # print('img_path=='+str(img_path))
        # print('save_path==' + str(save_path))
        save_images(pred, save_path, img_path)


if __name__ == '__main__':
    opt = TestOptions().parse()   # get training options
    opt = make_test_opt(opt)
    opt.phase = 'test' # 测试阶段
    opt.dataroot = 'samples'
    opt.dataset_mode = 'changedetection'
    opt.n_class = 2
    opt.SA_mode = 'PAM'
    opt.arch = 'mynet3' # 特征提取器架构
    opt.model = 'CDF0' # CDF0|CDFA
    opt.name = 'samples' # 保存路径的名字
    opt.results_dir = './results/'
    opt.epoch = '189_F1_1_0.95515' # 最佳模型的名字,去掉了_net_F.pth
    opt.num_test = np.inf

    opt.gpu_ids = False # 因为训练用的是CPU,然后,这里不能写-1
    # opt.istest = True # 判断是否为测试过程,适用于没有标签的情况;修改一点点代码,就不再需要这一个标签了,加上也无妨。
    prdeict(opt)

如果出现报错

pred是nonetype,空类型

需要修改CFD0的test函数,因为在val为False时,没有给出返回值

    def test(self, val=False):
        """Forward function used in test time. 在测试时间中使用的正向功能。
        这个函数将<forward>函数封装在no_grad()中,这样我们就不会为反向运算保存中间步骤
        This function wraps <forward> function in no_grad() so we don't save intermediate steps for backprop
        It also calls <compute_visuals> to produce additional visualization results
        """
        with torch.no_grad():
            self.forward()
            self.compute_visuals()
            if val:  # score
                from util.metrics import RunningMetrics
                metrics = RunningMetrics(self.n_class) # n_class是2,标签分为两类
                pred = self.pred_L.long()
                # detach()返回一个新的从当前图中分离的Variable
                metrics.update(self.L.detach().cpu().numpy(), pred.detach().cpu().numpy())
                scores = metrics.get_cm()
                return scores
            #增加下面两行
            else: #自己的加的
                return self.pred_L.long()

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weightOneMillion

感谢未来的亿万富翁捧个钱场~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值