我可以在神经网络中使用不同长度的输入数据吗?

时间:2018-05-21 19:01:52

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

我想用机器学习方法编码输入字符串。目前,我的列车数据以这种方式显示:

  score     text
    1   show photos
    1   show photos
    2   who are you

正如您所看到的,所有文本都具有相同的长度。在底部是我的源代码。我想知道是否可以使用不同长度的载体?例如:

  score     text
    1   show my photos
    1   show me my photos
    2   can you tell me who are you?

源代码:

train_set = pd.read_csv("train3.tsv", sep="\t", header = None, names=['score', 'text'], skip_blank_lines=False, quoting=csv.QUOTE_NONE, error_bad_lines=False)
test_set = pd.read_csv("test.tsv", sep="\t", header = None, names=['text'], skip_blank_lines=False, quoting=csv.QUOTE_NONE, error_bad_lines=False)

dictionary = {}
i=0

for index, row in train_set.iterrows():

    list2 = list(row.text.lower())

    for n, key in enumerate(list2):

        if key in dictionary:

            list2[n] = dictionary[key]

        else:

            dictionary[key] = i
            list2[n] = i
            i += 1

    train_set.set_value(index,'text', list2)


for index, row in test_set.iterrows():

    list2 = list(row.text.lower())

    for n, key in enumerate(list2):

        if key in dictionary:

            list2[n] = dictionary[key]

        else:

            dictionary[key] = i
            list2[n] = i
            i += 1

    test_set.set_value(index,'text', list2)

# Create first network with Keras

score = np.array([np.array(xi) for xi in train_set.score.values.tolist()])

text = np.array([np.array(xi) for xi in train_set.text.values.tolist()])

test = np.array([np.array(xi) for xi in test_set.text.values.tolist()])

# create model
model = Sequential()
model.add(Dense(12, input_dim=11, init='uniform'))
model.add(Dense(11, init='uniform'))
model.add(Dense(1, init='uniform'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(text, score, epochs=150, batch_size=10,  verbose=2)
# calculate predictions
predictions = model.predict(test)
print(predictions)

2 个答案:

答案 0 :(得分:0)

是的,你可以有不同的长度;但是,您需要一个可以处理不同长度的图层。例如,您可以使用LSTM处理不同长度的句子,方法是设置input_shape=(None, vocab_size) None表示未知单词数。

您还需要使用utils中的pad_sequences将序列填充到相同的长度。然后,您需要使用Masking图层告诉LSTM要跳过这些条目。如果你只是设置为-1而不是掩码,那么你将根据训练集中句子的长度引入偏差。

答案 1 :(得分:-1)

您的输入必须始终具有相同的大小。所以你可以做的是在较小的输入结束时插入一个值(让我们说-1)。然后神经网络将解决它并处理它。