索引2不在[0, 1)范围内

我正在进行一个seq2sql项目,我成功构建了一个模型,但在训练时遇到了错误。我没有使用任何Keras嵌入层。

M=13 #问题长度
d=40 #LSTM的维度
C=12 #表列数
batch_size=9
inputs1=Input(shape=(M,100),name='question_token')
Hq=Bidirectional(LSTM(d,return_sequences=True),name='QuestionENC')(inputs1) #这是HQ,形状为(num_samples,13,80)
inputs2=Input(shape=(C,3,100),name='col_token')
col_lstm_layer=Bidirectional(LSTM(d,return_sequences=False),name='ColENC')
def hidd(te):
    t=tf.Variable(initial_value=1,dtype=tf.int32)
    for i in range(batch_size):
          t=tf.assign(t,i)
        Z = tf.nn.embedding_lookup(te, t)
        print(col_lstm_layer(Z))
        h=tf.reshape(col_lstm_layer(Z),[1,C,d*2])
        if i==0:
#             cols_last_hidden=tf.Variable(initial_value=h)
            cols_last_hidden=tf.stack(h)
#这是因为如果我们在这里使用tf.Variable会报错
        else:
            cols_last_hidden=tf.concat([cols_last_hidden,h],0)
#这个的形状是(num_samples,num_col,80),80是每列的最后编码
    return cols_last_hidden
cols_last_hidden=Lambda(hidd)(inputs2)
Hq=Dense(d*2,name='QuestionLastEncode')(Hq)
I=tf.Variable(initial_value=1,dtype=tf.int32)
J=tf.Variable(initial_value=1,dtype=tf.int32)
K=1
def get_col_att(tensors):
    global K,all_col_attention
    if K:
        t=tf.Variable(initial_value=1,dtype=tf.int32)
        for i in range(batch_size):
            t=tf.assign(t,i)
            x = tf.nn.embedding_lookup(tensors[0], t)
    #         print("tensors[1]:",tensors[1])
            y = tf.nn.embedding_lookup(tensors[1], t)
    #         print("x shape",x.shape,"y shape",y.shape)
            y=tf.transpose(y)
#             print("x shape",x.shape,"y",y.shape)
            Ecol=tf.reshape(tf.transpose(tf.tensordot(x,y,axes=1)),[1,C,M])
            if i==0:
 #                 all_col_attention=tf.Variable(initial_value=Ecol,name=""+i)
                all_col_attention=tf.stack(Ecol)
            else:
                all_col_attention=tf.concat([all_col_attention,Ecol],0)
    K=0
    print("all_col_attention",all_col_attention)
    return all_col_attention
total_alpha_sel_lambda=Lambda(get_col_att,name="Alpha")([Hq,cols_last_hidden])
total_alpha_sel=Dense(13,activation="softmax")(total_alpha_sel_lambda)
# print("Hq",Hq," total_alpha_sel_lambda shape",total_alpha_sel_lambda," total_alpha_sel shape",total_alpha_sel.shape)
def get_EQcol(tensors):
     global K
    if K:
        t=tf.Variable(initial_value=1,dtype=tf.int32)
        global all_Eqcol
        for i in range(batch_size):
            t=tf.assign(t,i)
            x = tf.nn.embedding_lookup(tensors[0], t)
            y = tf.nn.embedding_lookup(tensors[1], t)
            Eqcol=tf.reshape(tf.tensordot(x,y,axes=1),[1,C,d*2])
            if i==0:
#                 all_Eqcol=tf.Variable(initial_value=Eqcol,name=""+i)
                all_Eqcol=tf.stack(Eqcol)
            else:
                all_Eqcol=tf.concat([all_Eqcol,Eqcol],0)
    K=0
    print("all_Eqcol",all_Eqcol)
    return all_Eqcol
K=1
EQcol=Lambda(get_EQcol,name='EQcol')([total_alpha_sel,Hq])
#total_alpha_sel(12x13) Hq(13xd*2)
EQcol=Dropout(.2)(EQcol)
L1=Dense(d*2,name='L1')(cols_last_hidden)
L2=Dense(d*2,name='L2')(EQcol)
L1_plus_L2=Add()([L1,L2])
pre=Flatten()(L1_plus_L2)
Psel=Dense(12,activation="softmax")(pre)
model=Model(inputs=[inputs1,inputs2],outputs=Psel)
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
model.summary()
earlyStopping=EarlyStopping(monitor='val_loss', patience=7, verbose=0, mode='auto')
history=model.fit([Equestion,Col_Embeddings],y_train,epochs=50,validation_split=.1,shuffle=False,callbacks=[earlyStopping],batch_size=batch_size)

Equestion、Col_Embeddings和y_train的形状分别为(10, 12, 3, 100)、(10, 13, 100)和(10, 12)。

我搜索了这个错误,但在所有情况下,他们都是错误地使用了嵌入层。这里即使我没有使用嵌入层,也会遇到这个错误。

indices = 2 is not in [0, 1)[[{{node lambda_3/embedding_lookup_2}} = GatherV2[Taxis=DT_INT32, Tindices=DT_INT32, Tparams=DT_FLOAT, _class=["loc:@col_token_2"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_col_token_2_0_1, lambda_3/Assign_2, lambda_3/embedding_lookup_2/axis)]]

回答:

这里的问题是批量大小是在图形级别定义的。我在这里为图形使用了batch_size =9,是的,我通过验证分割.1获得了9的训练批量大小,对于完整批量大小10,但对于验证我只留下了一个样本,因为10*.1是一个。

因此,批量大小为1不能传递给需要批量大小为9的图形。这就是为什么会出现这个错误。

至于解决方案,我将batch_size设置为1,然后它工作得很好,并且通过使用batch_size=1也获得了不错的准确率。

希望这对某人有帮助。

祝好…

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注