微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我使用 Transformer 模型训练翻译器时,为什么它不能将 y 转换为张量

如何解决当我使用 Transformer 模型训练翻译器时,为什么它不能将 y 转换为张量

def encoder():
    input_layer = Input(batch_shape=(None,13,128))
    h= layer(input_layer)
    h= Masking(mask_value=0.0)(h)
    h,hidden_layer,cell_layer = LSTM(512,return_state=True)(h)
    model = Model(inputs = input_layer,outputs = [hidden_layer,cell_layer])
    return model
model=encoder()
model.summary()

class Decoder(Model):
    def __init__(self):
        super(Decoder,self).__init__()
        self.embedding_layer = Embedding(input_dim=max_tokens+1,output_dim=128,mask_zero=True)
        self.lstm_layer = LSTM(512,return_state=True,return_sequences=True)
        self.dense_layer = Dense(units=max_tokens+1)
    def call(self,inputer,hidden_layer=None,cell_layer=None):
        x=self.embedding_layer(inputer)
        if hidden_layer!=None and cell_layer!=None:
            x,h,c = self.lstm_layer(x,initial_state=[hidden_layer,cell_layer])
        else:
             x,c = self.lstm_layer(x)
        x=self.dense_layer(x)
        return x,c
        
decoder=Decoder()
for eng,germ in train.take(1):
    y,hidden,cell = decoder(germ)
@tf.function
def loss_fn(en_input,germ_input,germ_output,loss):
    with tf.GradientTape() as tape:
        enc_hidden_s,enc_cell_s = model(en_input)
        dec_output,dec_hidden_s,dec_cell_s = decoder(germ_input,enc_hidden_s,enc_cell_s)
        loss_value = loss(germ_output,dec_output)
        return loss_value,tape.gradient(loss_value,variables)
 
def fit_german_shape(german):
    input_data = german[:,:-1]
    output_data = german[:,1:]
    return input_data,output_data
def training(train_data,test_data,optimizer,loss,epochs=5):
    batch_num=0
    batch_num2=0
    epoch_loss=0
    epoch_loss2=0
    for english,germany in train:
        germany_in,germany_out=fit_german_shape(germany)
        loss2,grad= loss_fn(english,germany_in,germany_out,loss)
        optimizer.apply_gradients(zip(grad,model.trainable_variables + decoder.trainable_variables))
        epoch_loss=epoch_loss+loss2
        batch_num=batch_num+1
        avg_loss=epoch_loss/batch_num
        avg_loss3=String(avg_loss1)
        print("In this train epoch,the loss is"+ave_loss3)
    for english2,germany2 in test:
        germany_in2,germany_out2=fit_german_shape(germany2)
        hidden_state,cell_state=model(en)
        pred,temp1,temp2=decoder(germany_in2,hidden_state,cell_state)
        loss,temp3 = loss_fn(english2,germany_in2,germany_out2)
        epoch_loss2=loss+epoch_loss2
        batch_num=batch_num+1
        avg_loss2=epoch_loss2/batch_num2
        avg_loss4=String(avg_loss2)
        print("In this test epoch,the loss is"+ave_loss4)
    return avg_loss,avg_loss2

当我使用这个模型将德语翻译成英语时,它报告错误“试图将 'y' 转换为张量并失败。错误不支持任何值。”解码器中可能会发生错误为 x,c 赋值,但我不知道为什么不能将 y 转换为张量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。