簡體   English   中英

ValueError:檢查目標時出錯:預期 activation_6 具有形狀(70,)但得到形狀為(71,)的數組

[英]ValueError: Error when checking target: expected activation_6 to have shape (70,) but got array with shape (71,)

我正在使用 CNN 創建人臉識別。 我正在學習教程。 我正在使用 Tensorflow==1.15。

該程序將拍攝 70 張用戶面部快照並將它們保存在“數據集”文件夾中

我不斷收到錯誤:

ValueError:檢查目標時出錯:預期 activation_6 具有形狀(70,)但得到形狀為(71,)的數組

輸入形狀 - (32,32,1)

類(n_classes) - 70


K.clear_session()
n_faces = len(set(ids))

model = model((32,32,1),n_faces) #Calling Model given in next code block
faces = np.asarray(faces)
faces = np.array([downsample_image(ab) for ab in faces])
ids = np.asarray(ids)
faces = faces[:,:,:,np.newaxis]
print("Shape of Data: " + str(faces.shape))
print("Number of unique faces : " + str(n_faces))


ids = to_categorical(ids)

faces = faces.astype('float32')
faces /= 255.


x_train, x_test, y_train, y_test = train_test_split(faces,ids, test_size = 0.2, random_state = 0)

print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

checkpoint = callbacks.ModelCheckpoint('trained_model.h5', monitor='val_acc',
                                           save_best_only=True, save_weights_only=True, verbose=1)
                                    
model.fit(x_train, y_train,
             batch_size=32,
             epochs=10,
             validation_data=(x_test, y_test),
             shuffle=True,callbacks=[checkpoint])


def model(input_shape,num_classes):    

    model = Sequential()

    model.add(Conv2D(32, (3, 3), input_shape=input_shape))
    model.add(Activation("relu"))

    model.add(Conv2D(64, (3, 3)))
    model.add(BatchNormalization())
    model.add(Activation("relu"))

    model.add(Conv2D(64, (1, 1)))
    model.add(Dropout(0.5))
    model.add(BatchNormalization())
    model.add(Activation("relu"))

    model.add(Conv2D(128, (3, 3)))
    model.add(Dropout(0.5))
    model.add(Activation("relu"))

    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Conv2D(64, (1, 1)))
    model.add(Activation("relu"))

    model.add(Flatten())
    model.add(Dense(32))
    model.add(Dense(num_classes))
    model.add(Activation("softmax"))
    
    model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

    model.summary()
    return model

Output







Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 30, 30, 32)        320       
_________________________________________________________________
activation_1 (Activation)    (None, 30, 30, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 28, 28, 64)        18496     
_________________________________________________________________
batch_normalization_1 (Batch (None, 28, 28, 64)        256       
_________________________________________________________________
activation_2 (Activation)    (None, 28, 28, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 28, 28, 64)        4160      
_________________________________________________________________
dropout_1 (Dropout)          (None, 28, 28, 64)        0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 28, 28, 64)        256       
_________________________________________________________________
activation_3 (Activation)    (None, 28, 28, 64)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 26, 26, 128)       73856     
_________________________________________________________________
dropout_2 (Dropout)          (None, 26, 26, 128)       0         
_________________________________________________________________
activation_4 (Activation)    (None, 26, 26, 128)       0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 13, 13, 128)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 13, 13, 64)        8256      
_________________________________________________________________
activation_5 (Activation)    (None, 13, 13, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 10816)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 32)                346144    
_________________________________________________________________
dense_2 (Dense)              (None, 70)                2310      
_________________________________________________________________
activation_6 (Activation)    (None, 70)                0         
=================================================================
Total params: 454,054
Trainable params: 453,798
Non-trainable params: 256
_________________________________________________________________
Shape of Data: (70, 32, 32, 1)
Number of unique faces : 70

我正在計算 x_train、x_test、y_train、y_test,如下所示

x_train, x_test, y_train, y_test = train_test_split(faces,ids, test_size = 0.2, random_state = 0)

Output

x_train - (56, 32, 32, 1)

y_train - (56, 71)

x_test - (14, 32, 32, 1)

y_test - (14, 71)

我在 CNN 層的尺寸上做錯了什么? 請幫忙

在您的 model.summary() output 中,您會看到最終的密集層具有形狀(無,70)。 None 代表您的批量大小,目前未知。 然后 70 是每個圖像的 output 的維度。

從您的 y_train 和 y_pred 來看,您似乎想要 output 71 個類,而不是 70 個,因此尺寸不匹配。 您可以嘗試將最后一個密集層更改為

model.add(Dense(num_classes+1))

這應該有效。 我不知道為什么您的 y 值的長度與您的班級數量不同。 一個原因可能是,有一個 class 表示“無”,因此應該在其他 class 中選擇的 class 是正確的。 這可以解釋為什么如果你有 70 個類,你需要一個 71 維的 output。

我懷疑ids的形狀 (row, col) 為(70,71) - 其中 70 是實例數,71 是 class 的 softmax 向量。(我通過添加 x_train.shape[0]=56 得到了這個和 x_test.shape[0]=14)

在這一行n_faces = len(set(ids))中, set方法正在檢查唯一列表(每個類的 softmax 向量),然后len方法為您提供實例數,即 70。

train_test_split中, y參數是整個ids ,因此它沿行(70 個實例)拆分,同時保留每個實例的 softmax 向量(71 維向量)。

這可以解釋為什么你的 model 有 70 個維度 output 而你實際上需要 71 個維度 output。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM