【问题标题】:Confusion in setting shape and input shape of a sequential Keras model顺序 Keras 模型的设置形状和输入形状的混淆
【发布时间】:2021-10-22 00:21:13
【问题描述】:

我有一个数据集,其方案如下:

X1 ... X20 C

前 20 列是输入数据,最后一列是目标数据。数据集包括 2000 条记录。我想设计一个顺序 Keras 模型来对那些目标标签(从 1 到 10 不等,因此是多标签分类问题)进行分类。假设我已经将这些输入数据和标签保存在 X_train_1y_train_1 中,这是我的模型:

def build_model_1(n_hidden = 1, n_neurons = 30, learning_rate = 3e-3, input_shape = X_train_1.shape):
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.InputLayer(input_shape=input_shape))
    model.add(tf.keras.layers.BatchNormalization(momentum=0.999))
    for layer in range(n_hidden):
        model.add(tf.keras.layers.Dense(n_neurons, tf.keras.activations.selu,
                                        kernel_initializer="lecun_normal",
                                        kernel_regularizer= tf.keras.regularizers.l2(0.01)))
        model.add(tf.keras.layers.BatchNormalization(momentum=0.999))
    model.add(tf.keras.layers.Dense(10, tf.keras.activations.softmax, kernel_initializer="lecun_normal"))
    loss = tf.keras.losses.categorical_crossentropy
    optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate, beta_1=0.9, beta_2=0.999)
    metric = [tf.keras.metrics.Accuracy()]
    model.compile(loss = loss, optimizer=optimizer, metrics=[metric])
    return model

我认为输入的形状应该是我的训练数据集的形状,但是当我编译并拟合我的模型时,我收到以下错误:

ValueError: Input 0 of layer sequential_12 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (32, 20)

我在这里做错了什么?

【问题讨论】:

  • 输入形状不包含批次/样本维度。
  • @Dr.Snoopy:我的数据只是所有条目中的数字。那么,我应该输入什么作为样本维度?

标签: python tensorflow keras


【解决方案1】:

您的输入形状只是 20,因为您有 20 个特征和 2000 个样本。您不必提供批量大小。这是一个工作示例:

import tensorflow as tf
import numpy as np

def build_model_1(n_hidden = 1, n_neurons = 30, learning_rate = 3e-3, input_shape = (20,)):
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.InputLayer(input_shape=input_shape))
    model.add(tf.keras.layers.BatchNormalization(momentum=0.999))
    for layer in range(n_hidden):
        model.add(tf.keras.layers.Dense(n_neurons, tf.keras.activations.selu,
                                        kernel_initializer="lecun_normal",
                                        kernel_regularizer= tf.keras.regularizers.l2(0.01)))
        model.add(tf.keras.layers.BatchNormalization(momentum=0.999))
    model.add(tf.keras.layers.Dense(10, tf.keras.activations.softmax, kernel_initializer="lecun_normal"))
    loss = tf.keras.losses.categorical_crossentropy
    optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate, beta_1=0.9, beta_2=0.999)
    metric = [tf.keras.metrics.Accuracy()]
    model.compile(loss = loss, optimizer=optimizer, metrics=[metric])
    return model

train_data = np.random.random((2000, 20))
model = build_model_1()
y = model(train_data)

另外,问问自己是否真的在处理多标签分类问题。数据集中的样本可以属于多个类,还是这些类互斥?如果类不是互斥的,我建议将输出层的激活函数更改为sigmoid,并将损失函数更改为binary_crossentropy。这背后的直觉可以在here找到。

【讨论】:

  • 感谢您的回答。当我使用我的数据运行代码时,出现以下错误:tensorflow.python.framework.errors_impl.InvalidArgumentError: Received a label value of 10 which is outside the valid range of [0, 10). Label values: 5 1 1 10 1 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 2 2 7 [[node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits....
  • ....一旦我将最后一层的神经元数量设置为11,错误就消失了。我的标签确实从 1 到 10 不等。但是,网络似乎也自动将 0 考虑在内。你知道我应该怎么做才能让 10 个神经元工作(因为我的标签集中没有 0)吗?
  • 换句话说,如何将范围 [0,10) 更改为 [1,10]?
  • 无论如何,我只是通过减少每个标签以将它们设置在 [0,10) 范围内来解决这个问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2017-06-30
  • 2017-12-24
  • 2020-09-26
  • 2019-01-26
相关资源
最近更新 更多