Настройте как функцию (или слой), так и ее градиент без использования авто-дифференцирования
Можно ли на любом NN-ориентированном языке в Python создать слой, который вызывает внешний алгоритм с помощью подпроцесса, и определить градиент вручную вместо использования автоматического дифференцирования? Можно ли тогда включить этот "жестко закодированный" градиент в процедуру обратного распространения?
Гипотетический код:
x = keras.layers.Conv1D(filters=4,kernel_size=8,strides=1,input_shape=(174,1),padding='same')(inputs)
x = keras.layers.Dense(1, activation='sigmoid')(x)
import subprocess as sp
def external_fun(x):
return sp.checkoutput('EXTERNAL_PROGRAM APPLIED TO X',shell=True)
def grad_external_fun(x):
return gradient_of_function # to be computed again using the external program
predictions=keras.layers.Lambda(external_fun)(x)
model = keras.Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])