【发布时间】:2019-01-31 04:17:38
【问题描述】:
这是我的代码:
cnn_input = Input(shape=(cnn_max_length,))
emb_output = Embedding(num_chars + 1, output_dim=32, input_length=cnn_max_length, trainable=True)(cnn_input)
output = TimeDistributed(Convolution1D(filters=128, kernel_size=4, activation='relu'))(emb_output)
我想训练一个字符级 CNN 序列标注器,但一直收到此错误:
Traceback (most recent call last):
File "word_lstm_char_cnn.py", line 24, in <module>
output = kl.TimeDistributed(kl.Convolution1D(filters=128, kernel_size=4, activation='relu'))(emb_output)
File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/keras/engine/base_layer.py", line 457, in __call__
output = self.call(inputs, **kwargs)
es/keras/layers/wrappers.py", line 248, in call
y = self.layer.call(inputs, **kwargs)
File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/keras/layers/convolutional.py", line 160, in call
dilation_rate=self.dilation_rate[0])
File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 3526, in conv1d
data_format=tf_data_format)
File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 779, in convolution
data_format=data_format)
File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 828, in __init__
input_channels_dim = input_shape[num_spatial_dims + 1]
File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/tensorflow/python/framework/tensor_shape.py", line 615, in __getitem__
return self._dims[key]
IndexError: list index out of range
输入应该是 3D 的。如果我更改输入形状,我会收到此错误:
ValueError: Input 0 is incompatible with layer time_distributed_1: expected ndim=3, found ndim=4
【问题讨论】:
-
我想你和这个question有同样的问题。看看提供的答案是否能解决您的问题。
-
谢谢。其实我想实现一个字符级的 CNN 序列标注器。如果我想实现一个词级 LSTM 序列标记器,我只需传递 return_sequences=True 并且我有我所有的时间步(词)。但我不知道如何使用 char 级 CNN 来做到这一点。换句话说,我希望输出形状为 (None, num_words, filter_size),但它是 (None, 121, filter_size)。
-
更准确地说:嵌入层的输出形状为
(None, cnn_max_length, 32)。现在你想用这个输出张量做什么?你想在上面应用什么样的操作/层?另外,整个模型的输出将是序列中每个字符的标签,即标签的形状为(None, cnn_max_length, num_tags),假设标签是一次性编码的? -
没错。我希望 conv 层仅在最后一个维度上进行卷积,将 cnn_max_length (num_words) 维度视为时间步长。
-
cnn_max_length = num_tags = sentence_len(填充)。密集层是时间分布的。整个模型的输出是每个单词一个 teg。
标签: keras conv-neural-network keras-layer keras-2