【问题标题】:Error during training for emotion recognizer情绪识别器训练期间的错误
【发布时间】:2021-08-14 23:14:08
【问题描述】:

我正在创建一个人工智能机器来识别情绪,但是我不断收到以下错误。任何帮助表示赞赏!

张量流版本:2.5

Traceback(最近一次调用最后一次):

File "c:\Users\HK School\moodRecog\secondversion.py", line 33, in <module>
    model.fit(trainingImages, trainingEmotions, epochs=10)
  File "C:\Users\HK School\AppData\Local\Programs\Python\Python39\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1133, in fit
    data_handler = data_adapter.get_data_handler(
  File "C:\Users\HK School\AppData\Local\Programs\Python\Python39\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1364, in get_data_handler
    return DataHandler(*args, **kwargs)
  File "C:\Users\HK School\AppData\Local\Programs\Python\Python39\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1152, in __init__   
    adapter_cls = select_data_adapter(x, y)
  File "C:\Users\HK School\AppData\Local\Programs\Python\Python39\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 991, in select_data_adapter
    raise ValueError(
ValueError: Failed to find data adapter that can handle input: (<class 'list'> 
containing values of types {"<class 'numpy.ndarray'>"}), (<class 'list'> containing values of types {"<class 'str'>"})

代码(文件 1):

# Mood Recognition AI Project

#import required libraries
import copy

import numpy as np
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import pandas as pd

classifiedEmotions = ["Angry", "Disgust", "Fear", "Happy", "Sad", "Surprise", "Neutral"]

#load data into Python
rawData = pd.read_csv("C:/Users/HK School/OneDrive/Desktop/Face-Recognition-Dataset/test-set.csv")
#split training data and testing data

#take training data from dataset
grouped = rawData.groupby(rawData.usage)
trainingData = grouped.get_group("Training")

#take testing data from dataset
testingData = rawData.loc[rawData["usage"] != "Training"]

#split pixel values and emotions for training and testing data

#take pixel values for images & emotions from training dataset
trainingImages = trainingData[["pixels"]].values.tolist()
trainingEmotions = trainingData[["emotion"]].values.tolist()

#take pixel values for images & emotions from testing dataset
testingImages = testingData[["pixels"]].values.tolist()
testingEmotions = testingData[["emotion"]].values.tolist()

#clean up data into organized lists containing numerical values

def splitList(imageDataset):
    newData = []
    for i in range(len(imageDataset)):
        imgRawVal = imageDataset[i]
        # print(imgRawVal)
        for j in range(len(imgRawVal)):
            imgSplitVal = imgRawVal[j].split(" ")
            newData.append(imgSplitVal)
    pixeledImage = np.array(newData, 'float64')/255
    for k in range(len(newData)):
        imageIn2D = pixeledImage[k].reshape(48,48)
        newData[k] = imageIn2D
    return newData

testingImages = splitList(testingImages)
trainingImages = splitList(trainingImages)

def convertToImages(imagesDataset):
    for i in range(len(imagesDataset)):
        plt.imshow(imagesDataset[i], cmap= "gray", interpolation="nearest")
        plt.axis("off")
        plt.show()

convertToImages(testingImages)
convertToImages(trainingImages)

def splitLabels(emotionDataset):
    newList = []
    for i in range(len(emotionDataset)):
        newList.append(emotionDataset[i][0])
    return newList

trainingEmotions = splitLabels(trainingEmotions)
testingEmotions = splitLabels(testingEmotions)

def classifyEmotions(emotionDataset):
    for i in range(len(emotionDataset)):
        emotionDataset[i] = classifiedEmotions[emotionDataset[i]]
    return emotionDataset

classifiedTrainingEmotions = classifyEmotions(trainingEmotions)
# print(classifiedTrainingEmotions)

# print(testingEmotions)

print(testingImages)

import pickle

f = open("data.pickle", "wb")

pickle.dump({"testingImages": testingImages, "trainingImages": trainingImages,"testingEmotions": testingEmotions, "trainingEmotions": trainingEmotions}, f)

f.close()

代码(文件 2):

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pickle

file = open("data.pickle", "rb")
completeValues = pickle.load(file)
file.close()
# print(completeValues)

testingImages = completeValues['testingImages']
trainingImages = completeValues['trainingImages']
trainingEmotions = completeValues['trainingEmotions']
testingEmotions = completeValues['testingEmotions']

classifiedEmotions = ["Angry", "Disgust", "Fear", "Happy", "Sad", "Surprise", "Neutral"]

def classifyEmotions(emotionDataset):
    for i in range(len(emotionDataset)):
        emotionDataset[i] = classifiedEmotions[emotionDataset[i]]
    return emotionDataset

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(48, 48)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(7)
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(trainingImages, trainingEmotions, epochs=10)

需要注意的是,我使用了 FER 2013 数据集并使用了 2 个文件来减少总时间(每次运行代码时都不需要更改数据)。

【问题讨论】:

  • 您应该将 NumPy 数组提供给 model.fit()。使用np.array()trainingImagestrainingEmotions 分别转换为ndarray
  • 哦!谢谢,这就是问题:)
  • 我已添加评论作为答案。如果对你有帮助,请采纳,以便其他开发者使用。

标签: python tensorflow machine-learning keras face-recognition


【解决方案1】:

您应该向model.fit() 提供 NumPy 数组。使用np.array()trainingImagestrainingEmotions 分别转换为ndarray。

trainingImages = np.array( trainingImages )
trainingEmotions=  np.array( trainingEmotions )

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2011-05-05
    • 2011-11-24
    • 2013-12-08
    • 2023-01-19
    相关资源
    最近更新 更多