Нет, на самом деле это не проблема for
l oop. Я проверил ваш код, проблема заключалась в том, что вы забыли вызвать конструктор суперкласса в своих SharedBlock
, DecisionBlock
и Prior
.
Например, ваш код должен выглядеть так.
class SharedBlock(layers.Layer):
def __init__(self, units, mult=tf.sqrt(0.5)):
super().__init__()
self.layer1 = FCBlock(units)
self.layer2 = FCBlock(units)
self.mult = mult
После внесения этих изменений вы больше не увидите эту ошибку, но появится что-то еще.
TypeError: in user code:
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:1147 predict_function *
outputs = self.distribute_strategy.run(
<ipython-input-46-f609cb1acdfa>:15 call *
self.prior_scale.reset()
TypeError: tf__reset() missing 1 required positional argument: 'len_x'
Чтобы решить эту проблему, вам необходимо внести следующие изменения в класс class Prior(layers.Layer):
.
def reset(self, len_x=1.0):
self.P = 1.0
Тогда вы получите еще одну проблему.
AttributeError: в коде пользователя:
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:1147 predict_function *
outputs = self.distribute_strategy.run(
<ipython-input-46-f609cb1acdfa>:26 call *
out = self.decision[i](self.shared(x * prior))
AttributeError: 'TabNet' object has no attribute 'decision'
Для этой проблемы я попрошу открыть другой вопрос поскольку я думаю, что ваша основная проблема решена.
ОБНОВЛЕНИЕ:
Вы можете заглянуть в раздел комментариев этого ответа, там было предоставлено решение проблемы AttributeError: 'TabNet' object has no attribute 'decision'
ОБНОВЛЕНИЕ: 21/07
Я должен вас снова разочаровать, что проблема не в for
l oop.
Если вы внимательно посмотрите журнал ошибок, вы увидите, что проблема связана с функцией full_loss
.
<ipython-input-10-07e59f23d230>:7 full_loss *
logits, M_loss = y_pred
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:561 __iter__
self._disallow_iteration()
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:554 _disallow_iteration
self._disallow_when_autograph_enabled("iterating over `tf.Tensor`")
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:532 _disallow_when_autograph_enabled
" decorating it directly with @tf.function.".format(task))
OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed: AutoGraph did not convert this function. Try decorating it directly with @tf.function.
Точная проблема вызвана приведенным ниже утверждением.
logits, M_loss = y_pred
Если вы используете приведенный ниже код, который не использует вашу функцию потерь, вы увидите другой результат.
model.compile('Adam', loss='sparse_categorical_crossentropy')
model.fit(train_x, train_y, batch_size=1)
Received a label value of 1 which is outside the valid range of [0, 1). Label values: 1
[[node sparse_categorical_crossentropy_1/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at <ipython-input-26-d39f533b7a69>:2) ]] [Op:__inference_train_function_18003]
Я не совсем понимаю код модели, и model.summary()
не так полезен в вашем случае. Есть некоторая проблема с вашим последним слоем, по крайней мере, сообщение об ошибке предполагает, что у вас недостаточно нейронов (по 1 для каждого класса).
Я предлагаю изучить последний слой и функцию потерь.
Почему я уверен, что это не из-за for
l oop, потому что даже если вы прокомментируете for
l oop, вы все равно получите ту же ошибку.
Надеюсь, я помог вам в дальнейшем, мне потребовалось несколько часов, чтобы разобраться в этом.