Python Tensorflow 2.x–;周围细胞平均张量
我试图在Tensorflow 2.x中编写一个自定义损失函数,它鼓励在输出空间(2D矩阵)中逐渐增加梯度。所以,作为损失函数的一个组成部分,我想取一个张量并返回一个张量,其中每个单元代表原始张量中对应的相邻单元的平均值 例如,以左上角的单元格为例:6.3=(7+9+3)/3。或者以中间的单元格为例:4.5=(1+3+5+7+8+6+4+2)/8 考虑以下代码: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
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
快得多。