Использование VGG16, 2.0 «Потери» не уменьшаются, что-то с подготовленными данными? - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать модель для распознавания эмоций на лице. Мой набор данных от "распознавания лица kaggle" (или что-то подобное). Набор находится в * .csv файле эмоции + пиксели (в виде строки, например "3, pixel pixel pixel ..."), и я предварительно обработал его следующим способом:

def resizeImages(x):
    x = x.astype('float32')
    x = x / 255.0
    return x

def loadData():
    print("Data loading START")
    rawData = pd.read_csv("../data/data.csv")
    pixels = rawData['pixels'].tolist()
    images = []
    for each in pixels:
        image = [int(pixel) for pixel in each.split()]
        image = np.asarray(image).reshape(width, height)
        images.append(image.astype('float32'))
    images = np.asarray(images)
    images = np.expand_dims(images, -1)
    images = np.repeat(images, 3, axis=3)
    emotions = pd.get_dummies(rawData['emotion'])
    print(emotions)
    images = resizeImages(images)
    print("Data loading DONE")
    return images, emotions

Моя модель выполнена как это:

#Constants
width, height, depth = 48, 48, 3
numOfClasses = 7
epochs = 10
batch_size = 50

#Loading Data
from Model.DataProcess import loadData
pixels, emotions = loadData()

#Spliting Data
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest  = train_test_split(pixels, emotions, test_size = 0.2)

#Loading VGG16 Model
from keras.applications.vgg16 import VGG16
vgg16model = VGG16(include_top=False, weights='imagenet',
                 input_shape=(width, height, depth), pooling='avg')

#Frezzing layers at VGG16 model - not trainable
for layer in vgg16model.layers:
    layer.trainable = False

#Creating final classifier
from keras.models import Sequential
from keras.layers import Dropout, Dense

myModel = Sequential([
    vgg16model,
    Dense(256, input_shape=(512,), activation="relu"),
    Dense(256, input_shape=(256,), activation="relu"),
    Dropout(0.25),
    Dense(128, input_shape=(256,)),
    Dense(output_dim=numOfClasses, activation="softmax")
])

myModel.summary()

#Creating optimizer
from keras.optimizers import Adamax
adamax = Adamax()

myModel.compile(loss='categorical_crossentropy',
                   optimizer=adamax,
                   metrics=['accuracy'])


#Fiting model
history = myModel.fit(
    xtrain, ytrain,
    epochs=epochs,
    validation_data=(xtest, ytest),
    callbacks = callbacks
)

Я делаю что-то не так, потому что после кучки операций, моя потеря все еще около 1,5, а точность почти 0,4

...