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

问题描述

我正在研究面部表情分类问题,我从互联网上下载了一些图像,有些是我自己点击的,表示快乐(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,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,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,1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

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

model.add(Conv2D(64,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
    

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...