#deep-learning #computer-vision #tensorflow2.0
#глубокое обучение #компьютерное зрение #тензорный поток 2,0
Вопрос:
Я пытался создать инцепционную сеть. Я создал индивидуальное начальное подразделение. Каким-то образом, когда я использую его в своей модели, общие параметры в сводке модели отображаются равными нулю. Может ли кто-нибудь любезно указать мне, где я совершаю ошибку.
Код для начального уровня единицы измерения
class InceptionUnit(keras.layers.Layer): def __init__(self, filters, activation='relu', **kwargs): super().__init__(**kwargs) self.filters = filters self.activation = keras.activations.get(activation) def call(self, inputs): out1 = keras.layers.Conv2D(filters=self.filters[0], kernel_size=1, padding='SAME')(inputs) out1 = self.activation(out1) out2 = keras.layers.Conv2D(filters=self.filters[1], kernel_size=1, padding='SAME')(inputs) out2 = self.activation(out2) out2 = keras.layers.Conv2D(filters=self.filters[2], kernel_size=3, padding='SAME')(out2) out2 = self.activation(out2) out3 = keras.layers.Conv2D(filters=self.filters[3], kernel_size=1, padding='SAME')(inputs) out3 = self.activation(out3) out3 = keras.layers.Conv2D(filters=self.filters[4], kernel_size=5, padding='SAME')(out3) out3 = self.activation(out3) out4 = keras.layers.MaxPooling2D(pool_size=(3, 3), strides=1, padding='SAME')(inputs) out4 = keras.layers.Conv2D(filters=self.filters[5], kernel_size=1, padding='SAME')(out4) out4 = self.activation(out4) out = keras.layers.concatenate([out1, out2, out3, out4]) return out
Код для модели:
filters = [[64, 96, 128, 16, 32, 32], [128, 128, 192, 32, 96, 64], [192, 96, 208, 16, 48, 64], [160, 112, 224, 24, 64, 64], [128, 128, 256, 24, 64, 64], [112, 144, 288, 32, 64, 64], [256, 160, 320, 32, 128, 128], [256, 160, 320, 32, 128, 128], [384, 192, 384, 48, 128, 128]] model = keras.models.Sequential() model.add(keras.layers.InputLayer(input_shape=(224, 224, 3))) model.add(keras.layers.Conv2D(filters=64, kernel_size=7, strides=2, padding='SAME', activation='relu')) model.add(keras.layers.BatchNormalization()) model.add(keras.layers.MaxPool2D(pool_size=(3, 3), strides=2, padding='SAME')) model.add(keras.layers.Conv2D(filters=64, kernel_size=1, activation='relu')) model.add(keras.layers.BatchNormalization()) model.add(keras.layers.Conv2D(filters=192, kernel_size=3, strides=1, padding='SAME', activation='relu')) model.add(keras.layers.BatchNormalization()) model.add(keras.layers.MaxPool2D(pool_size=(3, 3), strides=2, padding='SAME', )) model.add(InceptionUnit(filters[0])) model.add(InceptionUnit(filters[1])) model.add(keras.layers.MaxPool2D(pool_size=(3, 3), strides=2, padding='SAME')) model.add(InceptionUnit(filters[2])) model.add(InceptionUnit(filters[3])) model.add(InceptionUnit(filters[4])) model.add(InceptionUnit(filters[5])) model.add(InceptionUnit(filters[6])) model.add(keras.layers.MaxPool2D(pool_size=(3, 3), strides=2, padding='SAME')) model.add(InceptionUnit(filters[7])) model.add(InceptionUnit(filters[8])) model.add(keras.layers.GlobalAveragePooling2D()) model.add(keras.layers.Dropout(rate=0.4)) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(units=1000, activation='softmax'))
Ответ №1:
Нашел ответ. Я создавал слои в методе вызова. Вместо этого я должен создавать их внутри метода инициализации, а затем использовать их в методе вызова.