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

ops/2024/9/20 9:17:28/ 标签: 深度学习, 人工智能, 机器学习
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

http://www.ppmy.cn/ops/93798.html

相关文章

PMP和CSPM-2哪个好呀?

建议再观望一段时间&#xff0c;我自己的证书也还没有换。 因为明文规定持有 PMP 证书可以直接免培训增持 CSPM-2 证书&#xff08;多花600块&#xff09;&#xff0c;懂行的人都知道情况&#xff0c;其实真没什么意义&#xff0c;就是在证书数量上多一个而已。 如果确实想要…

使用Python+moviepy保存截取视频画面

一、 使用VideoFileClip对象的的save_frame函数保存截取的第1帧画面 from moviepy.editor import * mvVideoFileClip(/home/Download/leaves.mp4) mv.save_frame(/home/Download/fst.jpg) # 默认保存截取的第1帧画面 二、 使用VideoFileClip对象的的save_frame函数保存截…

Docker Compose与私有仓库部署

一、Docker Compose工具 1.1什么是Docker Compose Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Docker 容器的工具。使用Docker Compose 时&#xff0c;只需要在一个配置文件中定义多个 Docker 容器&#xff0c;然后使用一条命令启 动这些容器。Docker Co…

【算法】梯度下降

一、引言 梯度下降算法&#xff08;Gradient Descent&#xff09;是一种一阶迭代优化算法&#xff0c;用于求解最小化目标函数的问题&#xff0c;广泛应用于机器学习和人工智能中的参数优化。 用于优化问题的迭代算法&#xff0c;尤其在机器学习和深度学习中广泛用于最小化损失…

2024有哪些好用的图纸加密软件,10款图纸加密软件排行榜

在信息安全愈加重要的今天&#xff0c;企业和个人都越来越注重图纸及设计文件的安全性。无论是工业设计、建筑设计还是其他涉及机密信息的图纸文件&#xff0c;加密软件都成为了保护知识产权的关键工具。下面&#xff0c;我们将介绍2024年最值得关注的十款图纸加密软件&#xf…

TypeScript学习第十三篇 - 泛型

在编译期间不确定变量的类型&#xff0c;在调用时&#xff0c;由开发者指定具体的类型。 1. 如何给arg参数和函数指定类型&#xff1f; function identity(arg){return arg; }identity(1) identity(jack) identity(true) identity([]) identity(null)定义的时候&#xff0c;无…

C#调用c++的dll方法,动态调用c++dll的方法

文章目录 一、创建c的dll1.新建项目2.删除vs自建的.cpp和.h文件3.新建Algorithm.h和Algorithm.cpp4.编译c1.编译2.解决报错3.再次编译可以看到已经成功。4.查看成功输出的dll。 二、创建c#项目1.创建一个console控制台程序。2.把dll拷贝到c#生成的程序根目录。3.在c#的program.…

【Pyspark-驯化】一文搞懂Pyspark中对json数据处理使用技巧:get_json_object

【Pyspark-驯化】一文搞懂Pyspark中对json数据处理使用技巧&#xff1a;get_json_object 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; …

使用WebSocket实现一个简易的聊天室

我这里的框架是SpringBoot 首先&#xff0c;我们要有一个前端页面 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"xmlns:layout"http://www.ultraq.net.nz/web/thymeleaf/layout"layout:decorate"layout"> <head&g…

论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理

本文旨在对任意模态输入-任意模态输出 (X2X) 的LLM的编解码方式进行简单梳理&#xff0c;同时总结一些代表性工作。 注&#xff1a;图像代表Image&#xff0c;视频代表Video&#xff08;不含声音&#xff09;&#xff0c;音频代表 Audio/Music&#xff0c;语音代表Speech 各种…

eBPF编程指南(一):eBPF初体验

1 什么是EBPF&#xff1f; EBPF是一种可以让程序员在内核态执行自己的程序的机制&#xff0c;但是&#xff0c;为了安全起见&#xff0c;无法像内核模块一样随意调用内核的函数&#xff0c;只能调用一些bpf提前定义好的函数。为了让内核执行程序员自己的代码&#xff0c;需要指…

字符串值提取工具-03-java 调用 groovy

值提取系列 值提取系列 字符串值提取工具-01-概览 字符串值提取工具-02-java 调用 js 字符串值提取工具-03-java 调用 groovy 字符串值提取工具-04-java 调用 java? Janino 编译工具 字符串值提取工具-05-java 调用 shell 字符串值提取工具-06-java 调用 python 字符串…

kali-linux 常用命令大集合(目录、文件查看与编辑,登录、电源、帮助等相关命令详解)

目录 目录查看-ls 帮助命令 帮助命令&#xff1a;whatis 帮助命令&#xff1a;help 帮助命令&#xff1a;man 帮助命令&#xff1a;info 登录命令 登录命令&#xff1a;login 登录命令&#xff1a;last 登录命令&#xff1a;exit 切换用户&#xff1a;su/sudo 命令-…

现在画原型都用什么工具?

现在画原型时&#xff0c;Axure是一款广泛使用的工具&#xff0c;尤其在需要高度交互性和逻辑复杂性的项目中&#xff0c;如企业级应用、大型软件项目等&#xff0c;Axure更是首选。 https://ffhog9.axshare.com https://1zvcwx.axshare.com/start.html 以下是对Axure及其优…

全网最最最详细的haproxy详解!!!

1 什么是负载均衡 负载均衡&#xff08;Load Balancing&#xff09;是一种将网络请求或工作负载分散到多个服务器或计算机资源上的技术&#xff0c;以实现优化资源使用、提高系统吞吐量、增强数据冗余和故障容错能力、以及减少响应时间的目的。在分布式系统、云计算环境、Web服…

[C#]实现GRPC通讯的服务端和客户端实例

最近要做两个软件之间消息的通讯&#xff0c;学习了一下GRPC框架的通讯。根据官方资料做了一个实例。 官方资料请参考&#xff1a;Create a .NET Core gRPC client and server in ASP.NET Core | Microsoft Learn 开发平台&#xff1a;Visual Studio 2022 开发前提条件&#x…

微服务部分面试问题(面试篇)

分布式事务 CAP定理 分布式系统有三个指标&#xff1a; Consistency&#xff08;一致性&#xff09; Availability&#xff08;可用性&#xff09; Partition tolerance &#xff08;分区容错性&#xff09; 它们的第一个字母分别是 C、A、P。Eric Brewer认为任何分布式系…

8.6 MySQL

[rootmysql ~]# sed -i $aexport PATH/usr/local/mysql/bin/:$PATH /etc/profile //加到环境变量 [rootmysql ~]# source /etc/profile //使配置环境生效配置开机自启 [rootmysql ~]# chkconfig --list //列举 注&#xff1a;该输出结果只显…

网络编程----TCP/IP协议

使用TCP/IP协议实现客户端和服务器端进行通信: 1.服务器端(test1.c): #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <stdio.h> #include <unistd.h>// 创建服务器端 int main() {//1.创建套接字int serfd…

计算机毕业设计 校园新闻管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…