>上下文 :
我刚刚开始深度学习,我必须在Python中实现一个模型,该模型可以检测两个句子之间的推理(标签是中性的,矛盾的或蕴涵的(。 数据集的格式如下:
| index | sentence_1 | sentence_2 | label |
|------------------------------------------------|
| 1 | blabla | blabla | neutral|
为了完成这项任务,我选择使用看起来相对容易使用的 Keras。 我用手套嵌入向量(dim=50
(对句子进行编码,然后用maxlen=80
填充它们。
我最终得到了一个新的熊猫数据帧:
| index | sentence_1_padded | sentence_2_padded | label | target |
|--------------------------------------------------------------------|--------|
| 1 | matrix 80*50 | matrix 80*50 | neutral | 2 |
| ... | ... | ... | ... | ... |
| 5000 | matrix 80*50 | matrix 80*50 | contradiction| 0 |
每个嵌入的向量和每个序列都是一个 numpy 数组。
我想使用此转换后的数据集训练我的模型。
所以我建立了这个模型:
vocab_size = len(glove_wordmap)+1
X = dataset_processed[['sentence_1_padded', 'sentence_2_padded']]
y = dataset_processed[['target']]
inputs = Input(shape=(2,))
embedding_layer = Embedding(vocab_size, 128)(inputs)
x = LSTM(64)(embedding_layer)
x = Dense(32, activation='relu')(x)
predictions = Dense(3, activation='softmax')(x)
model = Model(inputs=[inputs], outputs=predictions)
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['acc'])
model.fit(X, to_categorical(y), epochs=5, batch_size=32, validation_split=0.25)
并且我有以下错误不断返回:
Train on 3750 samples, validate on 1250 samples
Epoch 1/5
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-248-ddab59c5a43a> in <module>()
----> 1 model.fit(X, to_categorical(y), epochs=5, batch_size=32, validation_split=0.25)
4 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
1176 steps_per_epoch=steps_per_epoch,
1177 validation_steps=validation_steps,
-> 1178 validation_freq=validation_freq)
1179
1180 def evaluate(self,
/usr/local/lib/python3.6/dist-packages/keras/engine/training_arrays.py in fit_loop(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps, validation_freq)
202 ins_batch[i] = ins_batch[i].toarray()
203
--> 204 outs = fit_function(ins_batch)
205 outs = to_list(outs)
206 for l, o in zip(out_labels, outs):
/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs)
2977 return self._legacy_call(inputs)
2978
-> 2979 return self._call(inputs)
2980 else:
2981 if py_any(is_tensor(x) for x in inputs):
/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in _call(self, inputs)
2915 array_vals.append(
2916 np.asarray(value,
-> 2917 dtype=tf.as_dtype(tensor.dtype).as_numpy_dtype))
2918 if self.feed_dict:
2919 for key in sorted(self.feed_dict.keys()):
/usr/local/lib/python3.6/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
ValueError: setting an array element with a sequence.
我已经阅读了这篇文章,但它没有帮助,因为我检查了 X 中元素的尺寸和类型,并且每列中的每个序列都是形状 (80,50( 的 numpy 数组。
我真的很感激能解决我问题的人,或者知道初学者教程的人,可以轻松解决这类问题。
感谢您的帮助!
PS:如果我解决这个问题的开端不好,请随时告诉我
你正在尝试解决句子蕴涵的问题。这意味着您的图形中需要有两个网络流流(即每个句子一个(。主要问题是您已经定义了一个大小为(None,2)
的Input
层。但是您的输入的序列长度为 80(大小可能为(None, 80, 50, 2)
.
另一个问题是,您的sentence_1_padded
和sentence_2_padded
需要(5000,80)
,而不是(5000,80,50)
。因为您的嵌入层需要单词 ID(而不是 GloVe 嵌入(。如果需要 GloVe 嵌入,则需要使用 GloVe 向量初始化Embedding
层。
因此,您需要执行以下更改。
- 定义两个大小为
(80,)
的输入图层 - 为每个输入定义两个输出流,然后将它们连接起来以获得单个预测。
- 与其将
sentence_1_padded
和setence_2_padded
作为80x50
元素(在执行嵌入查找后(,不如将它们作为序列长度的单词 ID(80)
- 例如,在执行
data['sentence_1_padded']
时执行这些更改后,它应返回一个(5000, 80)
矩阵。
# Toy data (dataset size 250)
# X1 = np.random.randint(0,100,size=(250,80))
# X2 = np.random.randint(0,100,size=(250,80))
# y = np.random.choice([0,1,2], size=(250,))
X = [dataset_processed['sentence_1_padded'], dataset_processed['sentence_2_padded']]
inputs1 = Input(shape=(80,))
inputs2 = Input(shape=(80,))
embedding_layer = Embedding(vocab_size, 128)
emb_out1 = embedding_layer(inputs1)
emb_out2 = embedding_layer(inputs2)
lstm_layer = LSTM(64)
x1 = lstm_layer(emb_out1)
x2 = lstm_layer(emb_out2)
dense = Dense(32, activation='relu')
x1 = dense(x1)
x2 = dense(x2)
x = Concatenate(axis=-1)([x1,x2])
predictions = Dense(3, activation='softmax')(x)
model = Model(inputs=[inputs1, inputs2], outputs=predictions)
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['acc'])
model.fit(X, to_categorical(y), epochs=5, batch_size=32, validation_split=0.25)