#python #tensorflow #machine-learning #keras #chatbot
Вопрос:
при сохранении модели я использую model.save()
. когда я устраню эту ошибку
Уровень PositionalEncoding имеет аргументы init и, следовательно, должен переопределять get_config
модель выдала мне новую ошибку
Ошибка атрибута: суперобъект не имеет атрибута
Код Класса Позиционного Кодирования
class PositionalEncoding(tf.keras.layers.Layer):
def __init__(self, position, d_model):
super(PositionalEncoding, self).__init__()
self.pos_encoding = self.positional_encoding(position, d_model)
def get_config(self):
config = super(PositionalEncoding, self).get_config()
config.update({
'position': self.position,
'd_model': self.d_model,
})
return config
def get_angles(self, position, i, d_model):
angles = 1 / tf.pow(10000, (2 * (i // 2)) / tf.cast(d_model, tf.float32))
return position * angles
def positional_encoding(self, position, d_model):
angle_rads = self.get_angles(
position=tf.range(position, dtype=tf.float32)[:, tf.newaxis],
i=tf.range(d_model, dtype=tf.float32)[tf.newaxis, :],
d_model=d_model)
# apply sin to even index in the array
sines = tf.math.sin(angle_rads[:, 0::2])
# apply cos to odd index in the array
cosines = tf.math.cos(angle_rads[:, 1::2])
pos_encoding = tf.concat([sines, cosines], axis=-1)
pos_encoding = pos_encoding[tf.newaxis, ...]
return tf.cast(pos_encoding, tf.float32)
def call(self, inputs):
return inputs self.pos_encoding[:, :tf.shape(inputs)[1], :]
Код многозадачности класса, в котором я переопределил метод getconfig
class MultiHeadAttention(tf.keras.layers.Layer):
def __init__(self, d_model, num_heads, name="multi_head_attention"):
super(MultiHeadAttention, self).__init__(name=name)
self.num_heads = num_heads
self.d_model = d_model
assert d_model % self.num_heads == 0
self.depth = d_model // self.num_heads
self.query_dense = tf.keras.layers.Dense(units=d_model)
self.key_dense = tf.keras.layers.Dense(units=d_model)
self.value_dense = tf.keras.layers.Dense(units=d_model)
self.dense = tf.keras.layers.Dense(units=d_model)
def get_config(self):
config = super(MultiHeadAttention,self).get_config()
config.update({
'num_heads':self.num_heads,
'd_model':self.d_model,
})
return config
def split_heads(self, inputs, batch_size):
inputs = tf.keras.layers.Lambda(lambda inputs:tf.reshape(
inputs, shape=(batch_size, -1, self.num_heads, self.depth)))(inputs)
return tf.keras.layers.Lambda(lambda inputs: tf.transpose(inputs, perm=[0, 2, 1, 3]))(inputs)
def call(self, inputs):
query, key, value, mask = inputs['query'], inputs['key'], inputs[
'value'], inputs['mask']
batch_size = tf.shape(query)[0]
# linear layers
query = self.query_dense(query)
key = self.key_dense(key)
value = self.value_dense(value)
# split heads
query = self.split_heads(query, batch_size)
key = self.split_heads(key, batch_size)
value = self.split_heads(value, batch_size)
# scaled dot-product attention
scaled_attention = scaled_dot_product_attention(query, key, value, mask)
scaled_attention = tf.keras.layers.Lambda(lambda scaled_attention: tf.transpose(
scaled_attention, perm=[0, 2, 1, 3]))(scaled_attention)
# concatenation of heads
concat_attention = tf.keras.layers.Lambda(lambda scaled_attention: tf.reshape(scaled_attention,
(batch_size, -1, self.d_model)))(scaled_attention)
# final linear layer
outputs = self.dense(concat_attention)
return outputs
Код пользовательского расписания класса, в котором я переопределил метод getconfig
class CustomSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):
def __init__(self, d_model, warmup_steps=4000):
super(CustomSchedule, self).__init__()
self.d_model = tf.constant(d_model,dtype=tf.float32)
self.warmup_steps = warmup_steps
def get_config(self):
return {"d_model": self.d_model,"warmup_steps":self.warmup_steps}
def __call__(self, step):
arg1 = tf.math.rsqrt(step)
arg2 = step * (self.warmup_steps**-1.5)
return tf.math.multiply(tf.math.rsqrt(self.d_model), tf.math.minimum(arg1, arg2))
Я предоставил весь код, в котором метод переопределен
Комментарии:
1. Пожалуйста, добавьте полную обратную трассировку ошибки, она содержит информацию о том, какая строка вызывает ошибку (и всю последовательность вызовов).