问题描述
对于相同的文本分类,我建立了两个网络。它们应该相同,但是使用不同的工具。 他们得到相同的输入(使用Doc2Vec构建的大小为300的向量)。它们都具有3个隐藏层,每个隐藏层包含100个神经元,其激活和sgd有所不同。
-MLP方法给我的准确度约为71%
-Keras模型是随机分类器!
编辑:此外(非常重要!),keras模型似乎与最初的模型并不相同 在每种情况下,我总是得到与第一个相同的精度和相同的损失。 损失值非常非常低!损失:5.9577e-08
有人可以告诉我我怎么了吗?
MLP代码:
MLP2=MLPClassifier(activation='logistic',alpha=0.0005,batch_size='auto',hidden_layer_sizes=(100,100,100),learning_rate='adaptive',max_iter=600,solver='adam').fit(train_x,train_y)
MLPscore2 = MLP2.score(test_x,test_y)
Keras的代码:
keras.backend.clear_session()
inputs = Input(shape=(300))
x = Dense(100,activation='relu')(inputs) #100 hidden units with tanh activation
x = Dense(100,activation='tanh')(x)
x = Dense(100,activation='relu')(x)
outputs = Dense(1,activation='sigmoid')(x) #output layer with sigmoid activation
model = Model(inputs=inputs,outputs=outputs,name='Vector_text')
model.summary()
eta = 0.3
decay_rate = 0.005
model.compile(
loss='categorical_crossentropy',optimizer=keras.optimizers.SGD(learning_rate=eta,momentum=0.0,decay=decay_rate),metrics=['accuracy']
)
epochs = 10
batch_size = 65
X_train,X_valid,y_train,y_valid = model_selection.train_test_split(train_x,train_y,test_size = 1000,random_state = SEED)
history = model.fit(
X_train,epochs=epochs,batch_size=batch_size,validation_data=(X_valid,y_valid),verbose=1,#default - show progress bar
shuffle = True
)
#evaluate model on the test set
test_loss,test_acc = model.evaluate(test_x,test_y)
解决方法
在没有其他上下文的情况下,我只能提出一些可能的罪魁祸首:
-
x = Dense(100,activation='tanh')(x)
“ tanh”激活功能只能输出-1和+1范围内的数字。为此,请尝试'relu'
或什至更好的'elu'
或'selu'
。
使用 -
epochs
与keras.models.Model
的{{1}}相同。 Keras模型只有10个,而solver=adam
有600个。 -
学习率可能太高。对于没有批量归一化的模型,
MLPCLassifier
很少见。尝试减少它。 -
eta=0.3
,但batch_size=65
的批量大小为200。
max_iter
时,MLPClassifier
的使用批处理规范化,除非您有明确的理由不这样做。这样可以加快融合速度,并且您可能获得比其他更高的学习率。