Keras: установить начальные состояния простого рекуррентного слоя, сохраняя stateful = False - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно установить начальные состояния моих блоков RNN с помощью keras, чтобы изучить реакцию сети (предварительное обучение) на разные начальные значения, но меня смущает синтаксис методов. Это моя модель:

model = Sequential()
model.add(SimpleRNN(units=N_rec,return_sequences=True,input_shape=(None, 2), kernel_initializer='glorot_uniform', recurrent_initializer= pepe ,activation='tanh',use_bias=False))
model.add(Dense(units=1,input_dim=N_rec))

Мой тип данных - временные ряды двух каналов и фиксированная длина. Мне нужно использовать «stateful = False».

Я использовал последовательную модель и пытался установить состояния слоя, но она не работает. Я использую: Keras версия 2.0.6

Я использовал: model.layers[0].states[0] =np.ones(N_rec), где N_rec - количество единиц. Без эффекта. Я использовал «Единицы», чтобы установить начальное значение, а затем я попытался с различными инициализациями. Я также пытаюсь: K.set_value(model.layers[0].states[0],h_tm) где h_tm= tf.zeros([N_rec]) со следующей ошибкой:

AttributeError: объект 'NoneType' не имеет атрибута 'dtype'

Я также пытаюсь использовать:

def set_states(model, states):
for (d,_), s in zip(model.state_updates, states):
    K.set_value(d, s) 

Но так как я не настолько опытен в программировании, я не уверен в синтаксисе. Чтобы напечатать состояния, которые я использовал:

for layer in model.layers:
        print" 1"
        if getattr(layer,'stateful',False):
            if hasattr(layer,'states'):
               print "a c a "
               for state in layer[0].states:
                   statesAll.append(K.get_value(state))
print"STATES",statesAll 

Но я получаю пустой список.

Я также пытаюсь использовать синтаксис функциональной модели, но я не уверен, что я делаю правильно.

Я также пробую с состояниями сброса, но не позволяет выставить аргумент функции, и это функция модели, а не функция слоя.

Примеры, которые я нашел, являются более сложными, потому что они являются кодировщиками.

...