我正在实施自己的keras损失功能。如何访问张量值?
我尝试了什么
def loss_fn(y_true, y_pred):
print y_true
打印
Tensor("target:0", shape=(?, ?), dtype=float32)
是否有任何keras函数可以访问 y_true 值?
答案 0 :(得分:12)
Keras的后端有print_tensor
,可以让你这样做。你可以这样使用它:
import keras.backend as K
def loss_fn(y_true, y_pred):
y_true = K.print_tensor(y_true, message='y_true = ')
y_pred = K.print_tensor(y_pred, message='y_pred = ')
...
该函数返回相同的张量。评估该张量时,它将打印其内容,前面是message
。
来自Keras docs:
请注意,print_tensor返回与x相同的新张量,应在以下代码中使用。否则,评估期间不会考虑打印操作。
所以,确保之后使用张量。
答案 1 :(得分:5)
通常,y_true
你事先知道 - 在准备你的火车公司......
但是,有一个技巧可以查看y_true
和/或y_pred
中的值。 Keras让您有机会编写相应的callback来打印神经网络的输出。
它看起来像这样:
def loss_fn(y_true, y_pred):
return y_true # or y_pred
...
import keras.callbacks as cbks
class CustomMetrics(cbks.Callback):
def on_epoch_end(self, epoch, logs=None):
for k in logs:
if k.endswith('loss_fn'):
print logs[k]
此处loss_fn
是您在损失函数的名称,当您在模型编译期间将其传递给model.compile(...,metrics=[loss_fn],)
函数时。
所以,最后,您必须将此CustomMetrics
回调作为参数传递到model.fit()
:
model.fit(x=train_X, y=train_Y, ... , callbacks=[CustomMetrics()])
P.S。:如果你在Keras中使用Theano(或TensorFlow),你编写一个python程序,然后编译并执行。因此,在您的示例y_true
中 - 只是一个张量变量,用于进一步编译和丢失函数计数。
这意味着无法查看其中的值。例如,在Theano中,您可以在执行相应的eval()
函数后查看唯一的所谓共享变量。有关详细信息,请参阅this question。
答案 2 :(得分:1)
如果您正在使用TensorFlow的keras,则可以启用Eager Execution:
import tensorflow as tf
tf.enable_eager_execution()
然后,您可以在损失函数中打印张量。
如果收到错误消息“ ValueError:在Eager模式下仅支持TF本机优化器”。例如,您已经使用“ adam”作为优化器,则可以将模型的编译参数更改为
model.compile(optimizer = tf.train.AdamOptimizer(), loss = loss_fn, ...)
答案 3 :(得分:1)
我用
print("y_true = " + str(y_true.eval()))
用于调试。
答案 4 :(得分:1)
您可以重新定义损失函数以返回值:
def loss_fn(y_true, y_pred):
return y_true
让我们创建一些张量:
from keras import backend as K
a = K.constant([1,2,3])
b = K.constant([4,5,6])
并使用keras.backend.eval()
API评估损失函数:
loss = loss_fn(a,b)
K.eval(loss)
# array([1., 2., 3.], dtype=float32)
答案 5 :(得分:0)
您无法直接从张量符号变量中获取值。哟需要编写一个theano函数来提取值。不要忘记选择theano作为Keras的后端。
检查笔记本链接以获取一些基本的theano变量和函数:get tensor value in call function of own layers
答案 6 :(得分:0)
要打印张量的值,您需要张量具有值 例如:
import tensorflow as tf
aa = tf.constant([1,5,3])
bb = keras.layers.Dense(4, name="my_tensor")
print('aa:',aa)
print('bb:',bb)
aa: tf.Tensor([1 5 3], shape=(3,), dtype=int32)
bb: <tensorflow.python.keras.layers.core.Dense object at 0x000001D4B0137048>
如果我要打印b,我需要给他输入 像这样:
aa = tf.constant([[1,5,3]])
bb = keras.layers.Dense(4, name="my_tensor")
print('bb.weights before a assign:',bb.weights,'\n')
print('bb:',bb(aa),'\n')
print('bb.weights:',bb.weights)
输出:
bb.weight before a assign: []
bb: tf.Tensor([[1.0374807 3.4536252 1.5064619 2.1762671]], shape=(1, 4), dtype=float32)
bb.weight: [<tf.Variable 'my_tensor/kernel:0' shape=(3, 4) dtype=float32, numpy=
array([[ 0.885918 , -0.88332534, -0.40944284, -0.04479438],
[-0.27336687, 0.34549594, -0.11853147, 0.15316617],
[ 0.50613236, 0.8698236 , 0.83618736, 0.4850769 ]],
dtype=float32)>, <tf.Variable 'my_tensor/bias:0' shape=(4,) dtype=float32, numpy=array([0., 0., 0., 0.], dtype=float32)>]
如果bb是模型内的张量或输入大小固定的张量,则将无法使用
inputs = keras.Input(shape=(3,), name="inputs")
b = keras.layers.Dense(4, name="my_tensor")(inputs)
a = tf.constant([[1,5,3]])
print('b:',b(a),'\n')
输出:
TypeError: 'tensorflow.python.framework.ops.EagerTensor' object is not callable
我使用feature_extractor对其进行了修复:
inputs = keras.Input(shape=(3,), name="inputs")
bb = keras.layers.Dense(4, name="my_tensor")(inputs)
feature_extractor = keras.Model(
inputs=inputs,
outputs=bb,
)
aa = tf.constant([[1,5,3]])
print('feature_extractor:',feature_extractor(aa),'\n')
输出:
feature_extractor: tf.Tensor([[-4.9181094 4.956725 -1.8055304 2.6975303]], shape=(1, 4), dtype=float32)
答案 7 :(得分:0)
要获得任意层 keras 张量的输出值(“如何打印 Keras 张量的值?”),似乎需要不同的解决方案。打印单层的输出(来自 https://stackoverflow.com/a/65288168/2585501):
from tensorflow.keras import backend as K
layerIndex = 1
func = K.function([model.get_layer(index=0).input], model.get_layer(index=layerIndex).output)
layerOutput = func([input_data]) # input_data is a numpy array
print(layerOutput)