如何解决当我使用 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 举报,一经查实,本站将立刻删除。