Keras多重输出预期形状和got形状

Keras多重输出预期形状和got形状,keras,deep-learning,Keras,Deep Learning,我尝试训练一个检测128d矢量的模型来识别人脸。模型的输入是一幅图像,输出是从人脸识别库得到的128d向量回归 当我将128个输出输入到训练时,我得到了以下错误: ValueError:检查目标时出错:预期稠密_24具有形状1,但获得了形状为128的数组 但当我只尝试一个输出时,fit函数就起作用了。 这个预测形状的奇怪部分是1128,但我不能给train提供128个输出 这是我的模型: from keras.applications.vgg16 import VGG16 from keras.

我尝试训练一个检测128d矢量的模型来识别人脸。模型的输入是一幅图像,输出是从人脸识别库得到的128d向量回归

当我将128个输出输入到训练时,我得到了以下错误:

ValueError:检查目标时出错:预期稠密_24具有形状1,但获得了形状为128的数组

但当我只尝试一个输出时,fit函数就起作用了。 这个预测形状的奇怪部分是1128,但我不能给train提供128个输出

这是我的模型:

from keras.applications.vgg16 import VGG16
from keras.layers import Flatten, Dense
import keras
def build_facereg_disc():
  # load model
  model = VGG16(include_top=False, input_shape=(64, 64, 3))
  # add new classifier layers
  flat1 = Flatten()(model.outputs)
  class1 = Dense(2048, activation='relu')(flat1)
  output = Dense(128, activation='relu')(class1)
  # define new model
  model = models.Model(inputs=model.inputs, outputs=output)
  # summarize
  return model

facereg_disc = build_facereg_disc()
facereg_disc.compile(optimizer=keras.optimizers.Adam(),  # Optimizer
              # Loss function to minimize
              loss=keras.losses.SparseCategoricalCrossentropy(),
              # List of metrics to monitor
              metrics=['binary_crossentropy'])
和摘要:

Model: "model_27"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_20 (InputLayer)        (None, 64, 64, 3)         0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 64, 64, 64)        1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 64, 64, 64)        36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 32, 32, 64)        0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 32, 32, 128)       73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 32, 32, 128)       147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 16, 16, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 16, 16, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 16, 16, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 16, 16, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 8, 8, 256)         0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 8, 8, 512)         1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 8, 8, 512)         2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 8, 8, 512)         2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 4, 4, 512)         0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 4, 4, 512)         2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 4, 4, 512)         2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 4, 4, 512)         2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 2, 2, 512)         0         
_________________________________________________________________
flatten_10 (Flatten)         (None, 2048)              0         
_________________________________________________________________
dense_23 (Dense)             (None, 2048)              4196352   
_________________________________________________________________
dense_24 (Dense)             (None, 128)               262272    
=================================================================
Total params: 19,173,312
Trainable params: 19,173,312
Non-trainable params: 0

以下是预处理:

dir_data      = "data_faces/img_align_celeba/"
Ntrain        = 2000 
Ntest         = 100
nm_imgs       = np.sort(os.listdir(dir_data))
## name of the jpg files for training set
nm_imgs_train = nm_imgs[:Ntrain]
## name of the jpg files for the testing data
nm_imgs_test  = nm_imgs[Ntrain:Ntrain + Ntest]
img_shape     = (64, 64, 3)

def get_npdata(nm_imgs_train):
    X_train = []
    for i, myid in enumerate(nm_imgs_train):
        image = load_img(dir_data + "/" + myid,
                         target_size=img_shape[:2])
        image = img_to_array(image)/255.0
        X_train.append(image)
    X_train = np.array(X_train)
    return(X_train)

X_train = get_npdata(nm_imgs_train)
我使用的批量大小如下:

idx = np.random.randint(0, X_train.shape[0], half_batch)
            imgs = X_train[idx]

            labels = y_train[idx]

            reg_d_loss_real = facereg_disc.train_on_batch(imgs, labels)

你的问题来自你的损失函数。如中所述,SparseCategoricalCrossentropy期望y_true中的每个样本都是对类进行编码的整数,而Category CrossEntropy则期望一个热编码的表示,这就是您的情况

所以,切换到CategoricalCrossentropy,您应该会很好

然而,为了复制,我不得不改变:

flat1=FlattModel.outputs 致:

flat1=FlattModel.outputs[0]
您得到的错误告诉您,数据集的输出维度为1,而不是您预期的128。你能给confim显示一个输出数据的样本吗?你能显示实际输出的形状和标签的形状吗?我尝试使用prediction=facereg_disc.predictnp.array[X_train[0]]printprediction.shape和shape是1128@thomaschillaci@pntehana你的输入样本的形状是1,64,64,3吗?是的,我也能适应facereg_disc.fitX train[0].1,64,64,3,[1]但它必须是128输出,而不仅仅是1@谢谢你的回答。但我的Yu_真的不是一个热编码。它是介于-1和1之间的浮点数。没有问题吗?是的,有问题,使用分类损失期望您的输出代表类别,您的输出代表什么?我的输出是128浮点,介于-1和1之间。例:0.32。因此,这是一个多输出回归问题。我能做什么损失函数?看起来不错。我以前尝试过均方误差,但model.outputs[0]解决了这个问题。
idx = np.random.randint(0, X_train.shape[0], half_batch)
            imgs = X_train[idx]

            labels = y_train[idx]

            reg_d_loss_real = facereg_disc.train_on_batch(imgs, labels)