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 时。一个有问题的旧声明可能仍然存在于记忆中并且可能会毁了你的一天。
这有帮助吗?
添加回答
举报