GVKun编程网logo

张量流如何在梯度计算期间处理不可微节点?(张量流如何在梯度计算期间处理不可微节点的数据)

20

如果您想了解张量流如何在梯度计算期间处理不可微节点?的相关知识,那么本文是一篇不可错过的文章,我们将对张量流如何在梯度计算期间处理不可微节点的数据进行全面详尽的解释,并且为您提供关于Golang图片处

如果您想了解张量流如何在梯度计算期间处理不可微节点?的相关知识,那么本文是一篇不可错过的文章,我们将对张量流如何在梯度计算期间处理不可微节点的数据进行全面详尽的解释,并且为您提供关于Golang图片处理:如何进行图片的滤波和梯度计算、java – 如何在长时间关闭期间处理servlet请求、linux – 如何在自动部署期间处理密码?、OpenCV 2.4+ C++ 边缘梯度计算的有价值的信息。

本文目录一览:

张量流如何在梯度计算期间处理不可微节点?(张量流如何在梯度计算期间处理不可微节点的数据)

张量流如何在梯度计算期间处理不可微节点?(张量流如何在梯度计算期间处理不可微节点的数据)

我了解自动微分的概念,但找不到任何解释,例如,tf.where在我的损失函数或tf.cond图形中,tensorflow如何计算不可微函数的误差梯度。它工作得很好,但是我想了解张量流如何通过这些节点反向传播误差,因为没有公式可以根据它们计算梯度。

答案1

小编典典

在情况下tf.where,您有一个具有三个输入的函数,即condition
C,trueT值和false值F以及一个输出Out。渐变接收一个值,并且必须返回三个值。当前,没有为该条件计算梯度(这几乎没有道理),因此您只需要为T和进行梯度F。假设输入和输出是向量,可以想象C[0]True。然后Out[0]来自T[0],其梯度应传播回去。另一方面,F[0]将被丢弃,因此其梯度应设为零。如果Out[1]False,则的梯度F[1]应该传播,而不是T[1]。简而言之,T你应该传播给定的梯度这里CTrue并使其零它在哪里False,而相对来说F。如果看一下(operation)的梯度的实现tf.where``Select,它确实做到了:

@ops.RegisterGradient("Select")def _SelectGrad(op, grad):  c = op.inputs[0]  x = op.inputs[1]  zeros = array_ops.zeros_like(x)  return (None, array_ops.where(c, grad, zeros), array_ops.where(      c, zeros, grad))

请注意,输入值本身未在计算中使用,这将通过产生这些输入的操作的梯度来完成。对于tf.cond,代码有点复杂,因为Merge在不同的上下文中使用了相同的操作(),并且tf.cond还使用了Switch内部的操作。但是,想法是相同的。本质上,Switch操作用于每个输入,因此被激活的输入(第一个(如果条件是条件True,第二个否则)获得接收到的梯度,另一个输入得到“关闭”梯度(如None),并且不会传播再往回走。

Golang图片处理:如何进行图片的滤波和梯度计算

Golang图片处理:如何进行图片的滤波和梯度计算

golang图片处理:如何进行图片的滤波和梯度计算

Golang图片处理:如何进行图片的滤波和梯度计算

摘要:
随着图像处理技术的发展,图像的滤波和梯度计算已经成为图像处理中常用的技术。本文将介绍如何在Golang中使用一些简单的滤波和梯度计算算法来处理图片。同时,还将提供一些代码示例。

  1. 引言
    图像滤波和梯度计算是图像处理中的重要技术,它们可以帮助我们改善图像的质量、增强图像的细节以及检测图像中的边缘。在Golang中,我们可以使用一些已经存在的库来进行图像处理,如go image库。
  2. 图像滤波
    图像滤波是将原始图像与滤波器进行卷积操作,以实现图像的平滑、锐化或其他特定效果。在Golang中,我们可以使用go image库中的Filter来进行滤波操作。

2.1 均值滤波
均值滤波是最简单的滤波算法之一,它将一个特定像素周围的像素的平均值作为该像素的新值。下面是使用Golang进行均值滤波的代码示例:

import (
    "image"
    "image/color"
    "github.com/disintegration/gift"
)

func MeanFilter(img image.Image) image.Image {
    filter := gift.New(gift.Mean(3, true))
    dst := image.NewRGBA(filter.Bounds(img.Bounds()))
    filter.Draw(dst, img)
    return dst
}
登录后复制

2.2 高斯滤波
高斯滤波是一种常用的平滑滤波算法,它使用高斯函数来计算滤波器的权重。下面是使用Golang进行高斯滤波的代码示例:

立即学习“go语言免费学习笔记(深入)”;

import (
    "image"
    "image/color"
    "github.com/disintegration/gift"
)

func GaussianFilter(img image.Image) image.Image {
    filter := gift.New(gift.Gaussian(3, 2))
    dst := image.NewRGBA(filter.Bounds(img.Bounds()))
    filter.Draw(dst, img)
    return dst
}
登录后复制
  1. 图像梯度计算
    图像梯度计算是用来计算图像中像素的变化率的技术,它可以帮助我们检测图像中的边缘以及进行边缘增强等操作。在Golang中,我们可以使用go image库中的convolution滤波器来进行图像的梯度计算。

3.1 水平和垂直梯度计算
水平和垂直梯度计算是最简单的梯度计算算法之一,它分别计算图像中像素在水平和垂直方向上的变化率。下面是使用Golang进行水平和垂直梯度计算的代码示例:

import (
    "image"
    "image/color"
    "github.com/disintegration/gift"
)

func GradientFilter(img image.Image) image.Image {
    filter := gift.New(
        gift.Grayscale(),
        gift.Sobel(), //水平和垂直梯度计算
    )
    dst := image.NewRGBA(filter.Bounds(img.Bounds()))
    filter.Draw(dst, img)
    return dst
}
登录后复制
  1. 结论
    本文介绍了如何在Golang中进行图像滤波和梯度计算。通过使用go image库和一些简单的滤波和梯度计算算法,我们可以对图像进行平滑、锐化、边缘检测等操作。希望本文对您在Golang中进行图像处理有所帮助。

参考文献:

  1. Go Image package (https://golang.org/pkg/image/)
  2. Disintegration gift package (https://pkg.go.dev/github.com/disintegration/gift)

(注:以上代码示例仅供参考,实际应用中需要根据具体需求进行适当的修改和优化。)

以上就是Golang图片处理:如何进行图片的滤波和梯度计算的详细内容,更多请关注php中文网其它相关文章!

java – 如何在长时间关闭期间处理servlet请求

java – 如何在长时间关闭期间处理servlet请求

我们需要在Servlet应用程序中实现一个优雅的关闭机制.

编辑:我们希望尽可能简化,这将处理通过操作系统的功能发送的终止信号.这将允许系统管理员使用内置的shell实用程序(在Windows上执行kill或taskkill),否则他们必须安装另一个实用程序才能与服务器“对话”.

该机制分两个阶段:

>在关机请求时,拒绝某些关键活动
>阻止直到先前发起的关键行动完成;这些可能需要几个小时

阶段#1在我们的DAO层中实现.
阶段#2在我们的servletcontextlistener#contextDestroyed方法中实现

我们的问题是,一旦调用了contextDestroyed,Servlet容器就会停止为进一步的HTTP请求提供服务.

编辑:当有人在服务器进程上调用操作系统的kill函数时,将调用contextDestroyed.

我们希望在阶段#2期间让应用程序处于活动状态,通知用户某些活动不可用.

解决方法

使用 filter保留所有关键请求的列表.

当收到“准备关闭”请求时,过滤器应该开始拒绝某些请求.

编写一个servlet,告诉您仍有多少关键作业留在队列中.

在关机工具中,发送“准备关机”.对servlet进行轮询以获取关键作业的数量.当此值达到0时,发送实际的shutdown命令.

要实现这一点,请在业务层中创建一个服务于此的服务.请注意,一切都必须在调用contextDestroyed()之前发生!您的特殊应用程序关闭不适合世界的J2EE视图,因此您必须自己管理它.

该服务应该能够告诉感兴趣的各方何时正在进行关闭,有多少关键作业仍在运行等等.然后,Servlet和过滤器可以使用此服务拒绝请求或告知剩余的作业数量.

完成所有作业后,拒绝除访问“关闭信息”servlet之外的所有请求,然后应该告诉应用程序现在已准备好死亡.

编写一个工具,为管理员提供一个很好的UI来启动应用程序的关闭.

[编辑]您可能会想要阻止操作系统关闭您的应用程序.不要那样做.

你应该做的是编写一个特殊的工具,使用我上面描述的两阶段过程来关闭你的应用程序.这应该是关闭的标准方法.

是的,管理员会抱怨它.在Unix上,您可以通过将其放入init脚本来隐藏此工具,因此没有人会注意到. Windows上可能有类似的@R_301_6256@案.

杀死服务器应始终能够在(非)预期情况下停止它,例如:关机代码中的错误,电源故障期间的紧急关机,应用程序代码中的错误或Murphy发生时.

linux – 如何在自动部署期间处理密码?

linux – 如何在自动部署期间处理密码?

作为负责任的管理员,我们知道常见的弱点

> CWE-260:配置文件http://cwe.mitre.org/data/definitions/260.html中的密码
> CWE-522:证书不足http://cwe.mitre.org/data/definitions/522.html
> CWE-257:以可恢复格式存储密码http://cwe.mitre.org/data/definitions/557.html

但是我们如何在实践中处理这个问题呢?

当然,通过SSH和sudo等工具进行无密码身份验证等技术,可以在重要的地方摆脱存储的登录凭据,这在Linux服务器的自动部署过程中确实很有用.

但是一旦您离开操作系统并安装应用程序,您就会面临安全存储密码的问题.

例如,如果安装数据库服务器,则很可能需要将明文密码保存到Web应用程序的配置文件中.

然后,您应该保护配置文件,以便只有管理员才能查看凭据,您应该限制数据库用户的访问权限,以限制可能的安全影响.

但是如何处理例如主要的管理数据库帐户?至少你的dbas应该知道它(所以你需要明文的某个地方)而作为操作系统管理员,你不应该知道凭证.或者部署由devops完成,他们不应该知道生产服务器上的任何凭据.

可能的解决方案

经过一段时间的思考,我提出了三种可能的解决方案,但他们有自己的弱点:

>在部署期间生成随机凭据,并以一次写入方式将其存储在数据库中.例如,dbas有另一个用户可能只读取数据库凭据.但是如何处理例如配置文件中的明文密码. web应用? root用户可以读取它们.密码数据库的root用户也可能读取所有密码凭据.
>在部署期间接受明文密码和默认凭据,并添加更改任何和所有密码的postscript.甚至可能是交互式的,授权人员必须在脚本运行期间输入凭据.
>使用受信任的第三方的密钥非对称地加密密码.当请求密码时,必须在之后更改密码.

你怎么看?你看到这里有什么最好的做法吗?

解决方法

>您应该拥有一个包含所有凭据的安全加密数据库
>在部署期间,凭借防火墙,服务器应该完全无法从外部访问
>让脚本生成随机传递并通过电子邮件发送给您,这很好
>在您允许访问公众之前,在配置服务器之后更改密码也没关系
>通过电子邮件发送自己的密码是可以的,只要它使用您的内部邮件服务器并且不通过SMTP通过公共路由(SMTPS是另一个故事)

您可以将电子邮件替换为任何协议.你可以在某个地方输入密码,使用onetimesecret api创建一次性消息,使用https将其上传到私人要点,或者你能想到的任何其他内容.

我认为这涵盖了它.

OpenCV 2.4+ C++ 边缘梯度计算

OpenCV 2.4+ C++ 边缘梯度计算

图像的边缘

图像的边缘从数学上是如何表示的呢?

How intensity changes in an edge

图像的边缘上,邻近的像素值应当显著地改变了。而在数学上,导数是表示改变快慢的一种方法。梯度值的大变预示着图像中内容的显著变化了。

用更加形象的图像来解释,假设我们有一张一维图形。下图中灰度值的 “跃升” 表示边缘的存在:

    Intensity Plot for an edge

使用一阶微分求导我们可以更加清晰的看到边缘 “跃升” 的存在 (这里显示为高峰值):

    First derivative of Intensity - Plot for an edge

由此我们可以得出:边缘可以通过定位梯度值大于邻域的相素的方法找到。

 

卷积

卷积可以近似地表示求导运算。

那么卷积是什么呢?

卷积是在每一个图像块与某个算子(核)之间进行的运算。

核?!

核就是一个固定大小的数值数组。该数组带有一个锚点 ,一般位于数组中央。

kernel example

 可是这怎么运算啊?

假如你想得到图像的某个特定位置的卷积值,可用下列方法计算:

  1. 将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;
  2. 将核内各值与相应像素值相乘,并将乘积相加;
  3. 将所得结果放到与锚点对应的像素上;
  4. 对图像所有像素重复上述过程。

用公式表示上述过程如下:

    H(x,y) = \sum_{i=0}^{M_{i} - 1} \sum_{j=0}^{M_{j}-1} I(x+i - a_{i}, y + j - a_{j})K(i,j)

在图像边缘的卷积怎么办呢?

计算卷积前,OpenCV 通过复制源图像的边界创建虚拟像素,这样边缘的地方也有足够像素计算卷积了。

 

近似梯度

比如内核为 3 时。

首先对 x 方向计算近似导数:

G_{x} = \begin{bmatrix}
-1 & 0 & +1  \\
-2 & 0 & +2  \\
-1 & 0 & +1
\end{bmatrix} * I

然后对 y 方向计算近似导数:

G_{y} = \begin{bmatrix}
-1 & -2 & -1  \\
0 & 0 & 0  \\
+1 & +2 & +1
\end{bmatrix} * I

然后计算梯度:

G = \sqrt{ G_{x}^{2} + G_{y}^{2} }

当然你也可以写成:

G = |G_{x}| + |G_{y}|

 

开始求梯度

复制代码
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdlib.h> #include <stdio.h> using namespace cv; int main( int argc, char** argv ){

    Mat src, src_gray;
    Mat grad; char* window_name = "求解梯度"; int scale = 1; int delta = 0; int ddepth = CV_16S; int c;

    src = imread( argv[1] ); if( !src.data ){ return -1; 
    } //高斯模糊 GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT ); //转成灰度图  cvtColor( src, src_gray, CV_RGB2GRAY );

    namedWindow( window_name, CV_WINDOW_AUTOSIZE );

    Mat grad_x, grad_y;
    Mat abs_grad_x, abs_grad_y;

    Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
    convertScaleAbs( grad_x, abs_grad_x );

    Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
    convertScaleAbs( grad_y, abs_grad_y );

    addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

    imshow( window_name, grad );

    waitKey(0); return 0;
}
复制代码

 

Sobel 函数

索贝尔算子(Sobel operator)计算。

C++: void Sobel(InputArray  src, OutputArray  dst, int  ddepth, int  dx, int  dy, int  ksize=3, double  scale=1, double  delta=0, int borderType=BORDER_DEFAULT )
参数
  • src – 输入图像。
  • dst – 输出图像,与输入图像同样大小,拥有同样个数的通道。
  • ddepth –输出图片深度;下面是输入图像支持深度和输出图像支持深度的关系:
    • src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
    • src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
    • src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
    • src.depth() = CV_64F, ddepth = -1/CV_64F

    当 ddepth 为 - 1 时, 输出图像将和输入图像有相同的深度。输入 8 位图像则会截取顶端的导数。

  • xorder – x 方向导数运算参数。
  • yorder – y 方向导数运算参数。
  • ksize – Sobel 内核的大小,可以是:1,3,5,7。
  • scale – 可选的缩放导数的比例常数。
  • delta – 可选的增量常数被叠加到导数中。
  • borderType – 用于判断图像边界的模式。

代码注释:

//在x方向求图像近似导数 Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT ); //在y方向求图像近似导数 Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );

如果我们打印上面两个输出矩阵,可以看到 grad_x 和 grad_y 中的元素有正有负。

当然,正方向递增就是正的,正方向递减则是负值。

这很重要,我们可以用来判断梯度方向。

 

convertScaleAbs 函数

线性变换转换输入数组元素成 8 位无符号整型。

C++: void convertScaleAbs(InputArray  src, OutputArray  dst, double  alpha=1, double  beta=0)
参数
  • src – 输入数组。
  • dst – 输出数组。
  • alpha – 可选缩放比例常数。
  • beta – 可选叠加到结果的常数。

对于每个输入数组的元素函数 convertScaleAbs 进行三次操作依次是:缩放,得到一个绝对值,转换成无符号 8 位类型。

\texttt{dst} (I)= \texttt{saturate\_cast<uchar>} (| \texttt{src} (I)* \texttt{alpha} +  \texttt{beta} |)

对于多通道矩阵,该函数对各通道独立处理。如果输出不是 8 位,将调用 Mat::convertTo 方法并计算结果的绝对值,例如:

Mat_<float> A(30,30);
randu(A, Scalar(-100), Scalar(100));
Mat_<float> B = A*5 + 3;
B = abs(B); 

为了能够用图像显示,提供一个直观的图形,我们利用该方法,将 - 256 — 255 的导数值,转成 0 — 255 的无符号 8 位类型。

 

addWeighted 函数

计算两个矩阵的加权和。

C++: void addWeighted(InputArray  src1, double  alpha, InputArray  src2, double  beta, double  gamma, OutputArray  dst, int dtype=-1)
参数
  • src1 – 第一个输入数组。
  • alpha – 第一个数组的加权系数。
  • src2 – 第二个输入数组,必须和第一个数组拥有相同的大小和通道。
  • beta – 第二个数组的加权系数。
  • dst – 输出数组,和第一个数组拥有相同的大小和通道。
  • gamma – 对所有和的叠加的常量。
  • dtype – 输出数组中的可选的深度,当两个数组具有相同的深度,此系数可设为 - 1,意义等同于选择与第一个数组相同的深度。

函数 addWeighted 两个数组的加权和公式如下:

    \texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} +  \texttt{src2} (I)* \texttt{beta} +  \texttt{gamma} )

在多通道情况下,每个通道是独立处理的,该函数可以被替换成一个函数表达式:

    dst = src1*alpha + src2*beta + gamma;

利用 convertScaleAbs 和 addWeighted,我们可以对梯度进行一个可以用图像显示的近似表达。

这样我们就可以得到下面的效果:

Result of applying Sobel operator to lena.jpg

 

梯度方向

但有时候边界还不够,我们希望得到图片色块之间的关系,或者研究样本的梯度特征来对机器训练识别物体时候,我们还需要梯度的方向。

二维平面的梯度定义为:

    

这很好理解,其表明颜色增长的方向与 x 轴的夹角。

但 Sobel 算子对于沿 x 轴和 y 轴的排列表示的较好,但是对于其他角度表示却不够精确。这时候我们可以使用 Scharr 滤波器。

Scharr 滤波器的内核为:

    G_{x} = \begin{bmatrix}
-3 & 0 & +3  \\
-10 & 0 & +10  \\
-3 & 0 & +3
\end{bmatrix}
G_{y} = \begin{bmatrix}
-3 & -10 & -3  \\
0 & 0 & 0  \\
+3 & +10 & +3
\end{bmatrix}

这样能提供更好的角度信息,现在我们修改原程序,改为使用 Scharr 滤波器进行计算:

复制代码
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdlib.h> #include <stdio.h> using namespace cv; int main( int argc, char** argv ){

    Mat src, src_gray;
    Mat grad; char* window_name = "梯度计算"; int scale = 1; int delta = 0; int ddepth = CV_16S; int c;

    src = imread( argv[1] ); if( !src.data ){ return -1; 
    }

    GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

    cvtColor( src, src_gray, CV_RGB2GRAY );

    namedWindow( window_name, CV_WINDOW_AUTOSIZE );

    Mat grad_x, grad_y;
    Mat abs_grad_x, abs_grad_y; //改为Scharr滤波器计算x轴导数 Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
    convertScaleAbs( grad_x, abs_grad_x ); //改为Scharr滤波器计算y轴导数 Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
    convertScaleAbs( grad_y, abs_grad_y );

    addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

    imshow( window_name, grad );

    waitKey(0); return 0;
}
复制代码

Scharr 函数接受参数与 Sobel 函数相似,这里就不叙述了。

下面我们通过 divide 函数就能得到一个 x/y 的矩阵。

对两个输入数组的每个元素执行除操作。

C++: void divide(InputArray  src1, InputArray  src2, OutputArray  dst, double  scale=1, int  dtype=-1) C++: void divide(double  scale, InputArray  src2, OutputArray  dst, int  dtype=-1)
参数
  • src1 – 第一个输入数组。
  • src2 – 第二个输入数组,必须和第一个数组拥有相同的大小和通道。
  • scale – 缩放系数。
  • dst – 输出数组,和第二个数组拥有相同的大小和通道。
  • dtype – 输出数组中的可选的深度,当两个数组具有相同的深度,此系数可设为 - 1,意义等同于选择与第一个数组相同的深度。

该函数对两个数组进行除法:

  \texttt{dst(I) = saturate(src1(I)*scale/src2(I))}

或则只是缩放系数除以一个数组:

  \texttt{dst(I) = saturate(scale/src2(I))}

这种情况如果 src2 是 0,那么 dst 也是 0。不同的通道是独立处理的。

 

被山寨的原文

Sobel Derivatives . OpenCV.org

Image Filtering . OpenCV.org

今天关于张量流如何在梯度计算期间处理不可微节点?张量流如何在梯度计算期间处理不可微节点的数据的讲解已经结束,谢谢您的阅读,如果想了解更多关于Golang图片处理:如何进行图片的滤波和梯度计算、java – 如何在长时间关闭期间处理servlet请求、linux – 如何在自动部署期间处理密码?、OpenCV 2.4+ C++ 边缘梯度计算的相关知识,请在本站搜索。

本文标签: