简体   繁体   English

keras ANN 中的输入和 output 形状

[英]Input and output shapes in keras ANN

I am trying to implement an ANN using keras for multiclass classification task.我正在尝试使用 keras 为多类分类任务实现 ANN。 This is my dataset:这是我的数据集:

  1. features shape (9498, 17)特征形状 (9498, 17)
  2. labels shape (9498,)标签形状 (9498,)

where 9498 is the number of pixels and 17 is the number of timestamps, and I have 24 classes that I want to predict.其中 9498 是像素数,17 是时间戳数,我有 24 个要预测的类。 I wanted to start with something very basic.我想从一些非常基本的东西开始。 This is the code I used:这是我使用的代码:

import keras
from keras.models import Sequential
from keras.layers import Dense
# Loading the data
X_train, X_test, y_train, y_test = train_test_split(NDVI, labels, test_size=0.15, random_state=42)

# Building the model
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())


# Compiling the model
model.compile(
  optimizer='adam',                              # gradient-based optimizer
  loss='categorical_crossentropy',               # (>2 classes)
  metrics=['accuracy'],
)

# Training the model
model.fit(
  X_train, # training data
  y_train, # training targets
  epochs=5,
  batch_size=32,
)

Which results in the following error:这会导致以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-2f4cf6510b24> in <module>()
     23   y_train, # training targets
     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         # Prepare validation data.

/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,  # Don't enforce the batch size.
--> 621                 exception_prefix='target')
    622 
    623             # Generate sample-wise weight values given the `sample_weight` and

/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,)

I don't know why this error pops.我不知道为什么会弹出这个错误。 Also, I don't seem to understand the input and output shapes in keras even though I checked other similar posts that tackle the same topic.此外,我似乎不理解 keras 中的输入和 output 形状,即使我查看了其他解决同一主题的类似帖子。

EDIT: Here is a quick look into my labels:编辑:这是我的标签的快速浏览:

快速查看我的标签

Should I do like one hot encoding?我应该喜欢一种热编码吗?

So the problem here is that your labels data is a one dimensional vector of shape (9498,).所以这里的问题是您的标签数据是形状的一维向量(9498,)。 This means that the number of output labels is 1, and this would be a regression problem because you are predicting only one value.这意味着 output 标签的数量为 1,这将是一个回归问题,因为您只预测一个值。

On the other hand we can see that that vector contains 24 different categories of labels and this is where you would like to model a multi-classifier.另一方面,我们可以看到该向量包含 24 个不同类别的标签,这就是您希望 model 多分类器的地方。 So what you have to do first of all is to convert each value in the labels vector into a 24 dimensional vector.所以你首先要做的就是将labels向量中的每一个值转换成一个24维向量。 You can do this for instance by using the scikit-learn LabelBinarizer and here is how it works basically:例如,您可以使用scikit-learn LabelBinarizer来执行此操作,它的工作原理如下:

from sklearn.preprocessing import LabelBinarizer

binarizer = LabelBinarizer()
labels = binarizer.fit_transform(labels)
print("binarized_labels.shape:", labels.shape) #-> should now return (9498, 24)

And now you can feed it to your model现在你可以把它喂给你的 model

Here's maybe a complete solution:这可能是一个完整的解决方案:

from sklearn.preprocessing import LabelBinarizer

import keras
from keras.models import Sequential
from keras.layers import Dense

# Loading the data
X_train, X_test, y_train, y_test = train_test_split(NDVI, labels, test_size=0.15, random_state=42)

# Binarize the output to have 24 class labels
binarizer = LabelBinarizer()
y_train = binarizer.fit_transform(y_train)
y_test = binarizer.transform(y_test) #N.B. here you neeed only to use '.transform()' rather that '.fit_transform()'


# Building the model
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())


# Compiling the model
model.compile(
  optimizer='adam',                              # gradient-based optimizer
  loss='categorical_crossentropy',               # (>2 classes)
  metrics=['accuracy'],
)

# Training the model
model.fit(
  X_train, # training data
  y_train, # training targets
  epochs=5,
  batch_size=32,
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM