获取图像的风格矩阵

风格矩阵代表图像自身各通道之间的相关性,代码如下:

def gram_matrix(input_tensor):
    """
    获取风格矩阵
    """
    # 爱因斯坦求和约定(Einstein summation convention) b:批次大小,i:高、j:宽、channels:特征通道数,bijc和bijd表示沿着高、宽维度进行,即对同一位置的特征向量相乘
    # 结果矩阵形状为(batch_size, channels, channels),因为每个通道做点积,再求和得到1个值。 而channel1与channel2..channel_x, channel2与channel1...channel_x、...最终会得到一个矩阵。
    result = tf.linalg.einsum('bijc,bijd->bcd', input_tensor, input_tensor)
    input_shape = tf.shape(input_tensor)
    # 获取height * weight = 位置数
    num_locations = tf.cast(input_shape[1] * input_shape[2], tf.float32)
    # 标准化处理,确保输出的Gram矩阵不会因为图像大小不同而由较大的数值差值。
    return result / num_locations

示例

假设input_tensor有 3 个通道(channels=3),并且为了简化,假设输入张量的形状是 (1, 2, 2, 3),即:

batch_size=1
height=2
width=2
channels=3

假设输入张量 input_tensor 是:

[
  [
    [[1, 2, 3], [4, 5, 6]],   # 第一个位置 (i=0, j=0) 和 第二个位置 (i=0, j=1)
    [[7, 8, 9], [10, 11, 12]] # 第三个位置 (i=1, j=0) 和 第四个位置 (i=1, j=1)
  ]
]

这个张量形状为 (1, 2, 2, 3),即 (batch_size=1, height=2, width=2, channels=3)。

每个位置(i, j)通道 c 上有一个值,如 (1, 2, 3) 表示在(i=0, j=0)位置上的三个通道的值。

Gram矩阵的生成

第一步:通道之间的乘积

einsum 表达式 'bijc,bijd->bcd' 将两个input_tensor相乘,并在i 和 j上进行求和。我们来看具体的操作。

在每个 (i, j) 位置上,我们取出通道 c 和 d 的值相乘,并对所有 (i, j) 位置的乘积求和。

通道 0 和 通道 0 (c=0, d=0)
在位置 (0, 0):1 * 1 = 1
在位置 (0, 1):4 * 4 = 16
在位置 (1, 0):7 * 7 = 49
在位置 (1, 1):10 * 10 = 100
求和:1 + 16 + 49 + 100 = 166
通道 0 和 通道 1 (c=0, d=1)
在位置 (0, 0):1 * 2 = 2
在位置 (0, 1):4 * 5 = 20
在位置 (1, 0):7 * 8 = 56
在位置 (1, 1):10 * 11 = 110
求和:2 + 20 + 56 + 110 = 188
通道 0 和 通道 2 (c=0, d=2)
在位置 (0, 0):1 * 3 = 3
在位置 (0, 1):4 * 6 = 24
在位置 (1, 0):7 * 9 = 63
在位置 (1, 1):10 * 12 = 120
求和:3 + 24 + 63 + 120 = 210
通道 1 和 通道 1 (c=1, d=1)
在位置 (0, 0):2 * 2 = 4
在位置 (0, 1):5 * 5 = 25
在位置 (1, 0):8 * 8 = 64
在位置 (1, 1):11 * 11 = 121
求和:4 + 25 + 64 + 121 = 214
通道 1 和 通道 2 (c=1, d=2)
在位置 (0, 0):2 * 3 = 6
在位置 (0, 1):5 * 6 = 30
在位置 (1, 0):8 * 9 = 72
在位置 (1, 1):11 * 12 = 132
求和:6 + 30 + 72 + 132 = 240
通道 2 和 通道 2 (c=2, d=2)
在位置 (0, 0):3 * 3 = 9
在位置 (0, 1):6 * 6 = 36
在位置 (1, 0):9 * 9 = 81
在位置 (1, 1):12 * 12 = 144
求和:9 + 36 + 81 + 144 = 270

第二步:构建 Gram 矩阵

根据上面的计算结果,我们可以构建最终的 Gram 矩阵。矩阵的形状是 (channels, channels),在本例中是 (3, 3):

[
  [166, 188, 210],  # 通道 0 和其他通道的相关性
  [188, 214, 240],  # 通道 1 和其他通道的相关性
  [210, 240, 270]   # 通道 2 和其他通道的相关性
]

最后一步:除以位置数

根据代码中的 num_locations = tf.cast(input_shape[1] * input_shape[2], tf.float32),位置数为 height * width = 2 * 2 = 4

最终的 Gram 矩阵需要除以这个位置数:

[
  [166/4, 188/4, 210/4],  # => [41.5, 47.0, 52.5]
  [188/4, 214/4, 240/4],  # => [47.0, 53.5, 60.0]
  [210/4, 240/4, 270/4]   # => [52.5, 60.0, 67.5]
]

最终 Gram 矩阵为:

[
  [41.5, 47.0, 52.5],
  [47.0, 53.5, 60.0],
  [52.5, 60.0, 67.5]
]

这个 Gram 矩阵显示了每个通道之间的相关性。例如:

(0, 1) 位置的47.0表示通道 0 和通道 1 在所有位置上的特征值相关性。
对角线上的元素(如 41.5、53.5、67.5)表示通道自身的相关性,即通道内的特征强度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(linux驱动学习 - 12). IIC 驱动实验

目录 一.IIC 总线驱动相关结构体与函数 1.i2c_adapter 结构体 2.i2c_algorithm 结构体 3.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_adapter 4.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_numbered_adapter 5.删除 I2C 适配器 - i2c_del_adapter 二.IIC 设…

【C++算法】11.滑动窗口_最大连续1的个数lll

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 1004. 最大连续 1 的个数 III 题目描述: 解法 解法一:暴力枚举zero计数器 转化找出最长的子数组,0的个数不超过k个。 例如&#xf…

计算机网络——有连接传输层协议TCP

序号 序号一般不从0开始,这个在双方建立连接后约定一个数 这样做可以避免网络中滞留的TCP段对新的连接的干扰

Flutter状态管理

StatefulWidget按状态划分StatelessWidgetStatefulWidget 按照作用域划分组件内私有状态实现跨组件状态管理全局状态 状态组件的组成 DataTableInheritedWidget生命周期无状态组件有状态组件initState()didChangeDependencies()build()setState()didUpdateWidget()deactivate()…

Redis 集群 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 集群 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 集群 & 总结》(学习总结/最新最准/持续更新)《Redis & 集群…

二十二、Python基础语法(模块)

模块(module):在python中,每个代码文件就是一个模块,在模块中定义的变量、函数、类别人都可以直接使用,如果想要使用别人写好的模块,就必须先导入别人的模块,模块名须满足标识符规则(由字母、数…

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上,华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布。 华为官方透露,截至目前,鸿蒙操作系统在中国市场份额占据 Top2 的领先地位,拥有超过 1.1 亿 的代码行和 6…

布隆过滤器:极简存储,高效检索

引言 在海量数据的存储与检索中,如何在保持快速检索的同时,降低内存占用是个巨大的挑战。有没有一种既能快速检索又能节省内存的方案?布隆过滤器(Bloom Filter)就是这样一种数据结构。 布隆过滤器的基本原理 如果我…

Vue.js 学习总结(11)—— Vue3 Hook 函数实战总结

前言 在 Vue 3 中,Hook 函数是一种特殊的函数,用于封装可重用的逻辑和状态管理。Hook 函数允许你在 Vue 组件中提取和复用逻辑,而不是将所有逻辑都放在组件的选项对象中。它们可以帮助你更好地组织代码,提高代码的可维护性和可测…

算法题总结(十九)——图论

图论 DFS框架 void dfs(参数) { if (终止条件) {存放结果;return; }for (选择:本节点所连接的其他节点) {处理节点;dfs(图,选择的节点); // 递归回溯,撤销处理结果 } }深搜三部曲 确认递归函数,参数确认终止条件处理目前搜索节…

JAVA基础:IO流 (学习笔记)

IO流 一,IO流的理解 i : input 输入 o:output 输入 流:方式,传递数据的方式---------相当于生活中的“管道”,“车”,将资源从一个位置,传递到另一个位置 二,IO流的分…

从0开始深度学习(16)——暂退法(Dropout)

上一章的过拟合是由于数据不足导致的,但如果我们有比特征多得多的样本,深度神经网络也有可能过拟合 1 扰动的稳健性 经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标,即模型以较小的维度的…

Qt中使用线程之QConcurrent

QConcurrent可以实现并发,好处是我们可以不用单独写一个类了,直接在类里面定义任务函数,然后使用QtConcurrent::run在单独的线程里执行一个任务 1、定义一个任务函数 2、定义1个QFutureWatcher的对象,使用QFutureWatcher来监测任…

新手直播方案

简介 新手直播方案 ,低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑(高成本方案) 直播推流方案 需要摄像头 方案一 :手机 电脑同步下载 网络摄像头 软件&#xff08…

【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议(IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …

小程序开发实战:PDF转换为图片工具开发

目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列,PDF转换为图片工具的开发实战,感兴趣的朋友可以一起来学习一下&#xff01…

linux中级(NFS服务器)

NFS:用于在NNIX/Linux主机之间进行文件共享的协议 流程:首先服务端开启RPC服务,并开启111端口,服务器端启动NFS服务,并向RPC注册端口信息,客户端启动RPC,向服务器RPC服务请求NFS端口&#xff0…

anaconda 创建环境失败 解决指南

anaconda 创建环境失败 解决指南 一、问题描述 我在宿舍有一台电脑。由于我经常泡在实验室,所以那台电脑不是经常用,基本吃灰。昨天晚上突然有在那台电脑上使用Camel-AI部署多智能体协同需求,便戳开了电脑,问题也随之而来。 当…

汽车级DC-DC转换器英飞凌TLF35584

上汽荣威都在用的汽车级DC-DC转换器英飞凌TLF35584 今天平台君从IPBrain数据库中给大家带来的一款由Infineon(英飞凌)推出的一款多路输出安全电源芯片,具备高可靠性和安全性。适用于汽车电子系统中的多种应用场景,如车身控制、安全气囊、防抱死制动系统,电子稳定控制系统等。…

设计模式基础知识以及典型设计模式总结(上)

1. 基础 1. 什么是设计模式? 设计模式是指在软件开发中,经过验证的,用于解决在特定环境下重复出现的特定问题的解决方案。 简单的说,设计模式是解决问题的固定套路。 慎用设计模式。 2. 设计模式是怎么来的? 满足…