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

Я пытаюсь реализовать нейронную сеть с одним скрытым слоем, который может представлять решение для PDE (скажем, уравнения Лапласа).Следовательно, целевая функция зависит от градиента нейронной сети по отношению к ее входу.

Теперь я реализовал вычисление вторых производных, используя лямбда-слои.Однако, когда я пытаюсь вычислить градиент выходных данных относительно параметров модели, я получаю ошибку.

def grad(y, x, nameit):
    return Lambda(lambda z: K.gradients(z[0], z[1]), output_shape = [1], name = nameit)([y,x])

def network(i):
    m = Dense(100, activation='sigmoid')(i)
    j = Dense(1, name="networkout")(m)
    return j

x1 = Input(shape=(1,))

a = network(x1)
b = grad(a, x1, "dudx1")
c = grad(b, x1, "dudx11")

model = Model(inputs = [x1], outputs=[c])
model.compile(optimizer='rmsprop',
              loss='mean_squared_error',
              metrics=['accuracy'])
x1_data = np.random.random((20, 1))
labels = np.zeros((20,1))
model.fit(x1_data,labels)

Это ошибка:

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

Почему Keras не может вычислить градиенты с обучаемыми параметрами?

1 Ответ

0 голосов
/ 31 марта 2019

Проблема в networkout слое. Он поддерживает линейную активацию, которая предотвращает прохождение градиентов через него, и поэтому возвращает ошибку «Нет» градиентов. В этом случае вам нужно добавить любую функцию активации, кроме линейной, к слою networkout.

def network(i):
    m = layers.Dense(100)(i)
    j = layers.Dense(1, name="networkout", activation='relu')(m)
    return j

Однако предыдущий слой может иметь линейную активацию.

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