Как я могу объединить значения Dynami c с вектором сглаживания в CNN - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь повысить точность CNN, вычисляя некоторые динамические значения c, такие как моменты Ху изображений, во время фазы обучения, а затем подавать их на полностью связанный слой со сплющенным вектором, как показано на рисунке. моей модели:

image

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

Я использую эту модель (Tensorflow Keras):

layer1 = Conv2D(16, (3, 3),padding="same", activation='relu')(inpx) 
layer2 = Conv2D(32, kernel_size=(3, 3),padding="same", activation='relu')(layer1) 
layer3 = MaxPooling2D(pool_size=(2, 2))(layer2) 
layer4 = Conv2D(64, kernel_size=(5, 5),padding="same", activation='relu')(layer3)
layer5 = Conv2D(128, kernel_size=(5, 5),padding="same", activation='relu')(layer4)
layer6 = MaxPooling2D(pool_size=(2, 2))(layer5) 
layer7 = Dropout(0.5)(layer6) 
layer8 = Flatten()(layer7) 
layer9 = Dense(250, activation='sigmoid')(layer8) 
layer10 = Dense(10, activation='softmax')(layer9) 

model = Model([inpx], layer10) 



model.compile(optimizer=keras.optimizers.Adadelta(), 
              loss=keras.losses.categorical_crossentropy, 
              metrics=['accuracy']) 

model.fit(x_train, y_train, epochs=10, batch_size=500) 
score = model.evaluate(x_test, y_test, verbose=0) 

Набор данных, который я использую такое MNIST рукописные цифры.

1 Ответ

1 голос
/ 08 февраля 2020

Хм, я не знаю, что такое моменты Ху, Extend и Soidty, но я предполагаю, что они одномерные:

# image = tf.Tensor
@tf.function
def calc_hu(image):
   """ calculate hu """
   hu = ... 
   return hu

class HuLayer(tf.keras.layers.Layer):
    def call(self, inputs):
      return calc_hu(inputs)

@tf.function
def calc_extend(image):
   """ calculate extend """
   extend  =  ...
   return extend

class ExtendLayer(tf.keras.layers.Layer):
    def call(self, inputs):
      return calc_extend(inputs)


layer1 = Conv2D(16, (3, 3),padding="same", activation='relu')(inpx) 
layer2 = Conv2D(32, kernel_size=(3, 3),padding="same", activation='relu')(layer1) 
layer3 = MaxPooling2D(pool_size=(2, 2))(layer2) 
layer4 = Conv2D(64, kernel_size=(5, 5),padding="same", activation='relu')(layer3)
layer5 = Conv2D(128, kernel_size=(5, 5),padding="same", activation='relu')(layer4)
layer6 = MaxPooling2D(pool_size=(2, 2))(layer5) 
layer7 = Dropout(0.5)(layer6) 
layer8 = Flatten()(layer7) 
layer8_ = tf.layers.keras.concatenate([layer_8, HuLayer()(tf.keras.layers.Input(input_shape)(inpx)), ExtendLayer()(tf.keras.layers.Input(input_shape)(inpx))]) 
layer9 = Dense(250, activation='sigmoid')(layer8_) 
layer10 = Dense(10, activation='softmax')(layer9) 

Я не тестировал этот код, но он должен установить ты на своем пути. Надеюсь, это поможет вам в этом!

...