将model.fit-in keras与自定义列车步骤一起使用时出错 BATCH\u SIZE=32 dataset=tf.data.dataset.from_tensor_切片((问题,ans)).shuffle(1000) dataset=dataset.batch(批大小,拖放余数=True) 类编码器(tf.keras.Model): def_uuuinit_uuuu(self,vocab_输入=1000,vocab_输出=1000,批处理大小=32): super()。\uuuu init\uuuuu() #编码器 self.encoder\u vector=tokens.textVectoriation(vocab\u输入,输出\u序列\u长度=24) self.encoder_embedding=tf.keras.layers.embedding(vocab_输入,256) self.encoder_lstm=tf.keras.layers.lstm(512,返回_序列=True) self.attention=tf.keras.layers.attention() #译码器 self.decoder\u vector=tokens.textVectoriation(vocab\u输出,输出\u序列\u长度=20) self.decoder_embedding=tf.keras.layers.embedding(vocab_输出,256) self.fc=tf.keras.layers.density(语音输出) self.decoder_lstm=tf.keras.layers.lstm(512,返回_序列=True) def损失_功能(真实、预测): 掩码=tf.math.logical_not(tf.math.equal(real,0)) 损耗=损耗对象(真实,预测) mask=tf.cast(mask,dtype=loss_uz.dtype) 损耗*=掩模 返回tf.减少平均值(损失) def系列步骤(自身、数据): 损失=0 输入=p[0] targ=p[1] 输入=自编码器\矢量(输入) targ=自译码器\向量(targ) 使用tf.GradientTape()作为磁带: 输入=自编码器嵌入(输入) enc_输出,enc_h,enc_c=self.encoder_lstm(输入) attn_output=自我注意([enc_output,enc_h]) dec_h=tf.concat([tf.expand_dims(attn_输出,1),dec_h],轴=-1) dec_input=tf.expand_dims([self.decoder_vector(['SOS'])]*批量大小,1) 预测=[] 对于范围内的t(1,目标形状[1]): dec_输入=自译码器_嵌入(dec_输入) dec_输出,dec_h,dec_c=自译码器(dec_输入,初始状态=[dec_h,enc_c]) 预测=self.fc(dec_输出) 损失+=损失函数(目标[:,t],预测) dec_input=tf.expand_dims(目标[:,t],1) 梯度=磁带梯度(损失、可训练变量) self.optimizer.apply_梯度(zip(梯度,可训练的_变量)) 自我编译的度量。更新状态(目标、预测) 返回{m.name:m.result(),用于self.metrics中的m} 型号=编码器 compile(优化器='adam',metrics=[tf.keras.metrics.SparseCategoricalCrossentropy()]) model.fit(数据集,历代=10) 纪元1/10 --------------------------------------------------------------------------- StagingError回溯(最近一次呼叫上次) 在() ---->1 model.fit(数据集,历代=10) 10帧 /包装器中的usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py(*args,**kwargs) 966例外情况为e:#pylint:disable=broad Exception 967如果hasattr(e,“ag\u错误\u元数据”): -->968将e.ag\u错误\u元数据引发到\u异常(e) 969其他: 970加薪 StagingError:在用户代码中: /usr/local/lib/python3.6/dist包/tensorflow/python/keras/engine/training.py:571 train_函数* 输出=self.distribution\u strategy.run( :33火车站* 输入=自编码器\矢量(输入) /usr/local/lib/python3.6/dist包/tensorflow/python/keras/engine/base\u layer.py:897\u调用** 自我构建(输入) /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base\u-layer.py:2416\u-build self.build(输入形状)#pylint:disable=不可调用 /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/preprocessing/text_-vectorization.py:528 build 如果self._split不是None且不是input_shape[1]==1:35; pylint:disable=g-比较-否定 /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor\u-shape.py:870\u-getitem__ 返回self.\u dims[key].值 索引器:列表索引超出范围
我试图在我的自定义类中覆盖keras model train_步骤。 问题是一组英文文本问题,ans是它们各自的答案。它们的长度是随机的,没有填充,因为文本向量化会添加填充。所以数据集包含问题-答案对。现在我批处理这个问题并使用model.fit。 错误是在train_步骤中分配input=data[0]和targ=data[1]时发生的。我需要有关如何为批次分配train步骤中的输入和输出的帮助将model.fit-in keras与自定义列车步骤一起使用时出错 BATCH\u SIZE=32 dataset=tf.data.dataset.from_tensor_切片((问题,ans)).shuffle(1000) dataset=dataset.batch(批大小,拖放余数=True) 类编码器(tf.keras.Model): def_uuuinit_uuuu(self,vocab_输入=1000,vocab_输出=1000,批处理大小=32): super()。\uuuu init\uuuuu() #编码器 self.encoder\u vector=tokens.textVectoriation(vocab\u输入,输出\u序列\u长度=24) self.encoder_embedding=tf.keras.layers.embedding(vocab_输入,256) self.encoder_lstm=tf.keras.layers.lstm(512,返回_序列=True) self.attention=tf.keras.layers.attention() #译码器 self.decoder\u vector=tokens.textVectoriation(vocab\u输出,输出\u序列\u长度=20) self.decoder_embedding=tf.keras.layers.embedding(vocab_输出,256) self.fc=tf.keras.layers.density(语音输出) self.decoder_lstm=tf.keras.layers.lstm(512,返回_序列=True) def损失_功能(真实、预测): 掩码=tf.math.logical_not(tf.math.equal(real,0)) 损耗=损耗对象(真实,预测) mask=tf.cast(mask,dtype=loss_uz.dtype) 损耗*=掩模 返回tf.减少平均值(损失) def系列步骤(自身、数据): 损失=0 输入=p[0] targ=p[1] 输入=自编码器\矢量(输入) targ=自译码器\向量(targ) 使用tf.GradientTape()作为磁带: 输入=自编码器嵌入(输入) enc_输出,enc_h,enc_c=self.encoder_lstm(输入) attn_output=自我注意([enc_output,enc_h]) dec_h=tf.concat([tf.expand_dims(attn_输出,1),dec_h],轴=-1) dec_input=tf.expand_dims([self.decoder_vector(['SOS'])]*批量大小,1) 预测=[] 对于范围内的t(1,目标形状[1]): dec_输入=自译码器_嵌入(dec_输入) dec_输出,dec_h,dec_c=自译码器(dec_输入,初始状态=[dec_h,enc_c]) 预测=self.fc(dec_输出) 损失+=损失函数(目标[:,t],预测) dec_input=tf.expand_dims(目标[:,t],1) 梯度=磁带梯度(损失、可训练变量) self.optimizer.apply_梯度(zip(梯度,可训练的_变量)) 自我编译的度量。更新状态(目标、预测) 返回{m.name:m.result(),用于self.metrics中的m} 型号=编码器 compile(优化器='adam',metrics=[tf.keras.metrics.SparseCategoricalCrossentropy()]) model.fit(数据集,历代=10) 纪元1/10 --------------------------------------------------------------------------- StagingError回溯(最近一次呼叫上次) 在() ---->1 model.fit(数据集,历代=10) 10帧 /包装器中的usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py(*args,**kwargs) 966例外情况为e:#pylint:disable=broad Exception 967如果hasattr(e,“ag\u错误\u元数据”): -->968将e.ag\u错误\u元数据引发到\u异常(e) 969其他: 970加薪 StagingError:在用户代码中: /usr/local/lib/python3.6/dist包/tensorflow/python/keras/engine/training.py:571 train_函数* 输出=self.distribution\u strategy.run( :33火车站* 输入=自编码器\矢量(输入) /usr/local/lib/python3.6/dist包/tensorflow/python/keras/engine/base\u layer.py:897\u调用** 自我构建(输入) /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base\u-layer.py:2416\u-build self.build(输入形状)#pylint:disable=不可调用 /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/preprocessing/text_-vectorization.py:528 build 如果self._split不是None且不是input_shape[1]==1:35; pylint:disable=g-比较-否定 /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor\u-shape.py:870\u-getitem__ 返回self.\u dims[key].值 索引器:列表索引超出范围,python,list,keras,tuples,tensorflow2.0,Python,List,Keras,Tuples,Tensorflow2.0,我试图在我的自定义类中覆盖keras model train_步骤。 问题是一组英文文本问题,ans是它们各自的答案。它们的长度是随机的,没有填充,因为文本向量化会添加填充。所以数据集包含问题-答案对。现在我批处理这个问题并使用model.fit。 错误是在train_步骤中分配input=data[0]和targ=data[1]时发生的。我需要有关如何为批次分配train步骤中的输入和输出的帮助 BATCH_SIZE =32 dataset = tf.data.Dataset.from_ten
BATCH_SIZE =32
dataset = tf.data.Dataset.from_tensor_slices((question, ans)).shuffle(1000)
dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)
class EncoderDecoder(tf.keras.Model):
def __init__(self,vocab_input=1000,vocab_output=1000,BATCH_SIZE=32):
super().__init__()
#Encoder
self.encoder_vector = tokens.TextVectorization(vocab_input,output_sequence_length=24)
self.encoder_embedding = tf.keras.layers.Embedding(vocab_input,256)
self.encoder_lstm = tf.keras.layers.LSTM(512,return_sequences=True)
self.attention = tf.keras.layers.Attention()
#Decoder
self.decoder_vector = tokens.TextVectorization(vocab_output,output_sequence_length=20)
self.decoder_embedding = tf.keras.layers.Embedding(vocab_output,256)
self.fc = tf.keras.layers.Dense(vocab_output)
self.decoder_lstm = tf.keras.layers.LSTM(512,return_sequences=True)
def loss_function(real, pred):
mask = tf.math.logical_not(tf.math.equal(real, 0))
loss_ = loss_object(real, pred)
mask = tf.cast(mask, dtype=loss_.dtype)
loss_ *= mask
return tf.reduce_mean(loss_)
def train_step(self,data):
loss =0
input = p[0]
targ = p[1]
input = self.encoder_vector(input)
targ = self.decoder_vector(targ)
with tf.GradientTape() as tape:
input = self.encoder_embedding(input)
enc_output,enc_h,enc_c = self.encoder_lstm(input)
attn_output = self.attention([enc_output,enc_h])
dec_h = tf.concat([tf.expand_dims(attn_output, 1), dec_h], axis=-1)
dec_input = tf.expand_dims([self.decoder_vector(['SOS'])]*BATCH_SIZE,1)
predictions = []
for t in range(1,targ.shape[1]):
dec_input = self.decoder_embedding(dec_input)
dec_output,dec_h,dec_c = self.decoder_lstm(dec_input,initial_states=[dec_h,enc_c])
predictions = self.fc(dec_output)
loss+=loss_function(targ[:,t],predictions)
dec_input = tf.expand_dims(targ[:, t], 1)
gradients = tape.gradient(loss,trainable_variables)
self.optimezer.apply_gradients(zip(gradients,trainable_variables))
self.compiled_metrics.update_state(targ,predictions)
return {m.name:m.result() for m in self.metrics}
model = EncoderDecoder()
model.compile(optimizer = 'adam',metrics = [tf.keras.metrics.SparseCategoricalCrossentropy()])
model.fit(dataset,epochs=10)
Epoch 1/10
---------------------------------------------------------------------------
StagingError Traceback (most recent call last)
<ipython-input-153-573fadf7e010> in <module>()
----> 1 model.fit(dataset,epochs=10)
10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
966 except Exception as e: # pylint:disable=broad-except
967 if hasattr(e, "ag_error_metadata"):
--> 968 raise e.ag_error_metadata.to_exception(e)
969 else:
970 raise
StagingError: in user code:
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:571 train_function *
outputs = self.distribute_strategy.run(
<ipython-input-151-46787da81d42>:33 train_step *
input = self.encoder_vector(input)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py:897 __call__ **
self._maybe_build(inputs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py:2416 _maybe_build
self.build(input_shapes) # pylint:disable=not-callable
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/preprocessing/text_vectorization.py:528 build
if self._split is not None and not input_shape[1] == 1: # pylint: disable=g-comparison-negation
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_shape.py:870 __getitem__
return self._dims[key].value
IndexError: list index out of range