Я пытаюсь заставить Кераса обучить мультиклассовую модель классификации, которая может быть записана в сети следующим образом:
Единственный набор обучаемых параметров - это те, которые , все остальные даны. Функции fi представляют собой комбинации обычных математических функций (например, . Сигма обозначает суммирование предыдущих членов, а softmax - обычная функция. (X1, x2, ... xn) - элементы поезд или набор тестов и являются специфическим подмножеством уже выбранных исходных данных.
Модель в более глубоком:
В частности, при заданном (x_1, x_2, ..., x_n) входе в поезд или набор тестов сеть оценивает
, где fi - математические функции, - строки определенного подмножества исходных данных, а коэффициенты - параметры, которые я хочу обучить.
Поскольку я использую keras, я ожидаю, что он добавит термин смещения в каждую строку.
После вышеупомянутой оценки я применю слой softmax (каждая из m строк выше - это числа, которые будут входными для функции softmax).
В конце я хочу скомпилировать модель и запустить model.fit как обычно.
Проблема в том, что я не могу перевести выражение в keras sintax.
Моя попытка:
Следуя приведенной выше проблеме с сетью, я сначала попытался рассмотреть каждое из выражений вида как лямбда-слои в последовательной модели, но лучшее, что я смог получить, - это сочетание плотного слоя с линейной активацией. (который будет играть роль параметров строки: ), за которым следует лямбда-слой, выводящий вектор без требуемого суммирования, следующим образом:
model = Sequential()
#single row considered:
model.add(Lambda(lambda x: f_fixedRow(x), input_shape=(nFeatures,)))
#parameters set after lambda layer to get (a1*f(x1,y1),...,an*f(xn,yn)) and not (f(a1*x1,y1),...,f(an*xn,yn))
model.add(Dense(nFeatures, activation='linear'))
#missing summation: sum(x)
#missing evaluation of f in all other rows
model.add(Dense(classes,activation='softmax',trainable=False)) #should get all rows
model.compile(optimizer='sgd',
loss='categorical_crossentropy',
metrics=['accuracy'])
Кроме того, мне пришлось определить функцию в вызове лямбда-функции с фиксированным аргументом (поскольку лямбда-функция могла иметь только входные слои в качестве переменной):
def f_fixedRow(x):
#picking a particular row (as a vector) to evaluate f in (f works element-wise)
y=tf.constant(value=x[0,:],dtype=tf.float32)
return f(x,y)
Мне удалось написать функцию f с тензорным потоком (работающим поэлементно подряд), хотя это - возможный источник проблем в моем коде (и описанный выше обходной путь кажется неестественным).
Я также подумал, что, если бы я мог правильно записать поэлементную сумму вектора в вышеупомянутой попытке, я мог бы повторить ту же процедуру параллельно с функциональным API-интерфейсом keras, а затем вставить выходные данные каждой параллельной модели в Функция softmax, как мне нужно.
Другой подход, который я рассмотрел, состоял в том, чтобы обучить параметры, сохраняя их естественную матричную структуру, видимую в Описание сети , возможно, записывая матричный лямбда-слой, но я не смог найти ничего связанного с этой идеей.
В любом случае, я не уверен, что это хороший способ работы с этой моделью в keras, возможно, я упускаю важный момент из-за нестандартного способа записи параметров или отсутствия опыта с тензорным потоком. Любые предложения приветствуются.