【问题标题】:How can I concatenate dynamic values with the flatten vector in CNN如何将动态值与 CNN 中的 flatten 向量连接起来
【发布时间】:2020-02-09 18:53:57
【问题描述】:

我正在尝试通过在训练阶段计算一些动态值(例如图像的 Hu 矩)来提高 CNN 的准确性,然后将它们提供给具有展平向量的全连接层,如我的模型图像所示:

我想为数据集中的每个图像计算 Hu 矩,然后在 flatten 操作之后,我想将 Hu 矩的值与 fatten 向量连接起来,并将其提供给全连接层。

这是我正在使用的模型(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 手写数字。

【问题讨论】:

  • 你有什么问题?
  • 你为什么使用全连接层而不是 CNN?
  • 我的问题是如何将每个图像的动态值(如 Hu 矩)输入到扁平向量旁边的全连接层

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

嗯,我不知道 Hu 矩、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) 

我没有测试此代码,但它应该可以帮助您。希望它对您有所帮助!

【讨论】:

猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2011-01-28
  • 2018-10-19
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多