Фрейм ввода данных Pandas для функции подгонки Keras - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть набор данных, который выглядит примерно так:

  emotion   images
0   0      [[70, 80, 82, 72, 58, 58, 60, 63, 54, 58, 60, ...
1   0      [[151, 150, 147, 155, 148, 133, 111, 140, 170,...
2   2      [[231, 212, 156, 164, 174, 138, 161, 173, 182,...
3   4      [[24, 32, 36, 30, 32, 23, 19, 20, 30, 41, 21, ...
4   6      [[4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 2...

Столбец эмоций является категориальной переменной, а изображения содержат массив значений, представляющий изображения (размер = (48, 48)).

Моя задача - классификация изображений, для которой я использую керасы.

Когда я пытаюсь:

model.fit(df['images'], df['emotion'], epochs= 10, batch_size = 32)

Я получаю сообщение об ошибке:

ValueError: Ошибка при проверке ввода: ожидается, что conv2d_1_input будет иметь 4 размера, но получил массив с формой (28708, 1)

Я понимаю, что fit() ожидает numpy объекты, и я попытался использовать 'df.values', как предложено здесь . Но на самом деле это не работает для меня.

Я бы хотел провести предварительную обработку таким способом, который также объединяет мои входные данные с размером 32. Я не знаю, как выполнить предварительную обработку или преобразовать мои данные отсюда, чтобы я мог обучить их в своей сети с помощью keras.

как мне изменить мои данные, чтобы они имели 4 измерения, как того требует моя сеть?

model.summary()

    _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_7 (Conv2D)            (None, 46, 46, 64)        640       
_________________________________________________________________
activation_7 (Activation)    (None, 46, 46, 64)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 44, 44, 32)        18464     
_________________________________________________________________
activation_8 (Activation)    (None, 44, 44, 32)        0         
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 22, 22, 32)        0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 20, 20, 32)        9248      
_________________________________________________________________
activation_9 (Activation)    (None, 20, 20, 32)        0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 18, 18, 32)        9248      
_________________________________________________________________
activation_10 (Activation)   (None, 18, 18, 32)        0         
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 9, 9, 32)          0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 7, 7, 32)          9248      
_________________________________________________________________
activation_11 (Activation)   (None, 7, 7, 32)          0         
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 5, 5, 32)          9248      
_________________________________________________________________
activation_12 (Activation)   (None, 5, 5, 32)          0         
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 2, 2, 32)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               16512     
_________________________________________________________________
activation_13 (Activation)   (None, 128)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 7)                 903       
_________________________________________________________________
activation_14 (Activation)   (None, 7)                 0         
=================================================================
Total params: 73,511
Trainable params: 73,511
Non-trainable params: 0

Код моей модели:

model = Sequential()
model.add(Conv2D(64, (3,3), input_shape = (48, 48, 1)))
model.add(Activation('relu'))
model.add(Conv2D(32, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))

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

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


model.add(Flatten())
model.add(Dense(units = 128))
model.add(Activation('relu'))
model.add(Dense(units= 7))
model.add(Activation('softmax'))
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

Редактировать: Если вы отрицаете этот вопрос, пожалуйста, дайте мне также знать, почему это не должно быть в переполнении стека или что не так с такими вопросами. Будет использовать его в качестве отзыва для моих будущих сообщений.

1 Ответ

0 голосов
/ 18 сентября 2018
  1. Вы должны выполнить однократное кодирование меток, если хотите использовать категорическую кроссентропию. Так что y форма должна быть равна (28709, K), где K - это количество эмоций (полагаю K=7 в вашем случае).
  2. Я не совсем понимаю, почему Python говорит, что df['images'] имеет форму (28708, 1). Я предполагаю, что этот столбец интерпретируется как одномерный массив списков. Если я прав, вам нужно правильно преобразовать df['images'] в массив nupy 3d.
  3. Вы также должны добавить дополнительное измерение каналов в конце результирующего трехмерного массива. Я полагаю, ваши изображения в оттенках серого. Вот почему в вашем случае размер последнего измерения равен 1.

Чтобы исправить проблемы 2-3, вы должны выполнить что-то вроде этого:

np.expand_dims(np.array(df['images'].tolist()), axis=3)
...