Перепутал графики TensorBoard из-за операций Python - PullRequest
0 голосов
/ 03 мая 2020

Этот вопрос касается TensorFlow (и TensorBoard) версии 2.2rc3, но у меня возникла та же проблема с 2.1.

Рассмотрим следующий странный код:

from datetime import datetime

import tensorflow as tf
from tensorflow import keras

inputs = keras.layers.Input(shape=(784, ))    

x1 = keras.layers.Dense(32, activation='relu', name='Model/Block1/relu')(inputs)
x1 = keras.layers.Dropout(0.2, name='Model/Block1/dropout')(x1)
x1 = keras.layers.Dense(10, activation='softmax', name='Model/Block1/softmax')(x1)

x2 = keras.layers.Dense(32, activation='relu', name='Model/Block2/relu')(inputs)
x2 = keras.layers.Dropout(0.2, name='Model/Block2/dropout')(x2)
x2 = keras.layers.Dense(10, activation='softmax', name='Model/Block2/softmax')(x2)

x3 = keras.layers.Dense(32, activation='relu', name='Model/Block3/relu')(inputs)
x3 = keras.layers.Dropout(0.2, name='Model/Block3/dropout')(x3)
x3 = keras.layers.Dense(10, activation='softmax', name='Model/Block3/softmax')(x3)

x4 = keras.layers.Dense(32, activation='relu', name='Model/Block4/relu')(inputs)
x4 = keras.layers.Dropout(0.2, name='Model/Block4/dropout')(x4)
x4 = keras.layers.Dense(10, activation='softmax', name='Model/Block4/softmax')(x4)

outputs = x1 + x2 + x3 + x4

model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.summary()

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255

model.compile(loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              optimizer=keras.optimizers.RMSprop(),
              metrics=['accuracy'])

logdir = "logs/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
model.fit(x_train, y_train,
          batch_size=64,
          epochs=5,
          validation_split=0.2,
          callbacks=[tensorboard_callback])

При запуске и просмотре графика, созданного в TensorBoard , вы увидите следующее .

Как видно, операции сложения действительно ужасны.

При замене строки

outputs = x1 + x2 + x3 + x4

на строки:

outputs = keras.layers.add([x1, x2], name='Model/add/add1')
outputs = keras.layers.add([outputs, x3], name='Model/add/add2')
outputs = keras.layers.add([outputs, x4], name='Model/add/add3')

гораздо более приятный график создается TensorBoard (на этом втором снимке экрана подробно показаны Модель, а также один из внутренних блоков).

Разница между двумя представлениями Модель заключается в том, что во втором мы можем назвать операции сложения и сгруппировать их.

Я не мог найти способ назвать эти операции, кроме как с помощью keras.layers.add(). В этой модели проблема выглядит не так критично, поскольку модель проста, и ее легко заменить + на keras.layers.add(). Однако в более сложных моделях это может стать настоящей болью. Например, такие операции, как t[:, start:end], должны быть переведены в сложные вызовы tf.strided_slice(). Таким образом, мои представления моделей довольно грязные из-за большого количества крипт c операций по сбору, переходу и согласованию.

Интересно, есть ли способ обернуть / сгруппировать такие операции, чтобы сделать более приятные графы в TensorBoard.

Ответы [ 2 ]

1 голос
/ 03 мая 2020
outputs = keras.layers.Add()([x1, x2, x3, x4])
0 голосов
/ 04 мая 2020

Следуя подсказке Марко Черлиани, слой Lambda действительно очень полезен здесь. Таким образом, следующий код будет хорошо группировать +:

outputs = keras.layers.Lambda(lambda x: x[0] + x[1], name='Model/add/add1')([x1, x2])
outputs = keras.layers.Lambda(lambda x: x[0] + x[1], name='Model/add/add2')([outputs, x2])
outputs = keras.layers.Lambda(lambda x: x[0] + x[1], name='Model/add/add3')([outputs, x2])

. Или, если необходимо, чтобы обернуть шаги, следующий код будет хорошо группировать t[]:

x1 = keras.layers.Lambda(lambda x: x[:, 0:5], name='Model/stride_concat/stride1')(x1) # instead of x1 = x1[:, 0:5]
x2 = keras.layers.Lambda(lambda x: x[:, 5:10], name='Model/stride_concat/stride2')(x2) # instead of x2 = x2[:, 5:10]
outputs = keras.layers.concatenate([x1, x2], name='Model/stride_concat/concat')

Этот ответ заданный вопрос Но на самом деле, есть еще открытая проблема, которая описана в другом вопросе: ' TensorFlowOpLayer портит графики TensorBoard '

...