我正在研究一个二元分类的情感分析问题。这些是一些可能有用的参数:
1.) 火车列表的长度 = 203
2.) 测试列表的长度 = 51
3.) 词汇量 = 20,000
4.) 句子长度 = 35
5.) 嵌入层的维度 = 50
首先 I One 对训练和测试进行热编码,以便将文本数据编码为整数。然后我pad_sequences用来将所有文本转换为相同的长度(35)。然后我使用一个Embedding图层将我的文本转换为维度为 50 的矢量表示,然后应用一个LSTM图层,最后应用一个Dense具有sigmoid激活函数的图层。这是代码:
# convert into one hot representation
ohr_train = [one_hot(i, vocab_size) for i in train_x2]
ohr_test = [one_hot(i, vocab_size) for i in test_x2]
# pad the text
sent_len = 35
train_embedded_docs = pad_sequences(ohr_train, padding = 'pre', maxlen = sent_len)
test_embedded_docs = pad_sequences(ohr_test, padding = 'pre', maxlen = sent_len)
# model architecture
dimension = 50
model = Sequential()
model.add(Embedding(vocab_size, dimension, input_length = 35))
model.add(LSTM(units = 50, activation = 'leaky_relu', kernel_initializer = 'he_uniform'))
model.add(Dropout(0.2))
model.add(Dense(1, activation = 'sigmoid', kernel_initializer = 'glorot_uniform'))
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
print(model.summary())
# converting to array
X_train_final = np.array(train_embedded_docs)
X_test_final = np.array(test_embedded_docs)
y_train_final = np.array(train_y1)
y_test_final = np.array(test_y1)
#fit and evaluate the model
model.fit(X_train_final, y_train_final, validation_split = 0.2, batch_size=32, epochs = 10)
model.evaluate(X_test_final, y_test_final)
现在这工作正常,但是当我尝试使用 调整 HP 时KerasTuner,我得到一个错误ValueError: Exception encountered when calling layer sequential (type Sequential). Input 0 of layer "lstm" is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (None, 35)
Call arguments received:
• inputs=tf.Tensor(shape=(None, 35), dtype=int32)
• training=True
• mask=None`
这是我的KerasTuner功能:
# TUNE THE NUMBER OF LAYERS, NEURONS, LEARNING RATE OF THE NEURAL NET
def build_model(hp):
model = Sequential()
for i in range(hp.Int('LSTM Layers', min_value = 1, max_value = 3)):
model.add(LSTM(hp.Int('units', min_value = 32, max_value = 512, step = 32)))
model.add(Dense(units = 1, activation = 'sigmoid', kernel_initializer='glorot_uniform'))
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=hp.Float('lr', min_value = 1e-4, max_value = 1e-2, sampling = 'log')),
loss = 'binary_crossentropy', metrics = ['accuracy'])
return model
tuner = kt.RandomSearch(
build_model,
kt.Objective('val_loss', direction = 'min'),
max_trials=30, seed = 69)
tuner.search(X_train_final, y_train_final, epochs=5, batch_size = 32, validation_data=(X_test_final, y_test_final))
当它在训练中工作得非常好时,为什么它要求 3 个维度进行调整?