set_weights () в модели Tensorflow - PullRequest
1 голос
/ 22 апреля 2020

У меня есть предварительно подготовленные веса как np.array формы (3, 3, 3, 64). Я хочу инициализировать этот Tensorflow CNN с этими весами, используя set_weights(), как показано ниже.

Однако, когда я пытаюсь это сделать, появляется следующая ошибка: ValueError: You called set_weights(weights) on layer "conv2d_3" with a weight list of length 3, but the layer was expecting 2 weights. Provided weights: [[[[-0.15836713 -0.178757 0.16782044 ...

model = models.Sequential()
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(224, 224, 3)))
model.layers[0].set_weights(weights)
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(256, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(256, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(512, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(512, (3, 3), activation='relu'))

model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(4, activation='softmax'))
print(model.summary())


adam = optimizers.Adam(learning_rate=0.0001, amsgrad=False)
model.compile(loss='categorical_crossentropy',
              optimizer=adam,
              metrics=['accuracy'])


history = model.fit_generator(
    train_generator,
    steps_per_epoch=np.ceil(nb_train_samples/batch_size),
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=np.ceil(nb_validation_samples / batch_size),
    class_weight=class_weight
    )

Мой вопрос: как мне передать эти (3, 3, 3, 64) фасонные веса, чтобы инициализировать этот CNN? Я уже проверил весовые формы, необходимые для каждого слоя, и формы, которые я пытаюсь передать, и требуемая форма соответствуют.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете просто использовать kernel_initializer и bias_initializer аргументы, подобные этому:

import numpy as np

# init_kernel and init_bias are initialization weights that you have
init_kernel = np.random.normal(0, 1, (3, 3, 3, 64))
init_bias = np.zeros((64,))
kernel_initializer = tf.keras.initializers.constant(init_kernel)
bias_initializer = tf.keras.initializers.constant(init_bias)

conv_layer = tf.keras.layers.Conv2D(64, (3, 3),
                                    activation='relu',
                                    input_shape=(224, 224, 3),
                                    kernel_initializer=kernel_initializer,
                                    bias_initializer=bias_initializer)

Обратите внимание на формы ядра и смещения, которые я выбрал. Значения, которыми вы инициализируете свой слой, должны иметь одинаковые формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...