【发布时间】:2019-09-26 22:29:15
【问题描述】:
我正在使用带有 tensorflow 后端的 keras,并且在为我的模型确定图层的正确形状时遇到了问题。
我已经阅读了this 关于各种keras层属性差异的有用解释。
这是我的模型的架构:
我正在尝试使用分类标签进行二元分类(逻辑回归),因此最后一层是具有 1 个单元的 Dense 层,我假设它的正类评估为 1,负类评估为 0。
这是我的模型的总结:
我在网络一侧的输入是 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:检查目标时出错:预期dense_1有3维,但得到的数组形状为(1430, 2)”
我不知道 (1430, 2) 形状指的是什么以及为什么会出现此错误。
【问题讨论】:
-
你的 lambda 层可能有问题。
-
但得到的数组形状...是输入的数据,而不是模型的形状 - 对我来说,您的数据似乎有误
-
为了更好地提供帮助,您的模型和数据的代码将比图像(您可以完全删除)提供更多帮助。
-
@OverLordGoldDragon 我已经添加了之前的代码(有问题的那个)和解决方案代码,此时我不确定这是一个真正的修复还是只是避免错误。如果您查看这些代码并向我解释为什么以前的结构不起作用,我将不胜感激。谢谢。
-
@TheGuywithTheHat lambda 层很好。问题出在形状上。
标签: python tensorflow keras