#python #tensorflow #keras
#питон #тензорный поток #keras
Вопрос:
Я использую плотный слой в TF2 в режиме графика. Входные данные для плотного слоя имеют форму batch_size * sen_len * embedding_size, и плотный слой определяется как tf.keras.layers.Dense(units=feature_dim, activation='relu')
Вывод-размер пакета * sen_len * единиц измерения
Я ожидал, что каждая строка вывода зависит только от одной и той же строки во входных данных. Однако я вижу, что значения первой строки меняются, когда ввод добавляет новую строку (однако первая строка не меняется). В одном из случаев: ввод:
[[[0.0571852736 0.0287841056 0.101935618 0.0874886662 1.05053329 0.98418349 0.969990492 0.945339322] [0.847961783 0.140915036 0.0435606614 0.0663332716 0.540852189 1.11434972 0.913121104 0.955932319] [0.981501162 0.268874854 0.0995861515 0.0536317527 -0.327278584 0.866326749 0.987028778 0.913541615] [0.213323712 0.365725756 0.109582983 0.0546317473 -0.901124239 0.841596663 0.986778796 0.913539171]]]
выход:
[[[0.578112364 0 0.658412695 0 0 0 0.261683643 0] [0.310602546 0 0.123107374 0 0 0 0.483636916 0] [0.275210589 0.00601896644 0 0 0 0.212952077 0.767679 0] [0.45270589 0.806572795 0 0 0 0 0.787857771 0]]]
и после того, как мы добавим еще одну строку на вход, выходные данные изменятся: вход:
[[[0.0571852736 0.0287841056 0.101935618 0.0874886662 1.05053329 0.98418349 0.969990492 0.945339322] [0.847961783 0.140915036 0.0435606614 0.0663332716 0.540852189 1.11434972 0.913121104 0.955932319] [0.981501162 0.268874854 0.0995861515 0.0536317527 -0.327278584 0.866326749 0.987028778 0.913541615] [0.213323712 0.365725756 0.109582983 0.0546317473 -0.901124239 0.841596663 0.986778796 0.913539171] [-0.215699628 1.06977916 0.238905698 0.0676310733 -0.868791223 -0.142939389 0.974456 0.91341567]]]
выход:
[[[0.578112364 0 0.658412755 0 0 0 0.261683613 0] [0.310602546 0 0.123107374 0 0 0 0.483636916 0] [0.275210589 0.00601896644 0 0 0 0.212952077 0.767679 0] [0.45270589 0.806572795 0 0 0 0 0.787857771 0] [0.670830309 0.880182147 0 0.296360224 0 0 0.905243635 0]]]
Как уже упоминалось, выходные данные изменились для первой строки, в то время как входные данные для этой строки остались прежними.
Ответ №1:
Выходные данные вашей модели одинаковы в обоих случаях, если вы хотите, чтобы значения каждый раз точно совпадали, вам придется установить точность для выходных переменных.
Вы можете сделать это двумя способами:
# 1. Apply keras mixed precision policy on your network from tf.keras import mixed_precision policy = mixed_precision.Policy('float32') mixed_precision.set_global_policy(policy) # 2. Apply precision checks on your output tensor. output = model.predict(input) output = np.round(output, 2)
Комментарии:
1. Попробовал первый вариант, он не сработал. Ну а небольшие изменения в выходе плотного слоя могут иметь огромные последствия.
2. если конечные слои имеют значение softmax, все, что вам нужно найти, — это максимальное значение. Не уверен, почему небольшие изменения имеют значение
3. Модель более сложная. Фактические выходные данные плотного слоя используются для других вычислений, и они укладываются в несколько слоев.