【问题标题】:Merging only some channels in keras using concatenate使用连接仅合并 keras 中的某些通道
【发布时间】:2019-04-25 22:31:29
【问题描述】:

我只想在 keras 中连接选定的频道,但是当我这样做时,它显示为错误。

我尝试获取感兴趣的通道并使用连接函数来合并两个输出。

def cifar10ClassifierTransfer(input_img, conv2_high):

  # Add additional inputs to 

  conv1_1 = (Conv2D(32, (3,3), padding='same', kernel_regularizer=regularizers.l2(weight_decay), input_shape=x_train.shape[1:], activation='elu'))(input_img)
  conv1_2 = BatchNormalization()(conv1_1)
  conv2_1 = (Conv2D(32, (3,3), padding='same', activation= 'elu',kernel_regularizer=regularizers.l2(weight_decay)))(conv1_2)
  conv2_high = conv2_high[:,:,:,[1,2,3]]
  concat_layer = keras.layers.merge.Concatenate(axis=3)([conv2_1,conv2_high])

  flat = Flatten()(concat_layer)
  out = Dense(num_classes, activation='softmax')(flat)

  return out 

我预计频道数量会增加。如果我没有指定要合并的频道,它可以正常工作,但是当我选择频道时,会出现以下错误

TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got [1, 2, 3]

我们如何选择要连接的频道而不是连接所有内容?

【问题讨论】:

    标签: python-3.x tensorflow keras


    【解决方案1】:

    您可以使用错误指示的切片。

    conv2_high可以改写为:

    conv2_high = conv2_high[:,:,:,1:4]
    

    您也可以使用tf.gather_nd,但上述方法在 IMO 上更具可读性。

    【讨论】:

    • 谢谢,如果我的频道不按顺序怎么办;如果我想做这样的事情 - conv2_high = conv2_high[:,:,:,[1,4,5,11,20]]
    • 使用gather_nd,它的作用类似于幻灯片,但不幸的是,它远非直观。我想您可以将 Python 的范围用于前三个维度(每个范围的大小都与该特定维度相同)并使用 [1,4,5,11,20] 作为最后一个维度。 Check here 用于直观解释。
    猜你喜欢
    • 2013-08-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2015-02-17
    • 2016-07-22
    相关资源
    最近更新 更多