我以某种模式创建了一个人工的点集合来运行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形状成比例。 在这里做什么?
答案 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')
它将解决您的问题。