Я строю собственную ячейку 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.