Keras'da validation accuracy'nin yanlış hesaplanması


#1

Merhabalar. Keras’da uzun süredir train edip bir gariplik sezdiğim ağda gözlemlemek için
model.fit(giris/255, cikis, epochs=100,validation_data=(giris/255,cikis)) validation_data olarak da train_data olarak da aynı verisetini kullandım. Aynı numpy dosyası, gördüğünüz gibi aynı şekilde normalize edilmiş.

loss: 6.6116 - acc: 1.0000 - val_loss: 18.1814 - val_acc: 0.2593

Doğruluk oranında ikisi de aynı göstermeliyken, böyle bir durum yok. Dropout da kullanmıyorum, kullansam gösterilen loss’a etki edebileceğini biliyorum. Herhangi bir önerisi olan var mı?


#2

Tain data ve validation datada farklılık olması muhtemel. Bir de bunlar epoch sonu rakamlar mı? Kodu paylaşmanız mümkün mü?


#3

aynı veri setini verseniz bile eğitim ve test değerleri arasında farklılık olması normal
sebebi şu ;

  • eğitim esnasında batch_size değerine göre veriler alınarak peyder pey loss ve acc değerleri hesaplanır.
  • her loss hesabıyla ağırlıklar güncellenir. hasılı her iterasyonda farklı ağ ağırlıklarıyla loss ve acc değerleri hesaplanır.
  • test için epoch sonundaki ağırlıklarla loss ve acc değeri hesaplanır.
  • Genellikle bu yüzden ilk iterasyonlarda eğitim loss ve acc değerleri test loss ve acc değerlerinden kötü olur.

Bütün bu açıklamalara rağmen sizin yazdığınız değerler tuhaf duruyor. Daha detaylı olarak anlatırsanız tuhaflığın sebebine bakabiliriz.


#4

Normalde imgaug adlı kütüphaneden simültane augmentation yapıyordum, fakat bir gariplik sezince aynı veriyi train ve validation için kullandım.

print(“ded”)
import keras
from keras.layers import Input
from keras.models import Model, Sequential
from keras.layers.core import Reshape, Dense, Dropout, Flatten
from keras.layers.advanced_activations import LeakyReLU, regularizers
from keras.layers.convolutional import Conv2D, UpSampling2D,MaxPooling2D, Convolution2D
from keras.datasets import mnist
from keras.optimizers import Adam, SGD,RMSprop, Adadelta
from keras import backend as K
from keras.losses import mean_absolute_error
from keras import initializers
from tensorflow import losses as ls
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K
from keras import callbacks

import numpy as np

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K
import imgaug
import augmentfunctions as af
from keras import regularizers
from keras.applications import inception_v3, resnet50
from keras.callbacks import ReduceLROnPlateau

giris = af.giris.reshape(-1,224,224,3)
cikis = af.cikis.reshape(-1,5)


#-----

# create the base pre-trained model
base_model = resnet50.ResNet50(weights="imagenet", include_top=False)

# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dropout(0.5)(x)
x = Dense(1024, activation='relu',kernel_regularizer=regularizers.l2(0.01))(x)

predictions = Dense(5,activation="softmax")(x)

# this is the model we will train
model = Model(inputs=base_model.input, outputs=predictions)

for layer in base_model.layers:
    layer.trainable = False

# compile the model (should be done *after* setting layers to non-trainable)
model.compile(optimizer=keras.optimizers.Adam(lr=0.0001), loss='categorical_crossentropy',metrics=["accuracy"])

# train the model on the new data for a few epochs
model.fit(giris/255,cikis,epochs=20,validation_data=(giris/255,cikis))

# at this point, the top layers are well trai
for i, layer in enumerate(base_model.layers):
   print(i, layer.name)
for layer in model.layers[:40]:#234,239
   layer.trainable = False
for layer in model.layers[40:]:
   layer.trainable = True
from keras.optimizers import SGD,Adam


model.compile(optimizer=Adam(lr=0.0001,decay=0.05), loss='categorical_crossentropy',metrics=["accuracy"]) #0.000000033





#model.fit_generator(af.generator(giris, cikis, 128), steps_per_epoch=af.giris.shape[0] / 128, epochs=700,validation_data=(giris/255,cikis))

model.fit(giris/255, cikis, epochs=80,validation_data=(giris/255,cikis))
model.save("imgaugkeras")

#5

Kodunuzda herhangi bir hata göremedim.
train ve validation accuracy değerleri training sonunda aldığınız değerler mi? Yukarıda da söylendiği gibi training sırasında bazı farklılıklar olması normal. Daha trainge girmemiş örneklerin validationda gözükmesinden kaynaklanıyor olabilir.

model.evaluate metoduyla training tamamlandıktan sonra accuracyi hesaplayın. Eğer 1.0 alıyorsanız herhangi bir sorun yok demektir.


#6

Teker teker baktığımda hep 3. sınıfın tahmin ettirildiğini gördüm. Fakat hani bunun sebepleri var biliyorum overfitting’dir imbalanced dataset’tir ama aynı verisetinde neden training overfit ederken gene tamamen aynı verisetinde validation için yüzde 25 gibi bir oran vermekte pek çözebilmiş değilim. Yoksa az bir veriyle uğraşıyorum, ağır augmentation yapıyorum burda göstermediğim aksine ve class_Weight de ekleyeceğim. Akıl sır erdiremedim.


#7

Buradan duyurayım, çok sağolun yardımlarınız için. Keras’ta finetuning yaparken dikkat edin. VGGnet’i x = Dense(21)(x) formatında kodladığınızda hata oluyor tahminlerde. Kaç haftam gitti boşu boşuna. Keras Github’da da paylaşacağım. Dikkat edin. Keras’ın finetuningleri sıkıntılı.


#8

x.add(Conv2D()) formatında yazdığınızda herhangi bir sıkıntı oluşmamakta.


#9

yine eksik bilgi var. augmentfunctions ne iş yapar nasıl yapar ?