我遇到了一个自定义层的问题。我的基本例子是这样的:
fd = np.random.rand(100,6)
fl = np.random.randint(0,1,[100,])
def get_m():
I = Input(shape=(None, 6))
d1 = Dense(8, kernel_regularizer='l2', activation='tanh')(I)
d2 = Dense(8, kernel_regularizer='l2', activation='tanh')(d1)
d3 = Dense(8, kernel_regularizer='l2', activation='tanh')(d2)
d4 = Dense(2, kernel_regularizer='l2', activation='relu')(d3)
c = Concatenate()([d4, I])
# this line
hl = tf.keras.layers.Lambda(lambda x: tf.exp( -x[:, 4]/(1e-9 + x[:, 0]) - x[:, 5] / (1e-9 + x[:,1])))(c)
return Model(inputs=I, outputs=hl)
model = get_m()
model.compile(loss=tf.keras.losses.BinaryFocalCrossentropy(), optimizer=tf.keras.optimizers.Adam(), metrics=[tf.keras.metrics.AUC(), tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])
model.fit(x=fd, y=fl, epochs=250, validation_split=0.1, class_weight={0: 852, 1: 749})
如果我使用class_weight
,我在第一个epoch后得到一个“could not squeeze”错误:
Node: 'binary_focal_crossentropy/weighted_loss/Squeeze'
Can not squeeze dim[0], expected a dimension of 1, got 32
[[{{node binary_focal_crossentropy/weighted_loss/Squeeze}}]] [Op:__inference_train_function_682739]
但如果我不用它它就会训练另一方面,如果我将“this line”后面的行替换为
d5 = Dense(1, activation='sigmoid')(c)
return Model(inputs=I, outputs=d5)
它也是有效的。
我做错了什么,我可以用d4
和I
的非层转换来替换this line
处的行吗?
1条答案
按热度按时间r6l8ljro1#
尝试修改Lambda层以指定输出形状,下面是修改后的代码部分:
您应该能够在模型中使用Lambda层,同时成功应用类权重。