keras cnn训练的准确性和损失不会改变,val损失和准确性仍然为0

时间:2020-09-01 17:15:00

标签: keras cnn data-augmentation

我正在研究面部表情分类问题,我从互联网上下载了一些图像,有些是我自己点击的,表示快乐(100张),悲伤(100张),中性(50张)和分散注意力(50张),因为数据很少,所以我正在使用数据扩充并从keras文档中的示例中训练了CNN,也因为我在kaggle笔记本上工作,所以我没有保存合并的数据,而是将其转换为数组并附加了原始数据。 您可以在avidavi

亲自尝试该代码
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers.core import Activation, Dropout, Dense, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.models import Model
from keras.optimizers import SGD
from PIL import Image
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.utils import np_utils

#loading from csv
train = pd.read_csv(r'/kaggle/input/traindata/train.csv')
#each row is of 9217 features in which first 9216(96*96) are image converted to array 
#and last column is label
#labels = {1:'happy', 2:'sad', 3:'neutral', 4:'distracted'}
#below i am defining data generator
datagen = ImageDataGenerator(
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.0,
    zoom_range=0.1,
    horizontal_flip=True,
    vertical_flip=False,
    fill_mode='nearest')

#below converting array for suitable shapes for keras, as these are gray scale images so 1 channel
train_array = train.values
print(train_array.shape)
y_train_array= train_array[:,-1]
X_train_array = train_array[:,:-1].reshape(train_array.shape[0],96,96,1)
# del train_array
print(X_train_array.shape, y_train_array.shape)

#below creating 20 more images for each image and creating a new array
X_test_arr = []
y_test_arr = []
for i in range(X_train_array.shape[0]):
    j=0
    for batch in datagen.flow(x=X_train_array[i].reshape(1,96,96,1), y=y_train_array[i].reshape(1,), batch_size=1):
        j+=1
        X_test_arr.append(batch[0].reshape(96,96))
        y_test_arr.append(batch[1])
        if j == 20:
            break

#even though i am creating 20 or 50 augmented images or normalizing them or converting to int 
# output accuracy does not change

#creating arrays from above list
y_aug_arr = np.array(y_test_arr)
X_aug_arr = np.array(X_test_arr)

#appending augmented data to original data
X_train_array = np.r_[X_train_array, X_aug_arr]
y_train_array = np.r_[y_train_array, y_aug_arr]

#reshaping for keras input
X_train_array = X_train_array.reshape(X_train_array.shape[0], X_train_array.shape[1], X_train_array.shape[2], 1)

#creating model, i have used adam, rmsprop accuracy does not change while using SGD accuracy drops to almost 0
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(96, 96, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.summary()

#fitting model
batch_size = 32
epochs = 2
history = model.fit(X_train_array, y_train_array.reshape(-1), batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.1)

#output is same no matter what i do
Epoch 1/2
200/200 [==============================] - 34s 169ms/step - loss: 0.0000e+00 - accuracy: 0.3957 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 2/2
200/200 [==============================] - 34s 168ms/step - loss: 0.0000e+00 - accuracy: 0.3957 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
    

0 个答案:

没有答案