Keras ValueError:检查目标时出错:预期density_1具有3维

时间:2019-09-25 20:25:05

标签: python tensorflow keras

我正在使用带有tensorflow后端的keras,并且在为模型确定正确的图层形状时遇到了问题。

我已经阅读了this 关于各种keras图层属性差异的有用解释。

这是我模型的架构:

enter image description here

我正在尝试使用分类标签进行二进制分类(逻辑回归),因此最后一层是具有1个单位的密集层,我认为对正类的评估为1,对负类的评估为0。 >

这是我模型的摘要:

enter image description here

我在网的一侧输入10158,在另一侧输入20316。我总共有1370个样本。我的train_data的形状为(1370,1,10158),标签的形状为(1,1370),批量为100。

input_layer = Input(shape=(1,no_terms), name='docs')
s = Lambda(lambda x: x+1)(input_layer)
log_layer = Lambda(log, name='tf_output')(input_layer)

tpr_fpr = np.zeros((2, no_terms))
tpr_fpr[0,:] = np.sum(train_docs[np.where(train_label>0), :]>0, axis=1
                      )/np.sum(train_label>0) * (1000)
tpr_fpr[1,:] = np.sum(train_docs[np.where(train_label>0), :]>0, axis=1
                     )/np.sum(train_label <= 0) * (1000)

k_constants = backend.constant(np.reshape(tpr_fpr.T, (1,2*no_terms)))
fixed_input = Input(tensor=k_constants, shape=(1, 2*no_terms), name='tpr_fpr')
h = Dense(int(300), activation='relu', name='hidden', input_shape=(1, 2*no_terms), 
          trainable=True)(fixed_input)
h = Dropout(0.2, name="D")(h)
cd = Dense(units=no_terms, activation='relu', name='cd', trainable=True)(h)


prod = Multiply()([log_layer, cd])
o = Lambda(lambda x:(x/backend.sqrt(backend.sum(x * x,axis=1,keepdims=True))))(prod)
o = ReLU(max_value=None, negative_slope=0.0, threshold=0.0)(o)
o = Dense(1, activation='sigmoid', input_shape=(no_terms,))(o)


model_const = Model(fixed_input,cd)
model = Model([input_layer, fixed_input], o)

op = optimizers.RMSprop(learning_rate=.1, rho=0.9)
model.compile(optimizer=op, loss=mean_squared_error, metrics=['accuracy'])
plot_model(model, to_file='model.png')
model.summary()
batchSize = 100

checkpoint = ModelCheckpoint(filepath="a.hdf5",monitor='val_acc', mode='max', 
                             save_best_only=True)
earlystop=EarlyStopping(monitor='val_loss', patience=20)

train_docs.shape = (train_docs.shape[0], 1, train_docs.shape[1])
train_label = to_categorical(train_label, num_classes=2, dtype='float32')
model.fit(train_docs, train_label, epochs=10, batch_size=batchSize, 
          validation_data=(test_docs, test_label), 
          callbacks=[earlystop, checkpoint], verbose=1)

这是我得到的错误: “ ValueError:检查目标时出错:预期density_1具有3个维,但数组的形状为(1430,2)”

我不知道(1430,2)形状是什么意思,为什么会出现此错误。

3 个答案:

答案 0 :(得分:1)

您确实确实直接解决了问题-方法如下:

  • Keras二进制分类期望标签(“目标”)的形状为(batch_size, 1)。原因:最后一层的目标是输出预测,将其与标签进行比较以计算指标(损失,准确性等)-标签的形状为{{ 1}}
  • 以上也是(batch_size, 1)出现问题的原因-请参见下面docs的摘录;对于二进制分类,一次性编码是多余的,因为to_categorical直接将标签与所提供的预测进行比较
  • Keras binary_crossentropy期望输入为2D:Dense。您的重塑是使输入3D:(batch_size, input_dim)
  • 以上也是(batch_size, 1, input_dim)-> shape=(1, no_terms)帮助的原因;实际上,这两者对于您当时正在提供的数据形状都是正确的。完整的批次形状仅包含批次暗淡:shape=(no_terms,)(batch_size, no_terms)
  • 最后,对于二进制分类,请使用no_terms == input_dim-绝不要在分类问题上表示平方误差(除非出于非常特殊的原因)
loss='binary_crossentropy'

答案 1 :(得分:0)

好吧,我找到了解决该错误的方法,但仍然不明白为什么以前的形状无法解决,坦率地说,此修复在众多的尝试和错误中都是成功的。

我将以下图层输入从形状格式(1,x)更改为(x,)格式:

    input_layer = Input(shape=(no_terms,), name='docs')

    k_constants = backend.constant(np.reshape(tpr_fpr.T, (1,2*no_terms)))
    fixed_input = Input(tensor=k_constants, shape=(2*no_terms,), name='tpr_fpr')
    h = Dense(int(300), activation='relu', name='hidden', input_shape=(2*no_terms,), trainable=True)(fixed_input)

    o = ReLU(max_value=None, negative_slope=0.0, threshold=0.0)(o)
    o = Dense(1, activation='sigmoid', input_shape=(no_terms,))(o)

,还从代码中删除了以下几行:

    train_docs.shape = (train_docs.shape[0], 1, train_docs.shape[1])
    train_label = to_categorical(train_label, num_classes=2, dtype='float32')

现在,我仅使用形状标签(#no_of_samples,1),该标签是二进制标签,而不是类别标签。

因此,新结构为: enter image description here

我希望有人能解释以前的模型有什么问题,所以我避免再次犯同样的错误。

谢谢。

答案 2 :(得分:0)

检查目标:预期density_1具有3维,但数组的形状为(1430,2)”

这意味着density_1具有3维,但是如果您在图像处理中设计此模型,则输入只有2维,在这种情况下,您已声明图像形状为((48,48),1)&((48,48 ),3)这里1是灰度,3是rgb图像