使用 4 维数据的 keras 双向层
keras Bidirectional layer using 4 dimension data
我正在设计基于文章数据进行分类的 keras 模型。
我有如下 4 维数据
[batch, article_num, word_num, word embedding size]
我想将每个(word_num,词嵌入)数据馈送到 keras 双向层
为了获得 3 维的结果,如下所示。
[batch, article_num, bidirectional layer output size]
当我尝试像这样输入 4 维数据进行测试时
inp = Input(shape=(article_num, word_num, ))
# dims = [batch, article_num, word_num]
x = Reshape((article_num * word_num, ), input_shape = (article_num, word_num))(inp)
# dims = [batch, article_num * word_num]
x = Embedding(word_num, word_embedding_size, input_length = article_num * word_num)(x)
# dims = [batch, article_num * word_num, word_embedding_size]
x = Reshape((article_num , word_num, word_embedding_size),
input_shape = (article_num * word_num, word_embedding_size))(x)
# dims = [batch, article_num, word_num, word_embedding_size]
x = Bidirectional(CuDNNLSTM(50, return_sequences = True),
input_shape=(article_num , word_num, word_embedding_size))(x)
我得到了错误
ValueError: Input 0 is incompatible with layer bidirectional_12: expected ndim=3, found ndim=4
我怎样才能做到这一点?
如果您不希望它触及 article_num
维度,您可以尝试使用 TimeDistributed
包装器。但我不确定它是否与双向和其他东西兼容。
inp = Input(shape=(article_num, word_num))
x = TimeDistributed(Embedding(word_num, word_embedding_size)(x))
#option 1
#x1 shape : (batch, article_num, word_num, 50)
x1 = TimeDistributed(Bidirectional(CuDNNLSTM(50, return_sequences = True)))(x)
#option 2
#x2 shape : (batch, article_num, 50)
x2 = TimeDistributed(Bidirectional(CuDNNLSTM(50)))(x)
提示:
- 不要到处使用
input_shape
,你只需要在Input
张量处使用。
- 如果您还在嵌入中使用
TimeDistributed
,您可能不需要任何整形。
- 如果您不想在最终维度中使用
word_num
,请使用 return_sequences=False
。
我正在设计基于文章数据进行分类的 keras 模型。
我有如下 4 维数据
[batch, article_num, word_num, word embedding size]
我想将每个(word_num,词嵌入)数据馈送到 keras 双向层
为了获得 3 维的结果,如下所示。
[batch, article_num, bidirectional layer output size]
当我尝试像这样输入 4 维数据进行测试时
inp = Input(shape=(article_num, word_num, ))
# dims = [batch, article_num, word_num]
x = Reshape((article_num * word_num, ), input_shape = (article_num, word_num))(inp)
# dims = [batch, article_num * word_num]
x = Embedding(word_num, word_embedding_size, input_length = article_num * word_num)(x)
# dims = [batch, article_num * word_num, word_embedding_size]
x = Reshape((article_num , word_num, word_embedding_size),
input_shape = (article_num * word_num, word_embedding_size))(x)
# dims = [batch, article_num, word_num, word_embedding_size]
x = Bidirectional(CuDNNLSTM(50, return_sequences = True),
input_shape=(article_num , word_num, word_embedding_size))(x)
我得到了错误
ValueError: Input 0 is incompatible with layer bidirectional_12: expected ndim=3, found ndim=4
我怎样才能做到这一点?
如果您不希望它触及 article_num
维度,您可以尝试使用 TimeDistributed
包装器。但我不确定它是否与双向和其他东西兼容。
inp = Input(shape=(article_num, word_num))
x = TimeDistributed(Embedding(word_num, word_embedding_size)(x))
#option 1
#x1 shape : (batch, article_num, word_num, 50)
x1 = TimeDistributed(Bidirectional(CuDNNLSTM(50, return_sequences = True)))(x)
#option 2
#x2 shape : (batch, article_num, 50)
x2 = TimeDistributed(Bidirectional(CuDNNLSTM(50)))(x)
提示:
- 不要到处使用
input_shape
,你只需要在Input
张量处使用。 - 如果您还在嵌入中使用
TimeDistributed
,您可能不需要任何整形。 - 如果您不想在最终维度中使用
word_num
,请使用return_sequences=False
。