拟合函数中的y_train没有正确的尺寸

时间:2019-01-13 21:23:54

标签: python keras

我以某种模式创建了一个人工的点集合来运行2D分类器。因此,我插入点e。 G。 (x1,x2)并命名其正确的类别(标签1或标签2)。将x_train和y_train这两个点都放入Keras层模型中,最后,我运行Model.fit方法。

# Assign returned data
x_train, y_train = separate_dots_from_dict(dots)
y_train = to_categorical(y_train, NUM_CLASSES)
print("Shapes (x, y):", x_train.shape, ",", y_train.shape)

# Classification
model = Sequential()

model.add(Dense(NUM_CLASSES * 8, input_shape = (2, 1, 1), activation = 'relu'))
model.add(Dense(NUM_CLASSES * 4, activation = 'relu'))
model.add(Dense(NUM_CLASSES, activation = 'softmax'))

model.compile(loss = 'categorical_crossentropy',
              optimizer = 'sgd',
              metrics = ['accuracy'])

model.fit(x_train, y_train, epochs = 4, batch_size = 2)

之前,我已打印出我的点转换结果,这些结果是成功地从我的split_dots_from_dict()函数获得的,并且已经使用Keras包中的to_categorical()方法进行了转换。我的功能以

结尾
return np.array(x_train).reshape(len(x_train), 2, 1, 1), np.array(y_train).reshape(len(y_train))

在下面的内容中,我向您展示了5个虚构的点,它们最终在分类开始之前就生成了:

X

[[[[ 0.5]]

  [[ 0.8]]]


 [[[ 0.3]]

  [[ 0.6]]]


 [[[ 0.1]]

  [[-0.3]]]

[[[ 1.1]]

  [[-1.1]]]


 [[[-1.4]]

  [[-1.5]]]]

Y

[[1. 0.]
 [1. 0.]
 [1. 0.]
 [0. 1.]
 [0. 1.]]

Y是y_train,因此它是训练目标e。 G。标签。 x_train(X)的格式可能看起来很尴尬,但是考虑到我刚刚在此处类似实现的MNIST图像的重塑,这正是众所周知的格式。 不幸的是,我收到以下错误:

Using TensorFlow backend.
Shapes (x, y): (34, 2, 1, 1) , (34, 2)
Traceback (most recent call last):
  File "main.py", line 88, in <module>
    model.fit(x_train, y_train, epochs = 4, batch_size = 2)
  File "/home/scud3r1a/Conda/envs/numtenpy/lib/python3.6/site-packages/keras/engine/training.py", line 950, in fit
    batch_size=batch_size)
  File "/home/scud3r1a/Conda/envs/numtenpy/lib/python3.6/site-packages/keras/engine/training.py", line 787, in _standardize_user_data
    exception_prefix='target')
  File "/home/scud3r1a/Conda/envs/numtenpy/lib/python3.6/site-packages/keras/engine/training_utils.py", line 127, in standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking target: expected dense_3 to have 4 dimensions, but got array with shape (34, 2)

我能够找到的所有解决方案都具有仅更改最后一个Dense层中的单位的解决方案。但是首先,这不会影响任何事情,其次,我认为它是真的。

尺寸误差与x_train形状成比例。 在这里做什么?

2 个答案:

答案 0 :(得分:0)

我认为您输入的形状不正确。您最有可能尝试重建Conv模型,对吗? 您遇到的问题是,您对密集层的输入具有3维。但是您想要的只是一维的东西,例如32个神经元。为了实现此目的,您必须重塑x输入的形状,或者在输出层之前的某个点插入一个Flatten层。 此外,在模型开发期间,它可能对打印模型有帮助(model.summary()会这样做)。在那里,您可以获得概述,也许还可以更好地了解它的外观。

答案 1 :(得分:0)

Dense层需要输入暗淡(input_dims, None),即您发送的3暗淡的内容,该暗淡应该仅为预期的1(正确格式)。 代表batch_size,无需定义。

尝试在模型中进行以下更改:

x_train = x_train.reshape(2,-1)
model = Sequential()
model.add(Dense(NUM_CLASSES * 8, input_dim=(2,), activation = 'relu')

它将解决您的问题。