Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow 2.x–;周围细胞平均张量_Python_Arrays_Tensorflow_Tensorflow2.0_Loss Function - Fatal编程技术网

Python Tensorflow 2.x–;周围细胞平均张量

Python Tensorflow 2.x–;周围细胞平均张量,python,arrays,tensorflow,tensorflow2.0,loss-function,Python,Arrays,Tensorflow,Tensorflow2.0,Loss Function,我试图在Tensorflow 2.x中编写一个自定义损失函数,它鼓励在输出空间(2D矩阵)中逐渐增加梯度。所以,作为损失函数的一个组成部分,我想取一个张量并返回一个张量,其中每个单元代表原始张量中对应的相邻单元的平均值 例如,以左上角的单元格为例:6.3=(7+9+3)/3。或者以中间的单元格为例:4.5=(1+3+5+7+8+6+4+2)/8 考虑以下代码: def gradient\u鼓励\u损失(y\u真:张量,y\u pred:张量)->张量: 梯度损失:张量=tf.divide(tf

我试图在Tensorflow 2.x中编写一个自定义损失函数,它鼓励在输出空间(2D矩阵)中逐渐增加梯度。所以,作为损失函数的一个组成部分,我想取一个张量并返回一个张量,其中每个单元代表原始张量中对应的相邻单元的平均值

例如,以左上角的单元格为例:6.3=(7+9+3)/3。或者以中间的单元格为例:4.5=(1+3+5+7+8+6+4+2)/8

考虑以下代码:

def gradient\u鼓励\u损失(y\u真:张量,y\u pred:张量)->张量:
梯度损失:张量=tf.divide(tf.reduce)和(tf.abs(tf.subtract(
y_pred,张量_调和(y_pred)
))),tf.cast(tf.size(y_pred),tf.float32))
返回梯度损失

如何实现张量谐波()
y_pred
的形状为
(None,X,y)
,其中X和y是输出矩阵的维数。

大部分情况下可以通过二维卷积运算来实现,但需要特别注意外部值。以下是您如何做到这一点:

将tensorflow导入为tf
def环绕_平均值(x):
x=tf。将_转换为_张量(x)
dt=x.dtype
#计算环绕和
filter=tf.常数([[1,1,1],[1,0,1],[1,1,1]],dtype=dt)
x2=x[tf.newaxis,:,:,tf.newaxis]
filter2=过滤器[:,:,tf.newaxis,tf.newaxis]
y2=tf.nn.conv2d(x2,filter2,步长=1,padding='SAME')
y=y2[0,:,:,0]
#生成周围元素数的矩阵
s=tf.形状(x)
d=tf.fill(s-2,tf.constant(8,dtype=dt))
d=tf.pad(d,[[0,0],[1,1]],常量值=5)
顶行=tf.concat([[3],tf.fill([s[1]-2],tf.constant(5,dtype=dt)),[3]],轴=0)
d=tf.concat([[top_row],d[top_row]],轴=0)
#平均回报率
返回y/d
#试验
x=tf.重塑(tf.范围(24.),(4,6))
打印(x.numpy())
# [[ 0.  1.  2.  3.  4.  5.]
#  [ 6.  7.  8.  9. 10. 11.]
#  [12. 13. 14. 15. 16. 17.]
#  [18. 19. 20. 21. 22. 23.]]
打印(环绕平均值(x).numpy())
# [[ 4.6666665  4.6        5.6        6.6        7.6        8.333333 ]
#  [ 6.6        7.         8.         9.        10.        10.4      ]
#  [12.6       13.        14.        15.        16.        16.4      ]
#  [14.666667  15.4       16.4       17.4       18.4       18.333334 ]]
编辑:上面的代码可以进行调整,以处理批量矩阵,只需稍作修改:

将tensorflow导入为tf
def环绕_平均_批次(x):
x=tf。将_转换为_张量(x)
dt=x.dtype
#计算环绕和
filter=tf.常数([[1,1,1],[1,0,1],[1,1,1]],dtype=dt)
x2=tf.展开尺寸(x,轴=-1)
filter2=过滤器[:,:,tf.newaxis,tf.newaxis]
y2=tf.nn.conv2d(x2,filter2,步长=1,padding='SAME')
y=tf.挤压(y2,轴=-1)
#生成周围元素数的矩阵
s=tf.形状(x)
d=tf.fill(s[1:]-2,tf.constant(8,dtype=dt))
d=tf.pad(d,[[0,0],[1,1]],常量值=5)
顶行=tf.concat([[3],tf.fill([s[2]-2],tf.constant(5,dtype=dt)),[3]],轴=0)
d=tf.concat([[top_row],d[top_row]],轴=0)
#平均回报率
返回y/d
#试验
x=tf.重塑(tf.范围(24),(2,4,3))
打印(x.numpy())
# [[[ 0.  1.  2.]
#   [ 3.  4.  5.]
#   [ 6.  7.  8.]
#   [ 9. 10. 11.]]
# 
#  [[12. 13. 14.]
#   [15. 16. 17.]
#   [18. 19. 20.]
#   [21. 22. 23.]]]
打印(环绕\u平均\u批次(x).numpy())
# [[[ 2.6666667  2.8        3.3333333]
#   [ 3.6        4.         4.4      ]
#   [ 6.6        7.         7.4      ]
#   [ 7.6666665  8.2        8.333333 ]]
# 
#  [[14.666667  14.8       15.333333 ]
#   [15.6       16.        16.4      ]
#   [18.6       19.        19.4      ]
#   [19.666666  20.2       20.333334 ]]]

这就为2D张量提供了窍门!为了使它能够处理一批形状为
(None,X,Y)
,我使用了
tf.map\u fn(fn=surround\u average,elems=Y\u pred)
,其中
Y\u pred
是形状为
(None,X,Y)
。谢谢大家!@B.Freeman I添加了一个批处理版本的函数,应该比使用
tf.map\u fn
快得多。