Как использовать сотовую сеть RNN в сети? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь использовать настроенную ячейку RNN в моей сети. Я начал с примера ячейки RNN Keras, где ячейка RNN определена как MinimalRNNCell. Когда я пытаюсь использовать определенную ячейку в моей текущей сети, заменив простой RNN, который я использовал ранее, на настроенную ячейку RNN, но эта ошибка появляется:

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

class MinimalRNNCell(Layer):

    def __init__(self, units, **kwargs):
        self.units = units
        self.state_size = units
        super(MinimalRNNCell, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
                                      initializer='uniform',
                                      name='kernel')
        self.recurrent_kernel = self.add_weight(
            shape=(self.units, self.units),
            initializer='uniform',
            name='recurrent_kernel')
        self.built = True

    def call(self, inputs, states):
        prev_output = states[0]
        h = K.dot(inputs, self.kernel)
        output = h + K.dot(prev_output, self.recurrent_kernel)
        return output, [output]

# Let's use this cell in a RNN layer:

cell = MinimalRNNCell(32)
x = keras.Input((None, n_f))
layer = RNN(cell)
y = layer(x)


# prepare sequence
length = 10
n_f = 10
# define LSTM configuration
n_neurons = length
n_batch = length
n_epoch = 1000
# create LSTM
model = Sequential()
#model.add(SimpleRNN(n_neurons, input_shape=(length, n_f)   ,return_sequences=True))
model.add(RNN(cell, input_shape=(length, n_f) ,return_sequences=True))

model.add(TimeDistributed(Dense(n_neurons)))
model.add(Activation('relu'))
model.add(Dense(1))

model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
ES = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience= int(n_epoch/2))
history = model.fit(X_train, y_train, validation_data= (X_Val,y_Val),epochs=n_epoch, batch_size=n_batch, verbose=2 , callbacks=[ES])
...