Есть ли способ вычислить градиентный спуск выходных данных Neural Nework относительно входных данных с помощью tensorflow 2.0? - PullRequest
1 голос
/ 09 мая 2020

Я обучил рекуррентную нейронную сеть для прогнозирования временных рядов, и теперь я пытаюсь найти оптимальный вход для сети (то есть вход, который минимизирует выход). С этой целью я думал о применении метода градиентного спуска (например, метода classi c SGD) с использованием функции ввода-вывода, которая представлена ​​самой обученной сетью. Мне удалось создать tf-функцию, которая вычисляет градиент сетевого выхода относительно входа, но я действительно не знаю, как использовать ее для реализации алгоритма спуска. Я прилагаю код, который я написал для моей сетевой структуры и функции градиента. Любое предложение будет очень оценено.

import tensorflow as tf
from keras.models import Sequential, Model
from keras.layers import Dense, LSTM, Concatenate, Dropout
from keras import regularizers 
from keras import optimizers
from keras.callbacks import EarlyStopping
from keras import backend as K

#Define the first RNN
first_model = Sequential()
first_model.add(LSTM(64, input_shape=(lb, nbr_features), return_sequences=False))

#Define the second RNN
second_model = Sequential()
second_model.add(LSTM(64, input_shape=(ph2, nbr_features-1), return_sequences=False))

#Concatenate the two models' outputs and pass it to the overall output layer
MergedOutput = Concatenate()([first_model.output, second_model.output])
MergedOutput = Dense(ph1, activation='relu')(MergedOutput)

#Generate the overall model
final_model = Model([first_model.input, second_model.input], MergedOutput)

#Model summary
final_model.summary()

#Compile the model
opt=optimizers.Adam(learning_rate=0.001)
final_model.compile(optimizer=opt, loss='mean_squared_error')

#Train the model 
stopping = EarlyStopping(monitor='val_loss', patience=4)
history = final_model.fit([x_train1, x_train2], y_train, batch_size=40, epochs=300, validation_data=([x_valid1, x_valid2], y_valid), callbacks=[stopping], verbose=2, shuffle=True)

#Define the gradient of the output w.r.t the input
grads = K.gradients(final_model.output, final_model.input)

#Define a TensorFlow function that computes this gradient
gradient_func = K.function([final_model.input], grads)
...