Как суммировать векторы предсказания модели кераса в один вектор - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть 2 модели керас.Первый получает в качестве входных данных строку и дает прогноз, например, пяти классов.

Во второй модели я хочу использовать этот вывод.Однако выходные данные первой модели должны быть суммированы в один выход для нескольких входных данных.

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

model1 = tf.keras.Sequential()
model1.add(Input(shape=(len(inputs[0]),), dtype=tf.float32))
model1.add(Dense(256, activation='relu'))
model1.add(Dense(len(helper_classes), activation='softmax'))

model2 = tf.keras.Sequential()
model2.add(model1)
model2.add(Dense(16))
model2.add(Dense(len(classes), activation=tf.nn.softmax))
model2.layers[0].trainable = False
model2.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])

model2.summary()

Для пояснения: строки предварительно обрабатываются в вектор с плавающей точкой.

Фактический вывод модели1:
Вход: "Hello", "World", ...
Выход: [0,2, 0, 0, 0,8, 0], [0, 0, 0,4, 0, 0,6], ...

Что мне нужно:
Ввод: "Hello", "World",...
Вывод: [0,2 + 0,0 + ..., 0 + 0,0 + ..., 0 + 0,4 + ..., 0,8 + 0,0 + ..., 0 + 0,6 + ...]

Изображение модели1
Изображение модели1 после добавления Редукционного слоя


Решение
Хорошо, ярешил это сейчас.Моей первой ошибкой было то, что я подвел итог по оси 1. Что я мог исправить с помощью влад.Вторая ошибка состояла в том, что я не сохранил размеры с помощью keep_dims = true.

Решением было вставить лямбда-слой во вторую модель, которая в основном делает то, что предлагали Влад и Тибо:

model2 = tf.keras.Sequential()
model2.add(model1)

model2.add(Lambda(lambda x: K.sum(x, axis=0,keepdims=True)))

model2.add(Dense(16))
model2.add(Dense(len(classes), activation=tf.nn.softmax))
model2.layers[0].trainable = False
model2.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Если я хорошо понимаю вашу проблему, все, что вам нужно, это суммировать ваш последний Плотный слой модели1.Вы можете достичь этого, выбрав Keras backend Sum:

keras.backend.sum(x, axis=None, keepdims=False)

Вы можете найти документ здесь: https://keras.io/backend/#sum

0 голосов
/ 03 апреля 2019

Использование tf.reduce_sum():

import tensorflow as tf
output = tf.Variable([[0.2, 0.0, 0.0, 0.8, 0],[0.0, 0.0, 0.4, 0, 0.6],])
reduced = tf.reduce_sum(output, axis=0)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(reduced.eval())
    # [0.2 0.  0.4 0.8 0.6]

Чтобы использовать его в Keras, определите пользовательский слой следующим образом:

from tensorflow.keras import layers

class ReductionLayer(layers.Layer):
    def __init__(self):
        super(ReductionLayer, self).__init__()

    def call(self, inputs):
        return tf.reduce_sum(inputs, axis=0)

и добавьте его к вашей Sequential() модели:

model.add(ReductionLayer())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...