Сбросить вес в слое Keras

Я хотел бы сбросить (рандомизировать) веса всех слоев в моей модели Keras (глубокое обучение). Причина в том, что я хочу иметь возможность обучать модель несколько раз с разным распределением данных без необходимости выполнять (медленную) перекомпиляцию модели каждый раз.

Вдохновленный этим обсуждением , я пробую следующий код:

# Reset weights for layer in KModel.layers: if hasattr(layer,'init'): input_dim = layer.input_shape[1] new_weights = layer.init((input_dim, layer.output_dim),name='{}_W'.format(layer.name)) layer.trainable_weights[0].set_value(new_weights.get_value()) 

Однако это только отчасти работает.

Отчасти, потому что я проверил некоторые значения layer.get_weights (), и они, похоже, меняются. Но когда я перезапускаю обучение, значения стоимости намного ниже начальных стоимостных значений при первом запуске. Это похоже на то, что мне удалось сбросить некоторые из весов, но не все из них.

Любые советы о том, куда я иду, будут глубоко оценены. Спасибо..

    3 Solutions collect form web for “Сбросить вес в слое Keras”

    Что делать, если вы сохранили исходные веса сразу после компиляции модели, но перед ее обучением:

     model.save_weights('model.h5') 

    а затем после тренировки «перезагрузите» модель, перезагрузив исходные веса:

     model.load_weights('model.h5') 

    Это дает вам модель яблок для яблок для сравнения разных наборов данных и должна быть быстрее, чем перекомпиляция всей модели.

    Хорошо, так что, похоже, у кого-то была такая же проблема. Здесь вы найдете хорошее решение, которое решает проблему (для всех практических целей): https://gist.github.com/jkleint/eb6dc49c861a1c21b612b568dd188668

    Попробуйте set_weights .

    например:

     #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import numpy as np np.random.seed(1234) from keras.layers import Input from keras.layers.convolutional import Convolution2D from keras.models import Model print("Building Model...") inp = Input(shape=(1,None,None)) x = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(inp) output = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(x) model_network = Model(input=inp, output=output) w = np.asarray([ [[[ [0,0,0], [0,2,0], [0,0,0] ]]] ]) for layer_i in range(len(model_network.layers)): print (model_network.layers[layer_i]) for layer_i in range(1,len(model_network.layers)): model_network.layers[layer_i].set_weights(w) input_mat = np.asarray([ [[ [1.,2.,3.,10.], [4.,5.,6.,11.], [7.,8.,9.,12.] ]] ]) print("Input:") print(input_mat) print("Output:") print(model_network.predict(input_mat)) w2 = np.asarray([ [[[ [0,0,0], [0,3,0], [0,0,0] ]]] ]) for layer_i in range(1,len(model_network.layers)): model_network.layers[layer_i].set_weights(w2) print("Output:") print(model_network.predict(input_mat)) . #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import numpy as np np.random.seed(1234) from keras.layers import Input from keras.layers.convolutional import Convolution2D from keras.models import Model print("Building Model...") inp = Input(shape=(1,None,None)) x = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(inp) output = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(x) model_network = Model(input=inp, output=output) w = np.asarray([ [[[ [0,0,0], [0,2,0], [0,0,0] ]]] ]) for layer_i in range(len(model_network.layers)): print (model_network.layers[layer_i]) for layer_i in range(1,len(model_network.layers)): model_network.layers[layer_i].set_weights(w) input_mat = np.asarray([ [[ [1.,2.,3.,10.], [4.,5.,6.,11.], [7.,8.,9.,12.] ]] ]) print("Input:") print(input_mat) print("Output:") print(model_network.predict(input_mat)) w2 = np.asarray([ [[[ [0,0,0], [0,3,0], [0,0,0] ]]] ]) for layer_i in range(1,len(model_network.layers)): model_network.layers[layer_i].set_weights(w2) print("Output:") print(model_network.predict(input_mat)) 

    построить модель, скажем, двух сверточных слоев

     print("Building Model...") inp = Input(shape=(1,None,None)) x = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(inp) output = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(x) model_network = Model(input=inp, output=output) 

    затем определите свои веса (я использую простой w, но вы можете использовать np.random.uniform или что-то в этом роде, если хотите)

     w = np.asarray([ [[[ [0,0,0], [0,2,0], [0,0,0] ]]] ]) 

    Взгляните на то, какие слои внутри модели

     for layer_i in range(len(model_network.layers)): print (model_network.layers[layer_i]) 

    Установите каждый вес для каждого сверточного слоя (вы увидите, что первый слой действительно введен, и вы не хотите его менять, поэтому диапазон начинается с 1 не ноль).

     for layer_i in range(1,len(model_network.layers)): model_network.layers[layer_i].set_weights(w) 

    Создайте некоторый ввод для своего теста и предскажите результат с вашей модели

     input_mat = np.asarray([ [[ [1.,2.,3.,10.], [4.,5.,6.,11.], [7.,8.,9.,12.] ]] ]) print("Output:") print(model_network.predict(input_mat)) . input_mat = np.asarray([ [[ [1.,2.,3.,10.], [4.,5.,6.,11.], [7.,8.,9.,12.] ]] ]) print("Output:") print(model_network.predict(input_mat)) 

    Вы можете изменить его снова, если хотите, и снова проверить выход:

     w2 = np.asarray([ [[[ [0,0,0], [0,3,0], [0,0,0] ]]] ]) for layer_i in range(1,len(model_network.layers)): model_network.layers[layer_i].set_weights(w2) print("Output:") print(model_network.predict(input_mat)) 

    Пример вывода:

     Using Theano backend. Building Model... <keras.engine.topology.InputLayer object at 0x7fc0c619fd50> <keras.layers.convolutional.Convolution2D object at 0x7fc0c6166250> <keras.layers.convolutional.Convolution2D object at 0x7fc0c6150a10> Weights after change: [array([[[[ 0., 0., 0.], [ 0., 2., 0.], [ 0., 0., 0.]]]], dtype=float32)] Input: [[[[ 1. 2. 3. 10.] [ 4. 5. 6. 11.] [ 7. 8. 9. 12.]]]] Output: [[[[ 4. 8. 12. 40.] [ 16. 20. 24. 44.] [ 28. 32. 36. 48.]]]] Output: [[[[ 9. 18. 27. 90.] [ 36. 45. 54. 99.] [ 63. 72. 81. 108.]]]] данные Using Theano backend. Building Model... <keras.engine.topology.InputLayer object at 0x7fc0c619fd50> <keras.layers.convolutional.Convolution2D object at 0x7fc0c6166250> <keras.layers.convolutional.Convolution2D object at 0x7fc0c6150a10> Weights after change: [array([[[[ 0., 0., 0.], [ 0., 2., 0.], [ 0., 0., 0.]]]], dtype=float32)] Input: [[[[ 1. 2. 3. 10.] [ 4. 5. 6. 11.] [ 7. 8. 9. 12.]]]] Output: [[[[ 4. 8. 12. 40.] [ 16. 20. 24. 44.] [ 28. 32. 36. 48.]]]] Output: [[[[ 9. 18. 27. 90.] [ 36. 45. 54. 99.] [ 63. 72. 81. 108.]]]] 

    С вашего взгляда на .layers вы можете видеть, что первый слой введен, а остальные – сверточными.

    Python - лучший язык программирования в мире.