Точность тренировки увеличивается, затем падает спорадически и резко. Фикс? [Keras] [TensorFlow backend] - PullRequest
0 голосов
/ 19 октября 2019

Я делаю бинарную классификацию.

Таким образом, при обучении моей Модели точность обучения увеличивается, но в некоторых эпохах ее падение резко падает. Ниже изображение для иллюстрации. Что я делаю неправильно? Почему это происходит? Какое объяснение? Как я могу это исправить?

Кроме того, как точность обучения, так и точность проверки (особенно точность проверки) большую часть времени близки к 1 (100%), довольно рано в циклах эпох. Почему? Это хорошо или плохо? Я так не думаю?

Это данные: 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)

Консоль / Журнал изображения, которое я «хотел бы увидеть» (2 изображения):

Epoch 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 изображения):

Epoch 500/500 774/774 [=============================] - 0 с 506us / шаг - потеря: 0,1957 - точность: 0,9109 - val_loss: 0,0726 - val_accuracy: 1,0000 Точность обучения: 0,9189251 Точность проверки: 0,9792092989683151

можноПомоги мне. Заранее спасибо, ребята.

1 Ответ

0 голосов
/ 19 октября 2019

Вы должны перетасовать и рандомизировать свои данные перед их обучением

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 после того, как прочитаете данные, для того, чтобы перетасовать ваши данные

Надеюсь, это поможет

...