我正在尝试使用Keras实现一个用于多类分类任务的人工神经网络(ANN)。
这是我的数据集:
#features shape (9498, 17)#labels shape (9498,)
其中9498是像素数,17是时间戳数,我有24个类别需要预测。
我想从非常基础的开始。这是我的代码:
import kerasfrom keras.models import Sequentialfrom keras.layers import Dense# 加载数据X_train, X_test, y_train, y_test = train_test_split(NDVI, labels, test_size=0.15, random_state=42)# 构建模型model = Sequential([ Dense(128, activation='relu', input_shape=(17,),name="layer1"), Dense(64, activation='relu', name="layer2"), Dense(24, activation='softmax', name="layer3"),])print(model.summary())# 编译模型model.compile( optimizer='adam', # 基于梯度的优化器 loss='categorical_crossentropy', # (>2类) metrics=['accuracy'],)# 训练模型model.fit( X_train, # 训练数据 y_train, # 训练目标 epochs=5, batch_size=32,)
这导致了以下错误:
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-17-2f4cf6510b24> in <module>() 23 y_train, # 训练目标 24 epochs=5,---> 25 batch_size=32, 26 )2 frames/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 1152 sample_weight=sample_weight, 1153 class_weight=class_weight,-> 1154 batch_size=batch_size) 1155 1156 # 准备验证数据./usr/local/lib/python3.6/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 619 feed_output_shapes, 620 check_batch_axis=False, # 不强制批量大小.--> 621 exception_prefix='target') 622 623 # 根据`sample_weight`和/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 143 ': expected ' + names[i] + ' to have shape ' + 144 str(shape) + ' but got array with shape ' +--> 145 str(data_shape)) 146 return data 147 ValueError: Error when checking target: expected layer3 to have shape (24,) but got array with shape (1,)
我不知道为什么会出现这个错误。此外,即使我查看了其他关于相同主题的帖子,我也似乎不理解Keras中的输入和输出形状。
回答:
主要问题在于标签的形状,因为你使用了loss='categorical_crossentropy'
,它自然期望标签是独热编码的,其中正确的类别为1
,错误的为0
。由于你有24个类别,期望的独热编码标签集应该是9498 x 24
。因此,使用以下方法转换你的标签:
from keras.utils import to_categoricallabels = to_categorical(labels)
然后你的代码变为:
import kerasfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.utils import to_categoricallabels = to_categorical(labels)# 将数据分割成训练集和测试集X_train, X_test, y_train, y_test = train_test_split(NDVI, labels, test_size=0.15, random_state=42)# 构建模型model = Sequential([ Dense(128, activation='relu', input_shape=(17,),name="layer1"), Dense(64, activation='relu', name="layer2"), Dense(24, activation='softmax', name="layer3"),])print(model.summary())# 编译模型model.compile( optimizer='adam', # 基于梯度的优化器 loss='categorical_crossentropy', # (>2类) metrics=['accuracy'],)# 训练模型model.fit( X_train, # 训练数据 y_train, # 训练目标 epochs=5, batch_size=32,)