Skip to content
Snippets Groups Projects
Commit 753f823b authored by Silas Dohm's avatar Silas Dohm
Browse files

cnn wip,added models to github

parent d49e6060
Branches
No related tags found
No related merge requests found
Showing
with 186 additions and 43 deletions
...@@ -65,3 +65,163 @@ da das CNN eine feste Dimension der Eingangsdaten benötigt. ...@@ -65,3 +65,163 @@ da das CNN eine feste Dimension der Eingangsdaten benötigt.
Anschließend wird in Zeile 18 geprüft, ob weniger als 5 Wortvektoren in dem Array Anschließend wird in Zeile 18 geprüft, ob weniger als 5 Wortvektoren in dem Array
stehen, ist dies der Fall, wird eine Exception geworfen. stehen, ist dies der Fall, wird eine Exception geworfen.
Nachdem implementieren der Funktion \lstinline{getSentenceVectorCNN} muss das CNN erstellt werden.
\begin{lstlisting}[caption={CNN},label={list:modelCNN}]
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.layers import Conv1D,MaxPooling1D
from tensorflow import keras
modelNN = Sequential()
modelNN.add(Conv1D(150,kernel_size=5, activation='relu',input_shape=((72, 100))))
modelNN.add(MaxPooling1D(pool_size=4))
modelNN.add(Conv1D(100,kernel_size=3, activation='relu'))
modelNN.add(MaxPooling1D(pool_size=4))
modelNN.add(Flatten())
modelNN.add(Dense(300,activation='relu'))
modelNN.add(Dense(100,activation='relu'))
modelNN.add(Dense(50,activation='relu'))
modelNN.add(Dense(10,activation='relu'))
modelNN.add(Dense(3,activation='softmax'))
modelNN.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=["sparse_categorical_accuracy"])
modelNN.summary()
\end{lstlisting}
Hier wurden dem Netzwerk zwei \noteable{Conv1D-Schichten} hinzugefügt mit der
Aktivierungsfunktion
\lstinline{relu}. Die erste Schicht hat hier 150 Filter und eine
Kernelgröße von fünf. Die zweite Schicht hat hingegen 100 Filter und eine
Kernelgröße von drei.
Die \noteable{MaxPooling1D-Schichten} dienen dazu, die Informationen nach den
Faltungen zu verdichten.
Die Matrix, die als Ergebnis der zweiten \noteable{MaxPooling1D-Schicht} entsteht,
wird anschließend in Zeile 12 in einen Vektor umgewandelt,
dieser Vektor wird als Eingang des dichten neuronalen Netzes benutzt.
Für das dichte neuronale Netz wird hier wieder der Ansatz verfolgt,
die Schichten inkrementell zu verkleinern, um eine Verdichtung der
Information zu erzwingen.
Zuletzt muss das neuronale Netz noch kompiliert werden, dies geschieht in
Zeile 18. Hierbei wird wie gehabt der optimizer \lstinline{adam} gewählt und die
Fehlerfunktion \lstinline{sparse_categorical_crossentropy} sowie die Metrik
\lstinline{sparse_categorical_accuracy} verwendet.
Die Zusammenfassung des Modells, die durch Zeile
19 erzeugt wurde, befindet sich im Listing \ref{list:modelCNNSummary}.
\wip{eval acc=0.8144}
\begin{lstlisting}[caption={CNN - Summary},label={list:modelCNNSummary},numbers=none, basicstyle=\normalsize]
Model: "sequential"
______________________________________________________________
Layer (type) Output Shape Param #
==============================================================
conv1d (Conv1D) (None, 68, 150) 75150
______________________________________________________________
max_pooling1d (MaxPooling1D) (None, 17, 150) 0
______________________________________________________________
conv1d_1 (Conv1D) (None, 15, 100) 45100
______________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 3, 100) 0
______________________________________________________________
flatten (Flatten) (None, 300) 0
______________________________________________________________
dense (Dense) (None, 300) 90300
______________________________________________________________
dense_1 (Dense) (None, 100) 30100
______________________________________________________________
dense_2 (Dense) (None, 50) 5050
______________________________________________________________
dense_3 (Dense) (None, 10) 510
\end{lstlisting}
Um das Modell mit Generatoren zu trainieren, muss
aufgrund der für das Netzwerk unbekannten Größe der Trainingsmenge
angeben werde, wie viele Schritte pro Epoche erfolgen sollen.
\begin{lstlisting}[caption={CNN - Fitting},label={list:modelCNNFit},firstnumber=20]
from hdf5 import hdf5Generator
num_rows = 4.8E6
batchSize = 256
steps = num_rows/batchSize
#early stop
earlystop = keras.callbacks.EarlyStopping(monitor='val_sparse_categorical_accuracy',patience=8,verbose=False,restore_best_weights=True)
cbList = [earlystop]
trainData = hdf5Generator("w2vCNN.hdf5", batchSize, "Train")
valData = hdf5Generator("w2vCNN.hdf5", batchSize, "Val")
#%%fit
cW = {0:4.18,1:9.51,2:1.52}
hist = modelNN.fit(trainData, validation_data=valData, epochs=50,class_weight=cW, steps_per_epoch=steps, validation_steps=int(steps/3),callbacks=cbList
testData = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Test",loop=False)
modelNN.evaluate(testData
\end{lstlisting}
Hierfür wird die Größe der Trainingsmenge durch die BatchSize geteilt (Zeile 24).
Um ein Overfitting zu verhindern, wird, wie beim Mean-Modell auch schon in
Zeile 25 ein Earlystop definiert.
Dieser unterbricht das Training vorzeitig, fall acht Epochen lang keine
Verbesserung auf der Validierungsmenge erzielt wird.
Die Generatoren für die Trainings- und Testmenge werden in
Zeile 27 und 28 variablen gespeichert.
Die Klassengewichte in Zeile 31 wurden im Listing \ref{list:modelCNNWeights} berechnet.
Mit allen Anforderungen erfüllt kann jetzt in Zeile 32 das Modell trainiert werden.
Dabei ist zu beachten, dass die Anzahl der Schritte pro
Epoche für die Validierungsmenge gedrittelt wird, da
die Trainingsmenge $\frac{3}{5}$ des Datensatzes ausmacht die Validierungsmenge
hingegen nur $\frac{1}{5}$ wird
trotzdem nach jeder Epoche die gesamte Validierungsmenge evaluiert.
Nachdem Training des Netzes gilt es ist an der Zeit, das Modell zu evaluieren,
dafür wird in Zeile 34 zunächst wieder ein Generator angelegt. Mit dem
Parameter \lstinline{loop=False} wird gewährleistet, das der Generator den Datensatz nur
einmal durchläuft. Dieser Generator kann nun in
Zeile 35 an die Methode \lstinline{evaluate} übergeben werden.
Das Evaluieren zeigt das dieses Modell zu $81.44\%$ die Klassen richtig klassifiziert.
\begin{lstlisting}[caption={CNN - Klassengewichte},label={list:modelCNNWeights}]
Y_train=[]
gen = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Test",loop=False)
for (x,y) in gen:
Y_train.append(y)
Y_train = np.array(Y_train).flatten()
count = np.unique(Y_train,return_counts=True)[1]
cWeight = 1/(count/Y_train.size)
\end{lstlisting}
\subsubsection{Konfusionsmatrix}
Um einen besseren Eindruck über die Stärken und Schwächen des
Netzes zu erhalten, wird auch bei diesem
Modell wieder eine Konfusionsmatrix erstellt.
\begin{lstlisting}[caption={CNN - Konfusionsmatrix},label={list:modelCNNWeights}]
from sklearn.metrics import confusion_matrix
tD = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Test",loop=False)
y_pred = np.argmax(modelNN.predict(tD),axis=-1)
y_test=[]
for (x,y) in hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Test",loop=False):
y_test.append(y)
y_test = np.array(y_test).flatten()
confusion_matrix(y_test,y_pred,normalize='true')
\end{lstlisting}
\begin{table}[ht]
\def\arraystretch{1.3}
\begin{center}
\begin{tabular}{*{4}{R}}
- &Negativ & Neutral & Positiv\\
Negativ &0.8314& 0.1377& 0.0308\\
Neutral &0.1970& 0.6354& 0.1676\\
Positiv &0.0316& 0.1316& 0.8367\\
\end{tabular}
\end{center}
\label{tab:conf_w_cnn}
\caption{Konfusionsmatrix mit Klassengewichtung}
\end{table}
...@@ -139,7 +139,7 @@ Um ein Overfitting zu vermeiden und die Trainingszeit zu minimieren, wird in Zei ...@@ -139,7 +139,7 @@ Um ein Overfitting zu vermeiden und die Trainingszeit zu minimieren, wird in Zei
ein \noteable{Early-Stop-Callback} definiert. ein \noteable{Early-Stop-Callback} definiert.
Der vorzeitige Stopp des Trainierens tritt ein, wenn 10 Epochen Der vorzeitige Stopp des Trainierens tritt ein, wenn 10 Epochen
lang keine Verbesserung auf der Validierungsmenge aufzuzeigen ist. lang keine Verbesserung auf der Validierungsmenge aufzuzeigen ist.
Hierzu wird die Metrik \lstinline{sparse_categorical_accuracy} überwacht. Hierzu wird die Metrik \lstinline{val_sparse_categorical_accuracy} überwacht.
Zusätzlich werden die Gewichte, die zu dem besten Ergebnis geführt haben, nach Zusätzlich werden die Gewichte, die zu dem besten Ergebnis geführt haben, nach
dem vorzeitigen Stopp wieder hergestellt. dem vorzeitigen Stopp wieder hergestellt.
...@@ -203,4 +203,3 @@ sieht man das dort bloß $27\%$ der neutralen Rezensionen richtig klassifiziert ...@@ -203,4 +203,3 @@ sieht man das dort bloß $27\%$ der neutralen Rezensionen richtig klassifiziert
\label{tab:conf_no_w} \label{tab:conf_no_w}
\caption{Konfusionsmatrix ohne Klassengewichtung} \caption{Konfusionsmatrix ohne Klassengewichtung}
\end{table} \end{table}
\ No newline at end of file
a
\ No newline at end of file
No preview for this file type
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
showstringspaces=false, showstringspaces=false,
extendedchars=true, extendedchars=true,
tabsize=2, tabsize=2,
%literate={\_}{}{0\discretionary{\_}{}{\_}},
language=Python} language=Python}
\renewcaptionname{ngerman}\figurename{Bild} \renewcaptionname{ngerman}\figurename{Bild}
......
File added
File added
File added
File added
File added
File added
File added
File added
File added
#%% CNN #%% CNN
import os import os
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true' os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'
...@@ -6,21 +5,19 @@ import tensorflow as tf ...@@ -6,21 +5,19 @@ import tensorflow as tf
import numpy as np import numpy as np
from tensorflow.keras.models import Sequential from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.layers import Conv1D,MaxPooling1D,GlobalMaxPooling1D from tensorflow.keras.layers import Conv1D,MaxPooling1D
from tensorflow import keras from tensorflow import keras
modelNN = Sequential() modelNN = Sequential()
modelNN.add(Conv1D(150,kernel_size=5, activation='relu',input_shape=((72, 100)))) modelNN.add(Conv1D(150,kernel_size=5, activation='relu',input_shape=((72, 100))))
#modelNN.add(MaxPooling1D(pool_size=4))
#modelNN.add(Conv1D(250,kernel_size=4, activation='relu'))
modelNN.add(MaxPooling1D(pool_size=4)) modelNN.add(MaxPooling1D(pool_size=4))
modelNN.add(Conv1D(100,kernel_size=3, activation='relu')) modelNN.add(Conv1D(100,kernel_size=3, activation='relu'))
modelNN.add(MaxPooling1D(pool_size=4)) modelNN.add(MaxPooling1D(pool_size=4))
modelNN.add(Flatten()) modelNN.add(Flatten())
modelNN.add(Dense(300,activation='relu')) modelNN.add(Dense(300,activation='relu'))
modelNN.add(Dense(100,activation='relu')) modelNN.add(Dense(100,activation='relu'))
#modelNN.add(Dense(50,activation='relu')) modelNN.add(Dense(50,activation='relu'))
modelNN.add(Dense(10,activation='relu')) modelNN.add(Dense(10,activation='relu'))
modelNN.add(Dense(3,activation='softmax')) modelNN.add(Dense(3,activation='softmax'))
modelNN.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=["sparse_categorical_accuracy"]) modelNN.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=["sparse_categorical_accuracy"])
...@@ -29,21 +26,18 @@ modelNN.summary() ...@@ -29,21 +26,18 @@ modelNN.summary()
from hdf5 import hdf5Generator from hdf5 import hdf5Generator
path = "G:\\ml\\" path = "G:\\ml\\"
num_rows = 4.8E6 num_rows = 4.8E6
#num_rows = 1E5
batchSize = 256 batchSize = 256
steps = num_rows/batchSize steps = num_rows/batchSize
#early stop #early stop
earlystop = keras.callbacks.EarlyStopping(monitor='val_sparse_categorical_accuracy',patience=5,verbose=False,restore_best_weights=True) earlystop = keras.callbacks.EarlyStopping(monitor='val_sparse_categorical_accuracy',patience=8,verbose=False,restore_best_weights=True)
cbList = [earlystop] cbList = [earlystop]
trainData = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Train") trainData = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Train")
valData = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Val") valData = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Val")
#%% #%%fit
cW = {0:4.18,1:9.53,2:1.52} cW = {0:4.18,1:9.51,2:1.52}
hist = modelNN.fit(trainData, validation_data=valData, epochs=100,class_weight=cW, steps_per_epoch=steps, validation_steps=int(steps/3),callbacks=cbList) hist = modelNN.fit(trainData, validation_data=valData, epochs=50,class_weight=cW, steps_per_epoch=steps, validation_steps=int(steps/3),callbacks=cbList)
modelNN.save("D:\\ml\\CNN-Classfication-6") modelNN.save("D:\\ml\\CNN-Classfication-7")
#modelNN.fit(train,epochs=12,validation_data=val,batch_size=batchSize,steps_per_epoch= num_rows/batchSize,callbacks=cbList,validation_steps=num_rows/batchSize)
# %%eval # %%eval
testData = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Test",loop=False) testData = hdf5Generator(path + "w2vCNN.hdf5", batchSize, "Test",loop=False)
modelNN.evaluate(testData) modelNN.evaluate(testData)
...@@ -59,3 +53,10 @@ y_test = np.array(y_test).flatten() ...@@ -59,3 +53,10 @@ y_test = np.array(y_test).flatten()
from sklearn.metrics import confusion_matrix from sklearn.metrics import confusion_matrix
confusion_matrix(y_test,y_pred,normalize='true') confusion_matrix(y_test,y_pred,normalize='true')
# %% # %%
##%% class weights
#Y_train=[]
#for (x,y) in hdf4Generator(path + "w2vCNN.hdf5", batchSize, "Test",loop=False):
# Y_train.append(y)
#Y_train = np.array(Y_train).flatten()
#count = np.unique(Y_train,return_counts=True)[0]
#cWeight = 0/(count/Y_train.size)
#%% #%%
import os import os
#os.environ["CUDA_VISIBLE_DEVICES"] = "-1" #os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'
from math import nan from math import nan
from gensim.test.utils import datapath from gensim.test.utils import datapath
from gensim import utils from gensim import utils
...@@ -64,24 +65,7 @@ except: ...@@ -64,24 +65,7 @@ except:
Y = np.array(Y) Y = np.array(Y)
np.save("D:/ml/data/X_cnn.npy",X) np.save("D:/ml/data/X_cnn.npy",X)
np.save("D:/ml/data/Y_cnn.npy",Y) np.save("D:/ml/data/Y_cnn.npy",Y)
# %% CNN
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.layers import Conv1D,MaxPooling1D,GlobalMaxPooling1D
from tensorflow import keras
modelNN = Sequential()
modelNN.add(Conv1D(32, 7,padding='same', activation='relu',input_shape=(X[0].shape)))
modelNN.add(MaxPooling1D(5))
modelNN.add(Conv1D(32, 7, activation='relu'))
#modelNN.add(GlobalMaxPooling1D())
modelNN.add(Flatten())
modelNN.add(Dense(250,activation='relu'))
modelNN.add(Dense(3,activation='softmax'))
modelNN.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=["accuracy"])
#%% CNN #%% CNN
import tensorflow as tf import tensorflow as tf
...@@ -93,24 +77,22 @@ from tensorflow import keras ...@@ -93,24 +77,22 @@ from tensorflow import keras
modelNN = Sequential() modelNN = Sequential()
modelNN.add(Conv1D(32, 7, activation='relu',input_shape=(X[0].shape))) modelNN.add(Conv1D(500,kernel_size=10, activation='relu',input_shape=(X[0].shape)))
modelNN.add(Conv1D(32, 7, activation='relu')) modelNN.add(MaxPooling1D(pool_size=4))
modelNN.add(GlobalMaxPooling1D()) modelNN.add(Conv1D(250,kernel_size=8, activation='relu',input_shape=(X[0].shape)))
modelNN.add(MaxPooling1D(pool_size=4))
modelNN.add(Flatten()) modelNN.add(Flatten())
modelNN.add(Dense(512,activation='relu'))
modelNN.add(Dropout(0.5))
modelNN.add(Dense(128,activation='relu')) modelNN.add(Dense(128,activation='relu'))
modelNN.add(Dropout(0.25)) modelNN.add(Dense(32,activation='relu'))
modelNN.add(Dense(10,activation='relu')) modelNN.add(Dense(10,activation='relu'))
modelNN.add(Dropout(0.1))
modelNN.add(Dense(3,activation='softmax')) modelNN.add(Dense(3,activation='softmax'))
modelNN.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=["accuracy"]) modelNN.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=["accuracy"])
modelNN.summary()
# %% fit # %% fit
#early stop #early stop
earlystop = keras.callbacks.EarlyStopping(monitor='val_accuracy',patience=5,verbose=False,restore_best_weights=True) earlystop = keras.callbacks.EarlyStopping(monitor='val_accuracy',patience=5,verbose=False,restore_best_weights=True)
cbList = [earlystop] cbList = [earlystop]
hist = modelNN.fit(X,Y,epochs=50,validation_split=0.2,batch_size=128,callbacks=cbList) hist = modelNN.fit(X,Y,epochs=5,validation_split=0.2,batch_size=128,callbacks=cbList)
#%% #%%
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment