用于Keras拟合函数的输入熊猫数据框

时间:2018-09-12 08:33:28

标签: python pandas keras deep-learning

我有一个看起来像这样的数据集:

  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...

情感列是一个类别变量,图像包含表示图像的numpy数组(大小=(48,48))。

我的任务是图像分类,为此我使用了keras。

当我尝试:

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

我遇到价值错误:

  

ValueError:检查输入时出错:预期conv2d_1_input具有   4维,但数组的形状为(28708,1)

我了解到fit()期望使用numpy对象,并且我已尝试按照建议的here使用'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'])

编辑:如果您不赞成这个问题,请让我也知道为什么这不应该出现在Stack Overflow上或者这些问题有什么问题。将其用作我未来帖子的反馈。

1 个答案:

答案 0 :(得分:0)

  1. 如果要使用分类交叉熵,应执行标签的一键编码。因此,y的形状应等于(28709, K),其中K-是多种情感(我想您的情况是K=7)。
  2. 我不完全理解python为什么说df['images']的形状为(28708, 1)。我想将此列解释为列表的一维数组。如果我正确,则必须以正确的方式将df['images']转换为numpy 3d数组。
  3. 您还必须在result3D数组的末尾添加额外的通道尺寸。我想你的图像是灰度的。因此,在您的情况下,最后一个尺寸等于1。

要解决问题2-3,您必须执行以下操作:

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