Что такое структура веса alexnet и как я могу загрузить ее в свою модель? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь загрузить вес Alexnet из 'alexnet_weights.h5' в модель, построенную по приведенному ниже коду, и я получаю сообщение об ошибке, в котором говорится, что файл соответствует 11-слойной модели, а моя модель состоит из 8 слоев.

# Instantiate an empty model
model = Sequential()

# 1st Convolutional Layer
model.add(Conv2D(filters=96, input_shape=(227, 227, 3), kernel_size=(11,     11), strides=(4, 4), padding='valid'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))

# 2nd Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(5, 5), strides=(1, 1), padding='same'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))

# 3rd Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1), padding='same'))
model.add(Activation('relu'))

# 4th Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1), padding='same'))
model.add(Activation('relu'))

# 5th Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(3, 3), strides=(1, 1), padding='valid'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'))

# Passing it to a Fully Connected layer
model.add(Flatten())
# 1st Fully Connected Layer
model.add(Dense(4096, input_shape=(227 * 227 * 3,)))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.4))

# 2nd Fully Connected Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))

# 3rd Fully Connected Layer
model.add(Dense(1000))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))

# # Output Layer
# model.add(Dense(17))
# model.add(Activation('softmax'))

model.summary()
model.load_weights(params["weights_path"])
model.summary()

ошибка:

ValueError: You are trying to load a weight file containing 11 layers into a model with 8 layers.

файл предполагает совпадение с alexnet от convert-karas (отсюда: https://github.com/heuritech/convnets-keras/blob/master/convnetskeras/convnets.py), который, кажется, имеет 8 слоев (5 конв, 3 логова, поскольку у пула нет никаких параметров) есть идеи в чем проблема?

Спасибо

1 Ответ

0 голосов
/ 31 декабря 2018

Я думаю, это соглашение об именах.Файл, который вы опубликовали, разбивает свертки 2, 4, 5 на две свертки, а затем объединяет их вдоль оси объектов.Хотя в принципе это то же самое, что делать одну большую свертку, у нее могут быть наследственные причины, почему она закодирована таким образом.Если вы затем загрузите веса, ядра не подойдут, а ваша функция загрузки взорвется.

Вы можете просто использовать их код для запуска alexnet или добавить эти разбиения в ваш код.

...