我使用Keras和TensorFlow后端来构建和运行神经网络。我需要在丢失函数的输出张量上使用numpy函数。更具体地说,我的丢失函数涉及找到最近邻居,为此我需要使用ckdTree的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功能,那么我如何使用Keras张量?
答案 0 :(得分:2)
直接使用此numpy
函数是不可能的 - 因为它既未在Tensorflow
也未Theano
中实现。此外 - tensors
和arrays
之间没有直接对应关系。应将Tensors
理解为代数变量,而将numpy
数组理解为数字。 tensor
是一个抽象的东西,通常不可能使用numpy
函数。
但您仍然可以尝试使用keras.backend
函数自行重新实现此功能。然后,您将使用有效的tensor
操作,不应提出任何问题。