为什么我的神经网络验证精度比我的训练精度高,并且两者都变得恒定? - python

我已经建立了一个模型,当我训练它时,我的验证损失小于训练中的一个,验证准确性也比训练中的高。模型是否过拟合?难道我做错了什么?有人可以看看我的模型,看看有什么问题吗?谢谢。

input_text = Input(shape=(200,), dtype='int32', name='input_text')
meta_input = Input(shape=(2,), name='meta_input')
embedding = Embedding(input_dim=len(tokenizer.word_index) + 1, 
                  output_dim=300, 
                  input_length=200)(input_text)

lstm = Bidirectional(LSTM(units=128, 
                      dropout=0.5, 
                      recurrent_dropout=0.5, 
                      return_sequences=True),
                 merge_mode='concat')(embedding)
pool = GlobalMaxPooling1D()(lstm)
dropout = Dropout(0.5)(pool)
text_output = Dense(n_codes, activation='sigmoid', name='aux_output')(dropout)

output = concatenate([text_output, meta_input])
output = Dense(n_codes, activation='relu')(output)

main_output = Dense(n_codes, activation='softmax', name='main_output')(output)

model = Model(inputs=[input_text,meta_input], outputs=[output])
optimer = Adam(lr=.001)
model.compile(optimizer='adam', 
          loss='binary_crossentropy', 
          metrics=['accuracy'])

model.summary()
model.fit([X1_train, X2_train], [y_train],
      validation_data=([X1_valid,X2_valid], [y_valid]),
      batch_size=64, epochs=20, verbose=1)

这是输出:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_text (InputLayer)         [(None, 200)]        0                                            
__________________________________________________________________________________________________
embedding (Embedding)           (None, 200, 300)     889500      input_text[0][0]                 
__________________________________________________________________________________________________
bidirectional (Bidirectional)   (None, 200, 256)     439296      embedding[0][0]                  
__________________________________________________________________________________________________
global_max_pooling1d (GlobalMax (None, 256)          0           bidirectional[0][0]              
__________________________________________________________________________________________________
dropout (Dropout)               (None, 256)          0           global_max_pooling1d[0][0]       
__________________________________________________________________________________________________
aux_output (Dense)              (None, 545)          140065      dropout[0][0]                    
__________________________________________________________________________________________________
meta_input (InputLayer)         [(None, 2)]          0                                            
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 547)          0           aux_output[0][0]                 
                                                             meta_input[0][0]                 
__________________________________________________________________________________________________
dense (Dense)                   (None, 545)          298660      concatenate[0][0]                
==================================================================================================
Total params: 1,767,521
Trainable params: 1,767,521
Non-trainable params: 0
__________________________________________________________________________________________________
Train on 11416 samples, validate on 2035 samples
Epoch 1/20
11416/11416 [==============================] - 158s 14ms/sample - loss: 0.0955 - accuracy: 0.9929 - 
val_loss: 0.0559 - val_accuracy: 0.9964
Epoch 2/20
11416/11416 [==============================] - 152s 13ms/sample - loss: 0.0562 - accuracy: 0.9963 - 
val_loss: 0.0559 - val_accuracy: 0.9964
Epoch 3/20
11416/11416 [==============================] - 209s 18ms/sample - loss: 0.0562 - accuracy: 0.9963 - 
val_loss: 0.0559 - val_accuracy: 0.9964
Epoch 4/20
11416/11416 [==============================] - 178s 16ms/sample - loss: 0.0562 - accuracy: 0.9963 - 
val_loss: 0.0559 - val_accuracy: 0.9964
Epoch 5/20
11416/11416 [==============================] - 211s 18ms/sample - loss: 0.0562 - accuracy: 0.9963 - 
val_loss: 0.0559 - val_accuracy: 0.9964
Epoch 6/20

参考方案

acc高于val_accloss低于val_loss时,将过度拟合。

但是,我发现您的验证数据集不能代表数据集中的总体分布。无论出于何种原因,验证数据集的结果都是恒定的,甚至是更高的。

您正在执行二进制分类。注意班级不平衡!

例如。如果您的样本中有99%是0类,而1%是1类,
这样,即使您的模型什么也不学,只要始终预测0而不曾预测1,它将具有99%的准确性。
想象一下,您(大多数情况下是随机的)数据拆分创建了一个数据集,其中99.5%的验证数据将是0类和0.5%1类。
想象一下在最坏的情况下您的模型什么都不学。并且吐出(“预测”)始终是0。然后train acc会一直0.99并有一定损失。并且val_acc将一直为0.995

对我来说,令人困惑的是您的绩效指标是不变的。那总是很糟糕。因为通常情况下,如果模型学习到sth且即使模型过拟合,也总是会出现随机噪声。

没有书告诉您以下内容-没有新手书籍。我从经验中学到了这一点:您必须在shuffle=True中放入model.fit()
因为对我来说,您似乎正在以某种方式训练,即首先仅展示一个类别的样本,然后展示另一个类别的样本。将一类和另一类的样本混合在一起会很好地干扰模型,并避免模型陷入某些局部最小值。

有时,甚至在改组时,我也能得到如此恒定的结果。

在这种情况下,我只是尝试选择另一个随机拆分,这样效果更好。 (因此:尝试其他拆分!)

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

如何用'-'解析字符串到节点js本地脚本? - python

我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…