Saya telah melatih bobot sebagai np.array of shape (3, 3, 3, 64). Saya ingin menginisialisasi CNN Tensorflow ini dengan bobot tersebut menggunakan set_weights() seperti yang saya tunjukkan di bawah ini.

Namun, ketika saya mencobanya, kesalahan berikut muncul: 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
    )

Pertanyaan saya adalah: bagaimana cara melewati bobot berbentuk (3, 3, 3, 64) itu untuk menginisialisasi CNN itu? Saya telah memeriksa bentuk berat yang diperlukan untuk setiap lapisan dan bentuk yang saya coba lewati dan bentuk yang diperlukan cocok.

3
Liz 22 April 2020, 22:08

1 menjawab

Jawaban Terbaik

Anda bisa menggunakan argumen kernel_initializer dan bias_initializer seperti ini:

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)

Perhatikan bentuk kernel dan bias yang saya pilih. Nilai yang Anda gunakan untuk menginisialisasi layer Anda harus memiliki bentuk yang sama persis.

2
Vlad 22 April 2020, 19:33