当前位置: 首页 > news >正文

裁剪或填充张量(Tensor)(四维与五维)(Python代码)

import torch.nn.functional as F# 将(Batch_Size, Num_Class, Height, Weight)裁剪掉指定的Height和Weight
def crop_tensor_by_height_width(tensor, height_crop, width_crop):assert len(tensor.shape) == 4, '输入的tensor应为4维'assert height_crop > 0 and width_crop > 0, 'crop应该大于0'height_extra = 0width_extra = 0if height_crop % 2 != 0:height_extra = 1if width_crop % 2 != 0:width_extra = 1# 计算截取下界lower_bound_height_crop = height_crop // 2lower_bound_width_crop = width_crop // 2# 获取原始的高度和宽度original_height, original_width = tensor.shape[2], tensor.shape[3]# 计算截取上界upper_width_height_crop = original_height - height_crop // 2 - height_extraupper_width_width_crop = original_width - width_crop // 2 - width_extra# 同时裁剪高度和宽度return tensor[:, :, lower_bound_height_crop:upper_width_height_crop, lower_bound_width_crop:upper_width_width_crop]def crop_or_pad_tensor_by_height_width(tensor, height_crop, width_crop, pad_value=0):'''裁剪或扩展Tensor在高度(仅底部)和宽度(仅右侧)维度上的最后一个像素。正数表示扩展(用0填充),负数表示裁剪。参数:tensor (torch.Tensor): 输入的4维张量,形状为 (batch_size, channels, height, width)height_crop (int): 高度方向上底部要裁剪或扩展的像素数量,默认为1width_crop (int): 宽度方向上右侧要裁剪或扩展的像素数量,默认为1pad_value (float or int): 填充时使用的值,默认为0返回:cropped_or_padded_tensor (torch.Tensor): 裁剪或扩展后的张量'''assert len(tensor.shape) == 4, '输入的tensor应为4维'# 获取原始的高度和宽度original_height, original_width = tensor.shape[2], tensor.shape[3]# 计算需要裁剪的数量(正值代表不裁剪,负值时代表裁剪)height_to_remove_from_bottom = min(original_height, -height_crop) if height_crop < 0 else 0width_to_remove_from_right = min(original_width, -width_crop) if width_crop < 0 else 0# 计算需要填充的数量(正值代表填充,负值代表不填充)pad_bottom = abs(height_crop) if height_crop > 0 else 0pad_right = abs(width_crop) if width_crop > 0 else 0# 先填充,再裁剪padded_tensor = F.pad(tensor, pad=(0, pad_right, 0, pad_bottom), mode='constant', value=pad_value)# 在高度和宽度维度上进行裁剪(如果需要)if height_to_remove_from_bottom > 0 and width_to_remove_from_right > 0:# 同时裁剪高度和宽度cropped_or_padded_tensor = padded_tensor[:, :, :-height_to_remove_from_bottom, :-width_to_remove_from_right]elif height_to_remove_from_bottom > 0:# 只裁剪高度cropped_or_padded_tensor = padded_tensor[:, :, :-height_to_remove_from_bottom, :]elif width_to_remove_from_right > 0:# 只裁剪宽度cropped_or_padded_tensor = padded_tensor[:, :, :, :-width_to_remove_from_right]else:# 不裁剪任何维度cropped_or_padded_tensor = padded_tensorreturn cropped_or_padded_tensordef crop_or_pad_tensor_by_depth_height_width(tensor, depth_crop, height_crop, width_crop, pad_value=0):'''裁剪或扩展Tensor在深度(仅最后一个)、高度(仅底部)和宽度(仅右侧)维度上的最后一个像素。正数表示扩展(用0填充),负数表示裁剪。参数:tensor (torch.Tensor): 输入的5维张量,形状为 (batch_size, channels, depth, height, width)depth_crop (int): 深度方向上最后一个要裁剪或扩展的数量,默认为1height_crop (int): 高度方向上底部要裁剪或扩展的像素数量,默认为1width_crop (int): 宽度方向上右侧要裁剪或扩展的像素数量,默认为1pad_value (float or int): 填充时使用的值,默认为0返回:cropped_or_padded_tensor (torch.Tensor): 裁剪或扩展后的张量'''assert len(tensor.shape) == 5, '输入的tensor应为5维'# 获取原始的深度、高度和宽度original_depth, original_height, original_width = tensor.shape[2], tensor.shape[3], tensor.shape[4]# 计算需要裁剪的数量(正值代表不裁剪,负值时代表裁剪)depth_to_remove_from_end = min(original_depth, -depth_crop) if depth_crop < 0 else 0height_to_remove_from_bottom = min(original_height, -height_crop) if height_crop < 0 else 0width_to_remove_from_right = min(original_width, -width_crop) if width_crop < 0 else 0# 计算需要填充的数量(正值代表填充,负值代表不填充)pad_depth = abs(depth_crop) if depth_crop > 0 else 0pad_bottom = abs(height_crop) if height_crop > 0 else 0pad_right = abs(width_crop) if width_crop > 0 else 0# 先填充,再裁剪padded_tensor = F.pad(tensor, pad=(0, pad_right, 0, pad_bottom, 0, pad_depth), mode='constant', value=pad_value)# 在深度、高度和宽度维度上进行裁剪(如果需要)if depth_to_remove_from_end > 0 and height_to_remove_from_bottom > 0 and width_to_remove_from_right > 0:# 同时裁剪深度、高度和宽度cropped_or_padded_tensor = padded_tensor[:, :, :-depth_to_remove_from_end, :-height_to_remove_from_bottom,:-width_to_remove_from_right]elif depth_to_remove_from_end > 0 and height_to_remove_from_bottom > 0:# 只裁剪深度和高度cropped_or_padded_tensor = padded_tensor[:, :, :-depth_to_remove_from_end, :-height_to_remove_from_bottom, :]elif depth_to_remove_from_end > 0 and width_to_remove_from_right > 0:# 只裁剪深度和宽度cropped_or_padded_tensor = padded_tensor[:, :, :-depth_to_remove_from_end, :, :-width_to_remove_from_right]elif height_to_remove_from_bottom > 0 and width_to_remove_from_right > 0:# 只裁剪高度和宽度cropped_or_padded_tensor = padded_tensor[:, :, :, :-height_to_remove_from_bottom, :-width_to_remove_from_right]elif depth_to_remove_from_end > 0:# 只裁剪深度cropped_or_padded_tensor = padded_tensor[:, :, :-depth_to_remove_from_end, :, :]elif height_to_remove_from_bottom > 0:# 只裁剪高度cropped_or_padded_tensor = padded_tensor[:, :, :, :-height_to_remove_from_bottom, :]elif width_to_remove_from_right > 0:# 只裁剪宽度cropped_or_padded_tensor = padded_tensor[:, :, :, :, :-width_to_remove_from_right]else:# 不裁剪任何维度cropped_or_padded_tensor = padded_tensorreturn cropped_or_padded_tensor

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Python】requests的response.text 和 urllib.request 的 response.read()的区别
  • 编程-设计模式 26:业务代表模式
  • Android11 关于三方应用获取su权限
  • 以Zed项目为例学习大型Rust项目的组织与管理
  • 数据结构----二叉树
  • Cairo库移植到安卓记录
  • 【登录扫码】--集成企业微信
  • todoList清单(HTML+CSS+JavaScript)
  • Linux中apache服务安装与mysql安装
  • git强制推送代码教程
  • 如何使用css写三角形
  • 操作系统(进程通信)
  • Spring 中的InitializingBean
  • C语言实现数据结构之队列
  • 基于GeoTools使用JavaFx进行矢量数据可视化实战
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular数据绑定机制
  • angular学习第一篇-----环境搭建
  • in typeof instanceof ===这些运算符有什么作用
  • Java的Interrupt与线程中断
  • Java面向对象及其三大特征
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • markdown编辑器简评
  • mongodb--安装和初步使用教程
  • passportjs 源码分析
  • win10下安装mysql5.7
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 数组大概知多少
  • 算法---两个栈实现一个队列
  • 算法系列——算法入门之递归分而治之思想的实现
  • 一文看透浏览器架构
  • Mac 上flink的安装与启动
  • ​VRRP 虚拟路由冗余协议(华为)
  • #FPGA(基础知识)
  • #pragma once与条件编译
  • $refs 、$nextTic、动态组件、name的使用
  • (2)STM32单片机上位机
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (k8s中)docker netty OOM问题记录
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (论文阅读40-45)图像描述1
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .gitignore文件—git忽略文件
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Remoting常用部署结构
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .NET企业级应用架构设计系列之应用服务器
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ C++ ] STL_list 使用及其模拟实现
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [AIGC] MySQL存储引擎详解
  • [ARM]ldr 和 adr 伪指令的区别