繁体   English   中英

顺序 Keras 模型的设置形状和输入形状的混淆

[英]Confusion in setting shape and input shape of a sequential Keras model

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

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)

我在这里做错了什么?

您的输入形状只是 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 这背后的直觉可以在这里找到。

暂无
暂无

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

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