首页 > 解决方案 > 如何使用 keras 功能 API 进行预测?

问题描述

我正在尝试使用带有 lstm 和 conv1 的功能 API 来训练模型,并且我正在成型,请帮助我解决问题。

keras.backend.clear_session()

input1_model3 = Input(shape=(pad_essay.shape[1],),name="essay_input_model3")
embedding_layer_text = Embedding(vocab_size_text,300, weights=[embedding_matrix],input_length=max_length_text,trainable=False)(input1_model3)
lstm1 = LSTM(300,activation='relu',return_sequences=True,kernel_constraint=keras.initializers.he_normal(seed=0))(embedding_layer_text)
flatten1 = Flatten()(lstm1)

input2 = Input(shape=(concatenated_data_train.shape[1], 1),name = "concatenated_data")
dense1 = Dense(64,activation='relu',kernel_initializer=keras.initializers.he_normal(seed=0))(input2)
conv_1d_1 = Conv1D(filters=16,kernel_size = 3,padding='same',activation='relu',kernel_initializer=keras.initializers.he_normal(seed=0))(dense1)
conv_1d_n = Conv1D(filters = 14,kernel_size =  3,padding='same',activation='relu',kernel_initializer=keras.initializers.he_normal(seed=0))(conv_1d_1)
flatten2 = Flatten()(conv_1d_n)

concatenated_layer = concatenate(inputs=[flatten1,flatten2],name='concatenated')

dense_layer1_after_concat = Dense(128,activation='relu', kernel_initializer=keras.initializers.he_normal(seed=0))(concatenated_layer)
drop_out1_after_concat = Dropout(0.3)(dense_layer1_after_concat)
dense_layer2_after_concat = Dense(128,activation='relu', kernel_initializer=keras.initializers.he_normal(seed=0))(drop_out1_after_concat)
drop_out2_after_concat = Dropout(0.3)(dense_layer2_after_concat)
dense_layer3_after_concat = Dense(128,activation='relu', kernel_initializer=keras.initializers.he_normal(seed=0))(drop_out2_after_concat)

output_layer = Dense(units= 1,activation='sigmoid',kernel_initializer=keras.initializers.glorot_uniform(seed=0),name="output")(dense_layer3_after_concat)

third_model = Model(inputs = [input1_model3,input2],outputs=output_layer)

下面的代码来获得 AUC 分数。从 sklearn.metrics 导入 tensorflow 作为 tf 导入 roc_auc_score

def auroc(y_true, y_pred):
    return tf.py_function(roc_auc_score, (y_true, y_pred), tf.double)

# Build Model...

third_model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy', auroc])
Concatenation few columns for my second input
concatenated_data_train1 = concatenated_data_train.reshape(concatenated_data_train.shape[0],concatenated_data_train.shape[1],1)
concatenated_data_test1 = concatenated_data_test.reshape(concatenated_data_test.shape[0],concatenated_data_test.shape[1],1)

正如你在上面看到的,我得到了 3-dim 输入,但从 conv1d 层得到了 2-dim,因此将它们转换为 3 维

third_model.fit([pad_essay,concatenated_data_train1],y_train,validation_data=([pad_essay_test,concatenated_data_test1],y_test),epochs=10,batch_size=64)

我收到以下错误

TypeError: len is not well defined for symbolic Tensors. (sub_16:0) Please call `x.shape` rather than `len(x)` for shape information.

请帮助我如何解决这个问题,谢谢。

标签: pythonkerasdeep-learningconv-neural-networktensor

解决方案


推荐阅读