Python 如何在损失函数中使用keras张量上的numpy函数?

Python 如何在损失函数中使用keras张量上的numpy函数?,python,numpy,tensorflow,keras,deep-learning,Python,Numpy,Tensorflow,Keras,Deep Learning,我正在使用Keras和TensorFlow后端来构建和运行一个神经网络。我需要在损失函数中的输出张量上使用numpy函数。更具体地说,我的损失函数涉及到寻找最近的邻居,为此我需要使用Keras功能。我尝试使用K.eval()将输出张量转换为numpy数组。但是,我相信,当我试图编译模型时,这会抛出一个InvalidArgument错误,因为您不能对符号变量运行eval() 下面是一个复制此错误的玩具代码片段 import numpy as np from keras import backend

我正在使用Keras和TensorFlow后端来构建和运行一个神经网络。我需要在损失函数中的输出张量上使用numpy函数。更具体地说,我的损失函数涉及到寻找最近的邻居,为此我需要使用Keras功能。我尝试使用
K.eval()
将输出张量转换为numpy数组。但是,我相信,当我试图编译模型时,这会抛出一个
InvalidArgument
错误,因为您不能对符号变量运行
eval()

下面是一个复制此错误的玩具代码片段

import numpy as np
from keras import backend as K
from keras.models import Sequential
from keras.layers.core import Flatten, Dense, Reshape
from keras.optimizers import Adam

def loss(y_true, y_pred):

    y_pred_numpy = K.eval(y_pred)
    # perform some numpy operations on y_pred_numpy
    return K.constant(0)

''' Model '''

input_shape = (10,10,10,3)
train_images = np.zeros((1,10,10,10,3))
train_labels = np.zeros((1,1,1,1,3))

model = Sequential()
model.add(Flatten(input_shape=input_shape))
model.add(Dense(3000, use_bias=True, bias_initializer='zeros'))
model.add(Reshape((10,10,10,3)))
model.summary()

opt = Adam(lr=1E-4)
model.compile(optimizer=opt, loss=loss)
上面给出了以下错误:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'flatten_3_input' with dtype float
     [[Node: flatten_3_input = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
     [[Node: reshape_3/Reshape/_11 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_20_reshape_3/Reshape", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

那么,我如何使用Keras张量而不必使用Keras重写(复杂的)numpy功能呢?

直接使用这个
numpy
函数是不可能的-因为它既不在
Tensorflow
中也不在
Theano
中实现。此外,
张量
数组
之间没有直接对应关系
张量
应理解为代数变量,而
numpy
数组应理解为数字
tensor
是一个抽象的东西,对它应用
numpy
函数通常是不可能的


但您仍然可以尝试使用函数自己重新实现此函数。然后您将使用有效的
张量
运算,不应提出任何问题。

这真的是损失函数中的问题吗???您是否尝试过使用
loss='mse'
进行编译尽管如此,我不确定keras是否会接受带张量的numpy运算(您已经看过了吗?或者提供了一种使用函数将numpy数组转换为张量上的numpy数组的方法。