У меня есть 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'])