2018再见,2019你好

作者: 快去上自习吧 | 来源:发表于2018-12-30 17:25 被阅读3次

    通过gdal库将矢量文件转化为栅格文件(shp2tiff)

    gdal.RasterizeLayer()

    1. 一种方式是给定像素大小, pixel_size = 1,再通过source_layer.GetExtent(),得到矢量的边界,但是此种方法得到的栅格图像不一定是你想要的大小,一般会小一些,因为矢量是通过函数计算图线边界,有兴趣具体可以百度一下,这里不做过多阐述.
    2. 第二种方式就是给定一张矢量对应的栅格图像,函数会自动将shp转化为给给定tiff的大小.
      具体如下:
    from osgeo import gdal,ogr,osr
    import glob
    
    templateTifFileName = r"D:\ai初\traintestmin\zaiqian.tif"
    print(templateTifFileName)
    # templateTifFileName ='22678915_15.tif'
    
    shpFileName = templateTifFileName[:-4]+'shp'
    outputFileName = templateTifFileName[:-1]
    data = gdal.Open(templateTifFileName, gdal.GA_Update)
    print(data)
    geo_transform = data.GetGeoTransform()
    x_min = geo_transform[0]
    y_min = geo_transform[3]
    
    # gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    # # 为了使属性表字段支持中文,请添加下面这句
    # gdal.SetConfigOption("SHAPE_ENCODING", "")
    
    x_res = data.RasterXSize
    y_res = data.RasterYSize
    mb_v = ogr.Open(shpFileName)
    mb_l = mb_v.GetLayer()
    pixel_width = geo_transform[1]
    target_ds = gdal.GetDriverByName('GTiff').Create(outputFileName, x_res, y_res, 1, gdal.GDT_Byte)
    target_ds.SetGeoTransform((x_min, pixel_width, 0, y_min, 0, -1 * pixel_width))
    band = target_ds.GetRasterBand(1)
    NoData_value = -999
    band.SetNoDataValue(NoData_value)
    band.FlushCache()
    gdal.RasterizeLayer(target_ds, [1], mb_l)
    target_ds = None
    

    使用GPU加速:cuda

    在PyTorch中以下数据结构分为CPU和GPU两个版本:

    • Tensor
    • nn.Module

    它们都带有一个.cuda方法,调用此方法即可将其转为对应的GPU对象。tensor.cuda会返回一个新对象,这个新对象的数据已转移至GPU,而之前的tensor还在原来的设备上(CPU)。而module.cuda则会将所有的数据都迁移至GPU,并返回自己。所以module = module.cuda()module.cuda()所起的作用一致。

    nn.Module在GPU与CPU之间的转换,本质上还是利用了Tensor在GPU和CPU之间的转换。nn.Module的cuda方法是将nn.Module下的所有parameter(包括子module的parameter)都转移至GPU,而Parameter本质上也是tensor(Tensor的子类)。

    pytorch使用gpu运行

    如果服务器具有多个GPU,tensor.cuda()方法会将tensor保存到第一块GPU上,等价于tensor.cuda(0)。此时如果想使用第二块GPU,需手动指定tensor.cuda(1),而这需要修改大量代码,很是繁琐。这里有两种替代方法:

    1. 一种是先调用t.cuda.set_device(1)指定使用第二块GPU,后续的.cuda()都无需更改,切换GPU只需修改这一行代码。
    2. 更推荐的方法是设置环境变量CUDA_VISIBLE_DEVICES,例如当export CUDA_VISIBLE_DEVICE=1(下标是从0开始,1代表第二块GPU),只使用第二块物理GPU,但在程序中这块GPU会被看成是第一块逻辑GPU,因此此时调用tensor.cuda()会将Tensor转移至第二块物理GPU。CUDA_VISIBLE_DEVICES还可以指定多个GPU,如export CUDA_VISIBLE_DEVICES=0,2,3,那么第一、三、四块物理GPU会被映射成第一、二、三块逻辑GPU,tensor.cuda(1)会将Tensor转移到第三块物理GPU上。

    设置CUDA_VISIBLE_DEVICES有两种方法,一种是在命令行中CUDA_VISIBLE_DEVICES=0,1 python main.py,一种是在程序中import os;os.environ["CUDA_VISIBLE_DEVICES"] = "2"。如果使用IPython或者Jupyter notebook,还可以使用%env CUDA_VISIBLE_DEVICES=1,2来设置环境变量。

    单机多卡的实现

    要实现模型单机多卡十分容易,直接使用 new_module = nn.DataParallel(module, device_ids), 默认会把模型分布到所有的卡上。多卡并行的机制如下:
    将模型(module)复制到每一张卡上,将形状为(N,C,H,W)的输入均等分为 n份(假设有n张卡),每一份形状是(N/n, C,H,W),然后在每张卡前向传播,反向传播,梯度求平均。要求batch-size 大于等于卡的个数(N>=n)
    在绝大多数情况下,new_module的用法和module一致,除了极其特殊的情况下(RNN中的PackedSequence)。另外想要获取原始的单卡模型,需要通过new_module.module访问。

    用我只有一块显卡(gtx1060)的笔记本测试,会出错,所以一块显卡的小伙伴就不用折腾了,直接tensor.cuda(),model.cuda(),这两个方法可以将张量和模型都转化为使用gpu运行.如果运行中出现类似张量不同的错误,注意查看是不是有的tensor没有转化.

    相关文章

      网友评论

        本文标题:2018再见,2019你好

        本文链接:https://www.haomeiwen.com/subject/swivlqtx.html