def test_train_meta_learner(backprop_depth: int, batch_size: int, lr_bias: float) -> Model: """ :return: Keras Model for Meta-Learner used during training of Meta-Learner using BPTT """ # same inputs as in other models to use same API grads_input = Input(batch_shape=(batch_size, backprop_depth, 1), name='grads_input_train') loss_input = Input(batch_shape=(batch_size, backprop_depth, 1), name='loss_input_train') params_input = Input(batch_shape=(batch_size, 1), name='params_input_train') full_input = Concatenate( axis=-1, name='concat_grads_loss')([grads_input, loss_input]) lstm = LSTM(2, name='lstm') lstm.trainable = False dummy_lstm = lstm(full_input) lr = Dense(1, name='dense', kernel_initializer=Constant(value=0.0), bias_initializer=Constant(value=lr_bias), activation='sigmoid')(dummy_lstm) final_grad = Lambda(lambda x: x[:, -1, :], name='final_grad_input')(grads_input) right = Multiply(name='output_right')([lr, final_grad]) output = Subtract(name='output')([params_input, right]) return Model(inputs=[grads_input, loss_input, params_input], outputs=output)
def test_predict_meta_learner(learner: Model, backprop_depth: int, batch_size: int) -> MetaPredictLearnerModel: """ :return: MetaPredictLearnerModel for Meta-Learner used during training of Meta-Learner using BPTT """ grads_tensor = K.concatenate([ K.flatten(g) for g in K.gradients(learner.total_loss, learner._collected_trainable_weights) ], axis=0) # reshape loss/grads so they have shape required for LSTM: (batch_size, 1, 1) grads_tensor = K.reshape(grads_tensor, shape=(batch_size, 1, 1)) loss_tensor = tf.fill(value=learner.total_loss, dims=[batch_size, 1, 1]) grads_input = Input(tensor=grads_tensor, batch_shape=(batch_size, 1, 1), name='grads_input_predict') loss_input = Input(tensor=loss_tensor, batch_shape=(batch_size, 1, 1), name='loss_input_predict') params_tensor = K.concatenate( [K.flatten(p) for p in learner._collected_trainable_weights]) params_input = Input(tensor=params_tensor, batch_shape=(batch_size, ), name='params_input_predict') full_lstm_input = Concatenate( axis=-1, name='concat_grads_loss')([grads_input, loss_input]) lstm = LSTM(2, stateful=True, return_state=True, name='lstm') lstm.trainable = False lstm_full_output = lstm(full_lstm_input) lstm_output = lstm_full_output[0] states_outputs = lstm_full_output[1:] lr = Dense(1, name='learning_rate_dense', kernel_initializer=Constant(value=0.0), bias_initializer=Constant(value=0.0), activation='sigmoid')(lstm_output) flat_grads = Flatten(name='flatten_grads_input')(grads_input) right = Multiply(name='output_right')([lr, flat_grads]) output = Subtract(name='output')([params_input, right]) return MetaPredictLearnerModel( learner=learner, train_mode=True, backpropagation_depth=backprop_depth, inputs=[grads_input, loss_input, params_input], input_tensors=[grads_tensor, loss_tensor, params_tensor], states_outputs=states_outputs, outputs=output)
texts_lstm = LSTM(lstm_size, return_sequences=True, input_shape=(maxlen, len(word_indices)), dropout=dropout_rate, recurrent_dropout=dropout_rate, name='LSTM_input')(texts_input) layer_0 = Dropout(dropout_rate)(concatenate( [topic_embed, video_embed, texts_lstm], axis=2, name='merged_input')) layer_1 = LSTM(lstm_size, return_sequences=False, input_shape=(lstm_size,), dropout=dropout_rate, recurrent_dropout=dropout_rate, name='meta-LSTM')(layer_0) layer_2 = Dense(len(word_indices), name='word_selector')(layer_1) output = Activation('softmax', name='output')(layer_2) topic_input.trainable = True topic_embed.trainable = True video_input.trainable = True video_embed.trainable = True texts_input.trainable = True texts_lstm.trainable = True layer_1.trainable = True model_video = Model(inputs=[topic_input, video_input, texts_input], outputs=[output]) model_video.compile(loss='categorical_crossentropy', optimizer=optimiser) params = np.repeat(np.atleast_2d(video_param), maxlen, axis=0) Writing = True while Writing or Loop: model_video.load_weights(brain_file) # glitch_layer = model_video.layers[10].get_weights() # glitch_sublayer = copy(glitch_layer[1]) # max_val = np.abs(glitch_sublayer)[:].max() # mut_ratio = 0.2*float(np.random.randint(1000))/10