【发布时间】:2020-07-11 13:12:37
【问题描述】:
我正在尝试在模型定义中使用 for 循环(并尝试在 keras 中重新创建 TabNet)。
class TabNet(keras.Model):
def __init__(self, input_dim, output_dim, steps, n_d, n_a, gamma=1.3):
super().__init__()
self.n_d, self.n_a, self.steps = n_d, n_a, steps
self.shared = SharedBlock(n_d+n_a)
self.first_block = SharedBlock(n_a)
self.decision_blocks = [DecisionBlock(n_d+n_a)] * steps
self.prior_scale = Prior(input_dim, gamma)
self.bn = layers.BatchNormalization()
self.attention = [AttentiveTransformer(input_dim)] * steps
self.final = layers.Dense(output_dim)
self.eps = 1e-8
@tf.function
def call(self, x):
self.prior_scale.reset()
final_out = 0
M_loss = 0
x = self.bn(x)
attention = self.first_block(self.shared(x))
for i in range(self.steps):
mask = self.attention[i](attention, self.prior_scale.P)
M_loss += tf.reduce_sum(mask * tf.math.log(mask + self.eps), axis=-1) / self.steps
prior = self.prior_scale(mask)
out = self.decision_blocks[i](self.shared(x * prior))
attention, output = out[:,:self.n_a], out[:,self.n_a:]
final_out += tf.nn.relu(output)
return self.final(final_out), M_loss
如果您不知道这些单独的块是什么,只需假设它们是线性层。如果你想看看它们到底是什么,我有 a colab notebook 的完整代码。
但是,我无法训练它,因为我收到了错误 iterating over tf.Tensor is not allowed: AutoGraph did not convert this function. Try decorating it directly with @tf.function.。我已经装饰了它,但仍然没有帮助。
我相当确定当我执行model.fit(train_x, train_y) 时,是 for 循环导致了我的错误。希望有任何关于如何以 tensorflow 方式实现上述 for 循环的想法。 tf.while_loop 是我到目前为止所看到的所有内容,与我想做的相比,给出的示例相当简单。
【问题讨论】:
标签: tensorflow keras