为了账号安全,请及时绑定邮箱和手机立即绑定

打印张量元素 (v1.14)

打印张量元素 (v1.14)

海绵宝宝撒 2023-06-20 15:39:46
我想了解 keras/tensorflow 是如何工作的。在这个例子中,我正在使用一个LSTM具有定义loss功能的网络。在此示例中,我想打印y_pred和loss变量中的值,但是标准print()函数不会打印实际数值。当我尝试print()函数时,我得到以下输出:Tensor("loss_13/dense_14_loss/strided_slice:0", shape=(), dtype=float32)import tensorflow as tffrom tensorflow.keras import Sequential, backend as Kfrom tensorflow.keras.layers import Dense, LSTM, Dropoutfrom tensorflow.keras.losses import categorical_crossentropyregressor = Sequential()regressor.add(LSTM(units = 10, dropout=0.10, return_sequences = True, input_shape = (X.shape[1], X.shape[2])))regressor.add(Dense(units = 4, activation='softmax'))regressor.compile(optimizer = optimizer, loss = weight_fx(np.array([0.005,0.20,0.79,0.005])), metrics = ['categorical_accuracy'])def weight_fx(weights):    weights = K.variable(weights)         def loss(y_true, y_pred):        y_pred /= K.sum(y_pred, axis=-1, keepdims=True)        print(y_pred)        loss = y_true * K.log(y_pred) * weights        return loss        return loss
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

尝试这样做:


import tensorflow as tf

from tensorflow.keras import Sequential, backend as K

from tensorflow.keras.layers import Dense, LSTM, Dropout

from tensorflow.keras.losses import categorical_crossentropy

import numpy as np


X = tf.ones((10,10,10))

y = tf.ones((10,1))

def weight_fx(weights):

    weights = K.variable(weights)     

    def loss(y_true, y_pred):

        y_pred /= K.sum(y_pred, axis=-1, keepdims=True)

        tf.print(y_pred)

        loss = y_true * K.log(y_pred) * weights

        return loss

    

    return loss


regressor = Sequential()

regressor.add(LSTM(units = 10, dropout=0.10, return_sequences = True, 

                   input_shape = (X.shape[1], X.shape[2])))

regressor.add(Dense(units = 4, activation='softmax'))

regressor.compile(optimizer = 'adam', loss = weight_fx(np.array([0.005,0.20,0.79,0.005])), metrics = ['categorical_accuracy'])

regressor.fit(X,y)

  • 问:你为什么看到Tensor("loss_13/dense_14_loss/strided_slice:0", shape=(), dtype=float32)

  • 答:Tensorflow 预计损失函数会被频繁调用,因此尽可能对其进行优化至关重要。Tensorflow 有一种方法可以做到这一点,称为“追踪”。这基本上意味着传递一个“检测器”变量,该变量“体验”函数中的所有操作并记住它们。然后,基于这些经验,Tensorflow 构建了一个单独的所谓“图形”函数,该函数速度更快,并且无法调用 python 中具有副作用的许多常见函数。喜欢print()。你看到的是一个检测器或“示踪剂”。它只运行一次。

  • 那我该如何调试呢?

  • 有几种方法可以做到这一点。如果要print调试,请使用tf.print. 根据我的经验,这有时有效,有时无效。如果没有,并且您仍然只看到检测器变量,请使用model.run_eagerly = True或将其作为参数传递给model.compile. 即使你不使用tf.print和设置run_eagerly,python 的内置print仍然可以工作(试试这个)。最后但同样重要的是,您可以将所有副作用函数包装在一个tf.py_function

另外,请确保先定义函数,然后在 中使用它model.compile,尤其是在使用 Jupyter notebook 时。一个有问题的旧声明可能仍然存在于记忆中并且可能会毁了你的一天。

这有帮助吗?


查看完整回答
反对 回复 2023-06-20
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

我还没有尝试过,但你应该始终使用:

tf.print(value)

而不是正常的

print(value)
查看完整回答
反对 回复 2023-06-20
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信