【问题标题】:Incompatible shapes: [217,1] vs. [480,1]不兼容的形状:[217,1] vs. [480,1]
【发布时间】:2021-03-21 13:30:15
【问题描述】:

我正在开发一个具有 CNN、LSTM 和注意力层的图像分类模型。当我运行model.fit() 时,它向我显示Incompatible shapes: [217,1] vs. [480,1] 的错误

这是我的模型

def ReshapeLayer(x):
    
    shape = x.shape
    reshape = Reshape((shape[1],shape[2]*shape[3]))(x) 
    return reshape

model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(16, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Lambda(ReshapeLayer))
model.add(LSTM(16, return_sequences=True))
model.add(Flatten())
model.add(attention(return_sequences=True))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.6))
model.add(Dense(units=2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=optimizers.Adam(lr=1e-5, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False), metrics=['accuracy'])
model.summary()

这是模型摘要

Model: "sequential_105"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_941 (Conv2D)          (None, 126, 126, 16)      448       
_________________________________________________________________
max_pooling2d_72 (MaxPooling (None, 63, 63, 16)        0         
_________________________________________________________________
conv2d_942 (Conv2D)          (None, 61, 61, 16)        2320      
_________________________________________________________________
max_pooling2d_73 (MaxPooling (None, 30, 30, 16)        0         
_________________________________________________________________
lambda_9 (Lambda)            (None, 30, 480)           0         
_________________________________________________________________
lstm_47 (LSTM)               (None, 30, 16)            31808     
_________________________________________________________________
flatten_25 (Flatten)         (None, 480)               0         
_________________________________________________________________
attention_31 (attention)     (480, 480)                960       
_________________________________________________________________
batch_normalization_837 (Bat (480, 480)                1920      
_________________________________________________________________
activation_837 (Activation)  (480, 480)                0         
_________________________________________________________________
dropout_28 (Dropout)         (480, 480)                0         
_________________________________________________________________
dense_62 (Dense)             (480, 2)                  962       
=================================================================
Total params: 38,418
Trainable params: 37,458
Non-trainable params: 960
_________________________________________________________________

这里是model.fit()

early_stopping = EarlyStopping(monitor='val_loss', min_delta=0.0001, patience=2, mode='auto')
EPOCHS = 20
BATCH_SIZE = 480
history = model.fit(X_train, Y_train, batch_size=BATCH_SIZE, epochs = EPOCHS, validation_data = (X_val, Y_val))

这是我遇到的错误

Epoch 1/20
7/8 [=========================>....] - ETA: 0s - loss: 0.9753 - accuracy: 0.5111
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-210-24f78483866b> in <module>()
      2 EPOCHS = 20
      3 BATCH_SIZE = 480
----> 4 history = model.fit(X_train, Y_train, batch_size = BATCH_SIZE, epochs = EPOCHS, validation_data = (X_val, Y_val))

6 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     58     ctx.ensure_initialized()
     59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:
     62     if name is not None:

InvalidArgumentError:  Incompatible shapes: [217,1] vs. [480,1]
     [[node sequential_105/attention_31/add (defined at <ipython-input-199-3f2eae608e7b>:18) ]] [Op:__inference_train_function_140276]

Function call stack:
train_function

训练正在运行一些迭代,然后在上述错误处停止。

【问题讨论】:

  • 包括X_trainX_val 的形状。验证期间抛出的错误表明X_val 是问题所在。

标签: python python-3.x tensorflow keras


【解决方案1】:

您的输出是2D,而Attention/LSTM 产生3D。需要去掉Flatten(),在Attention层设置return_sequences=False

关注来自here

def ReshapeLayer(x):
    
    shape = x.shape
    reshape = Reshape((shape[1],shape[2]*shape[3]))(x) 
    return reshape

model = Sequential()
model.add(Conv2D(16, kernel_size=(3,3), activation='relu', input_shape=(128, 128, 3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(16, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Lambda(ReshapeLayer))
model.add(LSTM(16, return_sequences=True))
model.add(Attention(return_sequences=False))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.6))
model.add(Dense(units=2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2022-01-03
    • 2018-01-10
    相关资源
    最近更新 更多