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