Как исправить: недифференцируемые функции в моей пользовательской ячейке RNN - PullRequest
1 голос
/ 11 июля 2019

Я строю собственную ячейку RNN, в которой я хочу обновлять только часть состояний на каждом шаге Модель keras построена, но я получаю ошибку, что градиенты недифференцируемы. Это имеет смысл, благодаря использованию функций tf.gather_nd и tf.scatter_nd, но мне интересно, есть ли способ обойти это? Любая помощь будет высоко ценится!

В настоящее время используется TF2.0 и пользовательские слои keras.

Следующий код показывает функцию вызова в пользовательской ячейке RNN. По сути, существует обход для большинства состояний вокруг шага в ячейке.

    def call(self, inputs, state):
        u, p = inputs
        state = state[0] + tf.zeros((state[0].shape))
        u = tf.reshape(u, (u.shape[0],self.players*2*(self.outputs+1),1))
        xp = self.get_game_states(state, p)
        xp_plus = tf.matmul(self.A, xp) + tf.matmul(self.B, u)
        state = self.update_states(state, p, xp_plus, xp)
        return state, [state]

    def get_game_states(self, states, players_in_game):
        batch_size = players_in_game.shape[0]
        state = tf.stack([tf.gather_nd(states[i], players_in_game[i]) for i in range(batch_size)],axis=0)
        state = tf.reshape(state, (batch_size, self.player_states*self.players*2, 1))
        return state

    def update_states(self, states, players_in_game, xp_plus, xp):
        state_change = xp_plus - xp
        state_change = tf.reshape(state_change, ((state_change.shape[0], self.players*2,-1)))
        sparse_tensor = tf.stack([tf.scatter_nd(players_in_game[i], state_change[i], states[0].shape) for i in range(states.shape[0])])
        states = states + sparse_tensor
        return states

ValueError: Операция имеет None для градиента. Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (то есть, дифференцируемы). Обычные операции без градиента: K.argmax, K.round, K.eval.

...