训练准确性增加,然后偶尔突然下降。使固定? [Keras] [TensorFlow 后端]
Posted
技术标签:
【中文标题】训练准确性增加,然后偶尔突然下降。使固定? [Keras] [TensorFlow 后端]【英文标题】:Training Accuracy increases, then drops sporadically and abruptly. Fix? [Keras] [TensorFlow backend] 【发布时间】:2020-02-16 02:51:30 【问题描述】:我正在做二进制分类。
因此,在训练我的模型时,训练精度正在提高,但在某些时期它会突然下降。下面是一张图片来说明。我究竟做错了什么?为什么会这样?解释是什么?我该如何解决这个问题?
此外,训练准确度和验证准确度(尤其是验证准确度)在大多数情况下都接近 1 (100%),在 epoch 周期的早期。为什么?这是好事还是坏事?我觉得不对吧?
这是数据:https://drive.google.com/open?id=1--1OoFHdOjb2ARyJ2dD80Zw4RkvCY0lK
“Gewicht”是输出,我在下面的代码中将其转换为 1 和 0。
以下代码是我尝试过的:
这是代码:
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 18 15:44:44 2019
@author: Shahbaz Shah Syed
"""
#Import the required Libraries
from sklearn.metrics import confusion_matrix, precision_score
from sklearn.model_selection import train_test_split
from keras.layers import Dense,Dropout
from keras.models import Sequential
from keras.regularizers import l2
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
##EXTRACT THE DATA AND SPLITTING IN TRAINING AND TESTING-----------------------
Input = 'DATA_Gewicht.xlsx'
Tabelle = pd.read_excel(Input,names=['Plastzeit Z [s]','Massepolster [mm]',
'Zylind. Z11 [°C]','Entformen[s]',
'Nachdr Zeit [s]','APC+ Vol. [cm³]',
'Energie HptAntr [Wh]','Fläche WkzDr1 [bar*s]',
'Fläche Massedr [bar*s]',
'Fläche Spritzweg [mm*s]', 'Gewicht'])
Gewicht = Tabelle['Gewicht']
#Toleranz festlegen
toleranz = 0.5
#guter Bereich für Gewicht
Gewicht_mittel = Gewicht.mean()
Gewicht_abw = Gewicht.std()
Gewicht_tol = Gewicht_abw*toleranz
Gewicht_OG = Gewicht_mittel+Gewicht_tol
Gewicht_UG = Gewicht_mittel-Gewicht_tol
#Gewicht Werte in Gut und Schlecht zuordnen
G = []
for element in Gewicht:
if element > Gewicht_OG or element < Gewicht_UG:
G.append(0)
else:
G.append(1)
G = pd.DataFrame(G)
G=G.rename(columns=0:'Gewicht_Value')
Gewicht = pd.concat([Gewicht, G], axis=1)
#extracting columns from sheets
Gewicht_Value = Gewicht['Gewicht_Value']
x = Tabelle.drop(columns=['Gewicht'])
y = Gewicht_Value
#Split the train and test/validation set
x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.10, random_state=0)
x_train.shape,y_train.shape,x_test.shape,y_test.shape
##Creating a Neural Network----------------------------------------------------
#define and use a Sequential model
model = Sequential() #Sequential model is a linear stack of layers
#Hidden Layer-1/Input Layer
model.add(Dense(200,activation='relu',input_dim=10,kernel_regularizer=l2(0.01))) #adding a layer
model.add(Dropout(0.3, noise_shape=None, seed=None))
#Hidden Layer-2
model.add(Dense(200,activation = 'relu',kernel_regularizer=l2(0.01)))
model.add(Dropout(0.3, noise_shape=None, seed=None))
#Output layer
model.add(Dense(1,activation='sigmoid'))
#Compile the Model
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
#Check the Model summary
model.summary()
##TRAINING the Neural Network--------------------------------------------------
#Train the Model
model_output = model.fit(x_train,y_train,epochs=500,batch_size=20,verbose=1,validation_data=(x_test,y_test),)
print('Training Accuracy : ' , np.mean(model_output.history['accuracy']))
print('Validation Accuracy : ' , np.mean(model_output.history['val_accuracy']))
##CHECKING PREDICTION----------------------------------------------------------
#Do a Prediction and check the Precision
y_pred = model.predict(x_test)
rounded = [round(x[0]) for x in y_pred]
y_pred1 = np.array(rounded,dtype='int64')
confusion_matrix(y_test,y_pred1)
precision_score(y_test,y_pred1)
#Plot the model accuracy over epochs
# Plot training & validation accuracy values
plt.plot(model_output.history['accuracy'])
plt.plot(model_output.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
# Plot training & validation loss values
plt.plot(model_output.history['loss'])
plt.plot(model_output.history['val_loss'])
plt.title('model_output loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
我想看的是下图。
https://user-images.githubusercontent.com/55457221/67140808-a45e4580-f25e-11e9-89f7-1812a2d04e7d.png)
https://user-images.githubusercontent.com/55457221/67140810-aaecbd00-f25e-11e9-9e76-ed737f11aee3.png)
我“想看”的图片的控制台/日志(第二张图片):
500/500 纪元 691/691 [==============================] - 0s 271us/步 - 损失:0.5075 - 准确度:0.7496 - val_loss :0.4810 - val_accuracy:0.7792 训练精度:0.72937775 验证精度:0.776207780957222
实际结果:
https://user-images.githubusercontent.com/55457221/67140782-5d705000-f25e-11e9-9425-5cc624311e39.png
https://user-images.githubusercontent.com/55457221/67140795-7d077880-f25e-11e9-955e-bfacbe2a1a92.png
我“认为错误”的图像的控制台/日志(前 2 张图像):
500/500 纪元 774/774 [==============================] - 0s 506us/步 - 损失:0.1957 - 准确度:0.9109 - val_loss :0.0726 - val_accuracy:1.0000 训练精度:0.9189251 验证精度:0.9792092989683151
希望你能帮助我。提前谢谢你们。
【问题讨论】:
这种趋势可能是由于您的数据。是否可以共享数据 是的,这是链接:drive.google.com/open?id=1--1OoFHdOjb2ARyJ2dD80Zw4RkvCY0lK "Gewicht" 是输出,我在代码中将其转换为 1 和 0。 如何编码为 0 和 1 的标准是什么 我以高斯方式进行了中位数、标准差和容差。公差范围内的所有内容 = 1,其余为 0。 您必须在训练前对数据进行洗牌。你在洗牌吗 【参考方案1】:您应该在训练之前对数据进行洗牌和随机化
def Randomizing():
df = pd.DataFrame("D1":range(5), "D2":range(5))
print(df)
df2 = df.reindex(np.random.permutation(df.index))
print(df2)
Randomizing()
这是一个示例代码,您可以在读取数据后为您的数据框 Tabelle 执行该代码,以便对您的数据进行洗牌
希望对你有帮助
【讨论】:
这些是洗牌后的结果图像。它没有改变。水滴还在。 drive.google.com/open?id=1jOUkE1cxr5gDaRWWxmv0X0r3izj1MalG drive.google.com/open?id=1bt2TcSGygkg0kweWrqoPDLhTtoLtzSLZ 这是洗牌后的日志/控制台: Epoch 500/500 774/774 [=========================== ===] - 0s 401us/步 - 损失:0.3184 - 准确度:0.7881 - val_loss:0.1662 - val_accuracy:0.8023 训练准确度:0.8909251 验证准确度:0.9346046558618546 我不确定,你的评论是什么意思 这有点帮助,所以谢谢你。如果没有人再回答,我会选择你的答案为最佳。 我还有其他问题。改组也很有帮助。扩展也很重要。以上是关于训练准确性增加,然后偶尔突然下降。使固定? [Keras] [TensorFlow 后端]的主要内容,如果未能解决你的问题,请参考以下文章
cnn训练准确率很高,测试准确率很低(loss有一直下降)是为啥?