如何解决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 举报,一经查实,本站将立刻删除。