在Keras中声明转换序列的input_shape吗?

时间:2018-12-27 16:21:56

标签: python machine-learning keras neural-network nlp

我正在尝试在文本输入上运行神经网络。这是一个二进制分类。到目前为止,这是我的工作代码:

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,因为与我初始化的max_words相对应的类型有100种(可能理解不正确)。我相信初始化input_shape时可能语法错误。

第二个问题是在运行所有这些时出现一条错误消息(很可能带有错误的input_shape)。错误消息突出显示了以下代码行:

 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 个答案:

答案 0 :(得分:1)

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

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

进一步,将X_trainy_train传递到fit_generator(而不是X_train_encodedX_test_encoded)。

答案 1 :(得分:0)

在定义模型输入的那一行中,您错过了两个结束括号)。另外,请确保您提供了激活功能

按如下所示更改代码:

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

编辑:

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