【问题标题】:How to use numpy functions on a keras tensor in the loss function?如何在损失函数中的 keras 张量上使用 numpy 函数?
【发布时间】:2017-10-16 16:49:59
【问题描述】:

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

这是一个重现此错误的玩具代码 sn-p。

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 功能?

【问题讨论】:

  • 真的是损失函数的问题???你试过用loss='mse'编译吗? - 即使,我不确定 keras 是否会接受张量的 numpy 操作。 :(
  • 你看过this question了吗?

标签: python numpy tensorflow keras deep-learning


【解决方案1】:

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

但您仍然可以尝试使用keras.backend 函数自行重新实现此函数。然后您将使用有效的tensor 操作,应该不会出现任何问题。

【讨论】:

猜你喜欢
  • 2020-08-17
  • 2021-02-08
  • 2017-08-20
  • 1970-01-01
  • 2020-12-02
  • 2020-05-30
  • 2019-04-03
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多