Это не так легко разоблачить в Керасе.Он углубляется, пока не вызовет выпадение Tensorflow.
Итак, хотя вы используете Keras, он также будет тензором в графе, который можно получить по имени (при нахождении его имени: ) В Tensorflow получите имена всех Tensors вграфик ).
Эта опция, конечно, будет не иметь некоторой информации о keras, вам, вероятно, придется делать это внутри слоя Lambda, чтобы Keras добавлял некоторую информацию в тензор.И вы должны быть особенно осторожны, потому что тензор будет существовать даже тогда, когда он не тренировался (там, где пропущена маска)
Теперь вы также можете использовать менее хакерский способ, который может потребовать небольшой обработки:
def getMask(x):
boolMask = tf.not_equal(x, 0)
floatMask = tf.cast(boolMask, tf.float32) #or tf.float64
return floatMask
Используйте Lambda(getMasc)(output_of_dropout_layer)
Но вместо использования Sequential
модели вам потребуется функциональный API Model
.
inputs = tf.keras.layers.Input((28, 28, 1))
outputs = tf.keras.layers.Flatten(name="flat")(inputs)
outputs = tf.keras.layers.Dense(
512,
# activation='relu', #relu will be a problem here
name = 'dense_1',
kernel_initializer=tf.keras.initializers.GlorotUniform(seed=123),
bias_initializer='zeros')(outputs)
outputs = tf.keras.layers.Dropout(0.2, name = 'dropout')(outputs)
mask = Lambda(getMask)(outputs)
#there isn't "input_mask"
#add the missing relu:
outputs = tf.keras.layers.Activation('relu')(outputs)
outputs = tf.keras.layers.Dense(
10,
activation='softmax',
name='dense_2',
kernel_initializer=tf.keras.initializers.GlorotUniform(seed=123),
bias_initializer='zeros')(outputs)
model = Model(inputs, outputs)
model.compile(...)
model.fit(...)
Обучение и прогнозирование
Поскольку вы не можете тренировать маски (это не имеет никакого смысла), это не должно быть выходом модели для тренировки.
Теперь мы можем попробовать это:
trainingModel = Model(inputs, outputs)
predictingModel = Model(inputs, [output, mask])
Но маски не существуют в предсказании, потому что отсев применяется только в тренировках.Так что это не приносит нам ничего хорошего в конце.
Единственный способ обучения - использовать фиктивные потери и фиктивные цели:
def dummyLoss(y_true, y_pred):
return y_true #but this might evoke a "None" gradient problem since it's not trainable, there is no connection to any weights, etc.
model.compile(loss=[loss_for_main_output, dummyLoss], ....)
model.fit(x_train, [y_train, np.zeros((len(y_Train),) + mask_shape), ...)
Не гарантируется, что они будут работать.