Python 使用Keras进行多类分类时数组形状错误

Python 使用Keras进行多类分类时数组形状错误,python,numpy,tensorflow,machine-learning,keras,Python,Numpy,Tensorflow,Machine Learning,Keras,我有一个由一个输入(一个整数)和一个输出组成的数据集,可以作为标签,例如: 因此,最后一列应该成为标签的热门编码(使用Keras'to_category()),例如: 我的输入和输出形状是 X_data.shape: (2407060,) y_data.shape: (2407060, 4) 然而,我得到一个错误,我的输出应该是形状(1),而不是(4),即使我的最后一层有4个输出 Using TensorFlow backend. _______________________________

我有一个由一个输入(一个整数)和一个输出组成的数据集,可以作为标签,例如:

因此,最后一列应该成为标签的热门编码(使用Keras'to_category()),例如:

我的输入和输出形状是

X_data.shape: (2407060,)
y_data.shape: (2407060, 4)
然而,我得到一个错误,我的输出应该是形状(1),而不是(4),即使我的最后一层有4个输出

Using TensorFlow backend.
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 16)                32
_________________________________________________________________
                                ...
_________________________________________________________________
dense_9 (Dense)              (None, 4)                 68
=================================================================
Total params: 63,156
Trainable params: 63,156
Non-trainable params: 0
_________________________________________________________________

ValueError: Error when checking target: expected dense_9 to have shape (1,) but got array with shape (4,)
代码如下:

model = Sequential()
model.add(Dense(16, activation='sigmoid', input_dim=1))
model.add(Dense(32, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(LeakyReLU())
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(4, activation='sigmoid'))

model.compile(optimizer='nadam',
              loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()

X_data = np.loadtxt(data_file, delimiter=',', usecols=(3))
y_data = to_categorical(np.loadtxt(data_file, delimiter=',', usecols=(7)))

model.fit(X_data, y_data, epochs=20, validation_split=0.3, verbose=1, callbacks=[cp_callback])

发生了什么?

如果输出为一种热格式,则应将损失函数更改为分类交叉熵

[1,0,0] [0,1,0] [0,0,1]

如果目标是整数,则可以使用稀疏\分类\交叉熵

1,2,3


最后一层的激活函数是什么?请显示代码,否则除了猜测之外几乎不可能指出错误:)。对不起,用我的代码编辑。您是否尝试将最后一层激活函数更改为“分类”\u交叉熵?类似的问题可以在这里找到@Minh Tuanguyen嗯,这很有效。谢谢!
Using TensorFlow backend.
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 16)                32
_________________________________________________________________
                                ...
_________________________________________________________________
dense_9 (Dense)              (None, 4)                 68
=================================================================
Total params: 63,156
Trainable params: 63,156
Non-trainable params: 0
_________________________________________________________________

ValueError: Error when checking target: expected dense_9 to have shape (1,) but got array with shape (4,)
model = Sequential()
model.add(Dense(16, activation='sigmoid', input_dim=1))
model.add(Dense(32, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(LeakyReLU())
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(4, activation='sigmoid'))

model.compile(optimizer='nadam',
              loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()

X_data = np.loadtxt(data_file, delimiter=',', usecols=(3))
y_data = to_categorical(np.loadtxt(data_file, delimiter=',', usecols=(7)))

model.fit(X_data, y_data, epochs=20, validation_split=0.3, verbose=1, callbacks=[cp_callback])