Keras ValueError:使用输入尺寸2索引超出范围;对于';crf_1/跨步_切片

Keras ValueError:使用输入尺寸2索引超出范围;对于';crf_1/跨步_切片,keras,lstm,crf,Keras,Lstm,Crf,我试图在BiLSTM之后实现crf而不是softmax,我使用keras_contrib来获得crf。我想我在数组的尺寸上犯了一些错误,但我无法修复它。 以下是代码: # preds = Dense(num_label, activation='softmax')(out) # preds_binary = Dense(2, activation='softmax')(out) ''' test 1 ''' preds = kcl.CRF(num_label, sparse_targ

我试图在BiLSTM之后实现crf而不是softmax,我使用
keras_contrib
来获得crf。我想我在数组的尺寸上犯了一些错误,但我无法修复它。 以下是代码:

 # preds = Dense(num_label, activation='softmax')(out)
 # preds_binary = Dense(2, activation='softmax')(out)
 '''
 test 1
 '''
 preds = kcl.CRF(num_label, sparse_target=True)(out)
 preds_binary = kcl.CRF(2, sparse_target=True)(out)
以下是错误消息:

ValueError: Index out of range using input dim 2; input has only 2 dims for 'crf_1/strided_slice' (op: 'StridedSlice') with input shapes: [?,5], [3], [3], [3] and with computed input tensors: input[3] = <1 1 1>.
ValueError:使用输入尺寸2索引超出范围;“crf_1/跨步_切片”(op:“跨步切片”)的输入只有2个DIM,输入形状为:[?、5]、[3]、[3]、[3],计算输入张量为:输入[3]=。

这里有人能帮我吗?

@giser\u yugang这是我的密码: num_标签=5

train\u数组=[X\u train,POS1\u train,POS2\u train]
test_数组=[X_测试,POS1_测试,POS2_测试]
列车标签=[Y列车,二进制列车]
test\u label=[Y\u test,binary\u label\u test]
x检验药物、x检验药物、y检验药物、y检验药物=pd.拆分药物(id检验、x检验、y检验、POS1检验、POS2检验、,
二进制(标记(测试)
打印(“\n x检验药物[0]的形状:”,x检验药物[0]。形状,'\n')
打印(“\n x\u测试医学[0]的形状:”,x\u测试医学[0]。形状,'\n')
打印(“加载word2vec…”)
len_dic,嵌入矩阵=ld.加载单词矩阵(手套目录,
MAX_NB_单词,
单词索引,
嵌入(U DIM)
打印(“创建单词嵌入层…”)
嵌入层=嵌入层,
他说,,
权重=[嵌入矩阵],
输入长度=最大序列长度,
可培训=真实)
打印(“创建位置嵌入层…”)
位置\u em\u尺寸=10
位置嵌入矩阵=np.随机.均匀(-0.1,0.1,大小=(400,位置em\u尺寸))
打印(“嵌入矩阵的形状”,嵌入矩阵的形状)
pos_嵌入层=嵌入(400,
位置_em _dim,
权重=[pos_嵌入矩阵],
输入长度=最大序列长度,
可培训=真实)
打印('创建模型…')
序列输入=输入(形状=(最大序列长度),数据类型='int32')
单词\u嵌入\u序列=嵌入\u层(序列\u输入)
pos1\u序列\u输入=输入(形状=(最大序列长度,),数据类型='int32')
pos1_嵌入_序列=pos_嵌入_层(pos1_序列_输入)
pos2\u序列\u输入=输入(形状=(最大序列长度,),数据类型='int32')
pos2_嵌入_序列=pos_嵌入_层(pos2_序列_输入)
#embedded_sequences=合并([word_embedded_sequences,pos1_embedded_sequences,pos2_embedded_sequences],
#模式(='concat')
嵌入的\u序列=串联([word\u嵌入的\u序列,pos1\u嵌入的\u序列,pos2\u嵌入的\u序列],轴=-1)
'''
#请注意,添加位置添加最后两个
'''
嵌入式_序列=辍学(0.3)(嵌入式_序列)
lstm_正向,lstm_反向=双向,
辍学率=0.3,
return_sequences=True,
U_正则化器=正则化器.l2(0.0001)),
合并\u模式=无(嵌入式\u序列)
#lstm_forward=lstm(150,dropout_W=0.2,dropout_=0.2,return_sequences=True)(嵌入式_sequences)
#lstm_backword=lstm(150,辍学_W=0.2,辍学_=0.2,返回_序列=True,返回_序列=True)(嵌入式_序列)
翻转_层=λ(λx:K.反向(x,1),输出_形状=λx:(x[0],x[1],x[2]))
翻转\u层。支持\u掩蔽=真
lstm_backword=翻转层(lstm_backword_reverse)
#lstm_序列=合并([lstm_正向,lstm_反向),模式='concat',concat_轴=-1)
lstm_序列=串联([lstm_正向,lstm_反向字],轴=-1)
#pos_feature=merge([pos1_嵌入序列,pos2_嵌入序列],mode='concat',concat_轴=-1)
pos_Feature=连接([pos1_嵌入序列,pos2_嵌入序列],轴=-1)
pos_feature=时间分布(稠密(20,init='he_normal'))(pos_feature)
h_特征=时间分布(密集(隐藏尺寸*2))(lstm_序列)
#附件特性=合并([h\U特性,位置特性],模式='concat',concat\u轴=-1)
att_特性=连接([h_特性,位置特性],轴=-1)
权重=注意力权重2(name='attention')(att_功能)
权重\重复=重复向量(隐藏的\尺寸*2)(权重)
权重重复次数=排列((2,1))(权重重复次数)
#mul=merge([lstm\u序列,权重每重复一次],模式=mul')
mul=乘法([lstm\u序列,权重\u重复\u每])
sumpool=Lambda(Lambda x:K.sum(x,axis=1,keepdims=False),output_shape=Lambda x:(x[0],x[2]))
sumpool.supports_masking=True
att_out=sumpool(mul)
lastout=Lambda(切片,输出形状=Lambda x:(x[0],x[2]),参数={'index':-1})
lstm_last_forward=lastout(lstm_forward)
lstm_last_backward=lastout(lstm_backword)
#lstm_last=合并([lstm_last_forward,lstm_last_backward],mode='concat')
lstm_last=连接([lstm_last_向前,lstm_last_向后],轴=-1)
att_out=密集(隐藏尺寸*2)(att_out)
lstm\U last=密集(隐藏尺寸*2)(lstm\U last)
#out=合并([att\u out,lstm\u last],mode='sum')
out=添加([att\u out,lstm\u last])
辍学=辍学(0.5)(辍学)
out=激活(Activation='tanh')(out)
preds=密集(num_标签,activation='softmax')(out)
preds_二进制=密集(2,激活='softmax')(输出)
'''
测试1
'''
preds=kcl.CRF(num_标签,稀疏目标=True)(输出)
preds_binary=kcl.CRF(2,稀疏目标