keras Lambda层与图中的索引干扰-如何修复?

xvw2m8pv  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(96)

我遇到了一个自定义层的问题。我的基本例子是这样的:

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)

它也是有效的。
我做错了什么,我可以用d4I的非层转换来替换this line处的行吗?

r6l8ljro

r6l8ljro1#

尝试修改Lambda层以指定输出形状,下面是修改后的代码部分:

hl = tf.keras.layers.Lambda(lambda x: tf.exp(-x[:, 4] / (1e-9 + x[:, 0]) - x[:, 5] / (1e-9 + x[:, 1]), shape=(1,)))(c)

您应该能够在模型中使用Lambda层,同时成功应用类权重。

相关问题