代码之家  ›  专栏  ›  技术社区  ›  rmahesh

在keras中声明转换序列的输入形状?

  •  1
  • rmahesh  · 技术社区  · 6 年前

    我正在尝试对文本输入运行一个神经网络。这是一个二进制分类。以下是迄今为止我的工作代码:

    df = pd.read_csv(pathname, encoding = "ISO-8859-1")
    df = df[['content_cleaned', 'meaningful']] #Content cleaned: text, meaningful: label
    
    X = df['content_cleaned']
    y = df['meaningful']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=21) 
    
    tokenizer = Tokenizer(num_words=100)
    tokenizer.fit_on_texts(X_train)
    X_train_encoded = tokenizer.texts_to_sequences(X_train)
    X_test_encoded = tokenizer.texts_to_sequences(X_test)
    
    max_len = 100
    X_train = pad_sequences(X_train_encoded, maxlen=max_len)
    X_test = pad_sequences(X_test_encoded, maxlen=max_len)
    
    
    batch_size = 100
    max_words = 100
    input_dim = X_train.shape[1]  # Number of features
    model = Sequential()
    model.add(layers.Dense(10, activation='relu', input_shape=X_train.shape[1:]))
    
    
    
    
    model.add(layers.Dense(1, activation='sigmoid'))
    
    model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
    
    history = model.fit(X_train, X_test,
                    batch_size=batch_size,
                    epochs=5,
                    verbose=1,
                    validation_split=0.1)
    

    我的问题分为两部分。第一个是和 input_shape 创建层时。我对声明这个的语法感到困惑。运行此命令时:

    print(X_train.shape)
    

    我的体型是: (3609, 100) .

    据我所知,这告诉我有3609个实例。从其他例子来看,我幼稚的假设是使用100,因为有100种类型(可能理解不正确)对应于 max_words 我初始化的。我相信在初始化 输入形状 .

    第二个问题是在运行所有这些内容时出现错误消息(很可能是错误的 输入形状 )错误消息突出显示这一行代码:

     validation_split=0.1)
    

    错误消息为:

    ValueError: Error when checking target: expected dense_2 to have shape (None, 1) but got array with shape (1547, 1
    

    我是不是不正确地处理这个问题?我对深入学习很陌生。

    2 回复  |  直到 6 年前
        1
  •  1
  •   today    6 年前

    这个 input_shape 参数指定的形状 一个培训样本 . 因此,您需要将其设置为 X_train.shape[1:] (即忽略样品或批次轴):

    model.add(layers.Dense(10, activation='relu', input_shape=X_train.shape[1:]))
    

    此外,通过 X_train y_train fit_generator 而不是 X_train_encoded X_test_encoded )

        2
  •  0
  •   Reza Behzadpour    6 年前

    你错过了 结束括号 ) 在定义模型输入的行。同时确保您提供 激活功能 .

    更改代码如下:

    model.add(layers.Dense(10, activation='relu', input_shape=(X_train.shape[0],)))
    

    编辑:

    对于上一个错误,只需更改 input_shape input_shape=(X_train.shape[0],) .