打印张量元素 (v1.14)

我想了解 keras/tensorflow 是如何工作的。


在这个例子中,我正在使用一个LSTM具有定义loss功能的网络。在此示例中,我想打印y_pred和loss变量中的值,但是标准print()函数不会打印实际数值。


当我尝试print()函数时,我得到以下输出:Tensor("loss_13/dense_14_loss/strided_slice:0", shape=(), dtype=float32)


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


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 = 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


海绵宝宝撒
浏览 128回答 2
2回答

慕容森

尝试这样做:import tensorflow as tffrom tensorflow.keras import Sequential, backend as Kfrom tensorflow.keras.layers import Dense, LSTM, Dropoutfrom tensorflow.keras.losses import categorical_crossentropyimport numpy as npX = 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 lossregressor = 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 时。一个有问题的旧声明可能仍然存在于记忆中并且可能会毁了你的一天。这有帮助吗?

慕勒3428872

我还没有尝试过,但你应该始终使用:tf.print(value)而不是正常的print(value)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python