Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 使用itertools定义keras中的损失函数_Python_Tensorflow_Keras_Itertools_Loss Function - Fatal编程技术网

Python 使用itertools定义keras中的损失函数

Python 使用itertools定义keras中的损失函数,python,tensorflow,keras,itertools,loss-function,Python,Tensorflow,Keras,Itertools,Loss Function,我想定义一个损失函数,它表示隐藏层输出点之间的距离。首先,我写这篇文章时没有keras import numpy as np import itertools pts = np.array([ [10,10,10], [10,11,20], [20,11,30], [20,10,10], [10,10,20], ]) diff = list(itertools.combinations(pts, 2)) ptdiff = lambda (p1,p

我想定义一个损失函数,它表示隐藏层输出点之间的距离。首先,我写这篇文章时没有keras

import numpy as np
import itertools
pts = np.array([
    [10,10,10],
    [10,11,20],
    [20,11,30],
    [20,10,10],
    [10,10,20],
    ])
diff = list(itertools.combinations(pts, 2))

ptdiff = lambda (p1,p2): (np.sqrt(np.sum((p1 - p2) ** 2)))
diffs = map(ptdiff, diff)
np.mean(diffs)
我得到了结果。我在keras中尝试了这个损失函数,
z
是隐藏层的输出,它是一个矩阵

定义损失函数 但是它显示了
类型错误:“Tensor”对象不可编辑。
,我只是想知道如何解决这个问题。

基于非常有用的问题,您可以利用Keras的广播属性。我假设你在TensorFlow后端运行Keras。广播事务工作队:

出现了一种特殊情况,也支持这种情况,其中每个输入 数组在不同索引处具有退化维数。在这种情况下,, 结果是“外部操作”

numpy代码的可复制示例如下:

import numpy as np
import itertools

# Generate 100 random points in a 5-D space
n_dim = 5
matrix = np.random.rand(1000, 5)

# List all possible combinations
combinations = list(itertools.combinations(matrix.tolist(), 2))

def mse(tup):
    """MSE between first and second element of a tuple of lists"""
    return np.mean((np.array(tup[0]) - np.array(tup[1]))**2)

avg_mse = np.mean([mse(c) for c in combinations])
print('Average mse: {:.3f}'.format(avg_mse))
在我的例子中,这将返回平均mse:0.162

基于上述问题,您可以构建损失函数,如下所示:

import keras.backend as K

# Wrap our random matrix into a tensor
tensor = K.constant(value=matrix)

def loss_function(x):
    x_ = K.expand_dims(tensor, axis=0)
    x__ = K.expand_dims(tensor, axis=1)

    # Compute mse for all combinations, making use of broadcasting
    z = K.mean(K.square(x_ - x__), axis=-1)

    # Return average mse
    return(K.mean(z))

with K.get_session() as sess:
    print('Average mse: {:.3f}'.format(loss_function(tensor).eval()))
它为我返回
平均mse:0.162


请注意,此实现并不完全复制numpy示例中的行为。不同之处在于,还将考虑所有具有自身的行的组合(与
itertools的情况不同。组合
),并将考虑两次组合:
mse((row1,row2))
mse((row2,row1))
都将被计算,而
itertools的情况也不是这样。如我的示例所示,对于具有大量行的矩阵,这不会产生太大的差异

出于好奇:为什么要使用这个损失函数?你是否考虑使用熵作为矩阵的行之间的相异性的度量?缩放对您的应用程序重要吗?谢谢您的帮助。我想使用这个损失函数使特征空间中的数据点尽可能接近。我想测量矩阵中每两行之间的差异?
import keras.backend as K

# Wrap our random matrix into a tensor
tensor = K.constant(value=matrix)

def loss_function(x):
    x_ = K.expand_dims(tensor, axis=0)
    x__ = K.expand_dims(tensor, axis=1)

    # Compute mse for all combinations, making use of broadcasting
    z = K.mean(K.square(x_ - x__), axis=-1)

    # Return average mse
    return(K.mean(z))

with K.get_session() as sess:
    print('Average mse: {:.3f}'.format(loss_function(tensor).eval()))