【问题标题】:Keras CNN: Incompatible shapes [batch_size*2,1] vs. [batch_size,1] with any batch_size > 1Keras CNN:任何 batch_size > 1 的不兼容形状 [batch_size*2,1] 与 [batch_size,1]
【发布时间】:2020-08-24 13:51:44
【问题描述】:

我正在安装一个具有以下结构的连体 CNN:

def get_siamese_model(input_shape):

    """

        Model architecture

    """

    # Define the tensors for the three input images
    A_input = Input(input_shape)
    B_input = Input(input_shape)
    C_input = Input(input_shape)


    # Convolutional Neural Network
    #Initialzers
    initializer = 'random_uniform'
    initializer0 = 'zeros'

    model = Sequential()
    model.add(Conv2D(64, (10,10), activation='relu', input_shape=input_shape,
                     kernel_initializer=initializer , kernel_regularizer=l2(2e-4)))
    model.add(MaxPooling2D())
    model.add(Conv2D(128, (7,7), activation='relu', kernel_initializer=initializer ,
                    bias_initializer=initializer0, kernel_regularizer=l2(2e-4)))
    model.add(MaxPooling2D())
    model.add(Conv2D(128, (4,4), activation='relu', kernel_initializer=initializer ,
                    bias_initializer=initializer0, kernel_regularizer=l2(2e-4)))
    print("C3 shape: ", model.output_shape)
    model.add(MaxPooling2D())
    print("P3 shape: ", model.output_shape)
    model.add(Conv2D(256, (4,4), activation='relu', kernel_initializer=initializer ,
                      bias_initializer=initializer0, kernel_regularizer=l2(2e-4)))
    model.add(Flatten())
    model.add(Dense(4096, activation='sigmoid',
                    kernel_regularizer=l2(1e-3),
                    kernel_initializer=initializer,
                    bias_initializer=initializer0))        


    # Generate the encodings (feature vectors) for the three images
    encoded_A = model(A_input)
    encoded_B = model(B_input)
    encoded_C = model(C_input)


    #Custom Layer for L1-norm
    L1_layer = Lambda(lambda tensors: K.sum(K.abs(tensors[0] - tensors[1]), axis=1,keepdims=True))
    L_layerAB = L1_layer([encoded_A, encoded_B])

    L2_layer = Lambda(lambda tensors: K.sum(K.abs(tensors[0] - tensors[1]), axis=1,keepdims=True))
    L_layerAC = L2_layer([encoded_A, encoded_C])


    merge6 = concatenate([L_layerAB, L_layerAC], axis = 0)

    prediction = Dense(1,activation='sigmoid')(merge6)

    siamese_net = Model(inputs=[A_input,B_input, C_input],outputs= prediction)


    # return the model
    return siamese_net


训练数据是数组形式的三组图片,具有以下维度:(128,128,3)。 目标数据是一个标签(0,1)。

然后我们拟合模型:

model = siam.get_siamese_model((128,128,3))

model.fit([tripletA,tripletB, tripletC], targets , epochs=2,  verbose=1,
          batch_size  =  1)

这适用于 batch_size = 1,但任何超过 batchsize >1 的东西都会产生以下错误:

Epoch 1/5
Traceback (most recent call last):

  File "<ipython-input-147-8959bad9406a>", line 2, in <module>
    batch_size = 2)

  File "C:\Users\valan\Anaconda3\lib\site-packages\keras\engine\training.py", line 1239, in fit
    validation_freq=validation_freq)

  File "C:\Users\valan\Anaconda3\lib\site-packages\keras\engine\training_arrays.py", line 196, in fit_loop
    outs = fit_function(ins_batch)

  File "C:\Users\valan\Anaconda3\lib\site-packages\tensorflow_core\python\keras\backend.py", line 3727, in _call_
    outputs = self._graph_fn(*converted_inputs)

  File "C:\Users\valan\Anaconda3\lib\site-packages\tensorflow_core\python\eager\function.py", line 1551, in _call_
    return self._call_impl(args, kwargs)

  File "C:\Users\valan\Anaconda3\lib\site-packages\tensorflow_core\python\eager\function.py", line 1591, in _call_impl
    return self._call_flat(args, self.captured_inputs, cancellation_manager)

  File "C:\Users\valan\Anaconda3\lib\site-packages\tensorflow_core\python\eager\function.py", line 1692, in _call_flat
    ctx, args, cancellation_manager=cancellation_manager))

  File "C:\Users\valan\Anaconda3\lib\site-packages\tensorflow_core\python\eager\function.py", line 545, in call
    ctx=ctx)

  File "C:\Users\valan\Anaconda3\lib\site-packages\tensorflow_core\python\eager\execute.py", line 67, in quick_execute
    six.raise_from(core._status_to_exception(e.code, message), None)

  File "<string>", line 3, in raise_from

InvalidArgumentError:  Incompatible shapes: [4,1] vs. [2,1]
     [[node loss_16/dense_47_loss/binary_crossentropy/logistic_loss/mul (defined at C:\Users\valan\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_33258]

有人知道 batch_size > 1 的问题出在哪里吗?

EDIT1:

我们发现是以下几行导致了错误

    L1_layer = Lambda(lambda tensors: K.sum(K.abs(tensors[0] - tensors[1]), axis=1,keepdims=True))
    L_layerAB = L1_layer([encoded_A, encoded_B])

    L2_layer = Lambda(lambda tensors: K.sum(K.abs(tensors[0] - tensors[1]), axis=1,keepdims=True))
    L_layerAC = L2_layer([encoded_A, encoded_C])


删除这些行并仅在编码的 A 上使用 sigmoid,从而使模型更简单,使其适用于批量大小 >1 。

但是有人知道如何正确地重新添加这些自定义层吗?

【问题讨论】:

  • 尝试简单地改变这个 merge6 = Concatenate()([L_layerAB, L_layerAC])
  • 这使它起作用了……谢谢!不知道我们怎么看不到这么愚蠢的错误..

标签: python-3.x tensorflow image-processing keras conv-neural-network


【解决方案1】:

为了社区的利益,在此(答案)部分提及解决方案,即使它出现在评论部分。

上面的代码用batch_size &gt; 1会报错,

InvalidArgumentError:  Incompatible shapes: [4,1] vs. [2,1]
     [[node loss_16/dense_47_loss/binary_crossentropy/logistic_loss/mul (defined at C:\Users\valan\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_33258]

修改代码

merge6 = concatenate([L_layerAB, L_layerAC], axis = 0)

merge6 = Concatenate()([L_layerAB, L_layerAC])

已解决错误。

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 2020-08-25
    • 2021-09-04
    • 1970-01-01
    • 2018-07-01
    • 2019-08-29
    • 2019-10-24
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多