Keras : 值错误 : 使用序列设置数组元素



>上下文 :

我刚刚开始深度学习,我必须在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_paddedsentence_2_padded需要(5000,80),而不是(5000,80,50)。因为您的嵌入层需要单词 ID(而不是 GloVe 嵌入(。如果需要 GloVe 嵌入,则需要使用 GloVe 向量初始化Embedding层。

因此,您需要执行以下更改。

  • 定义两个大小为(80,)的输入图层
  • 为每个输入定义两个输出流,然后将它们连接起来以获得单个预测。
  • 与其将sentence_1_paddedsetence_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)

最新更新