Nic*_*ais 6 python machine-learning deep-learning keras tensorflow
我认为这个错误是由形状问题引起的,但我不知道在哪里。完整的错误消息建议执行以下操作:
此外,tf.function 具有experimental_relax_shapes=True 选项,可以放宽参数形状,从而避免不必要的回溯。
当我在函数装饰器中输入这个参数时,它确实起作用了。
@tf.function(experimental_relax_shapes=True)
Run Code Online (Sandbox Code Playgroud)
原因可能是什么?这是完整的代码:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
print(f'Tensorflow version {tf.__version__}')
from tensorflow import keras
from tensorflow.keras.layers import Dense, Conv1D, GlobalAveragePooling1D, Embedding
import tensorflow_datasets as tfds
from tensorflow.keras.models import Model
(train_data, test_data), info = tfds.load('imdb_reviews/subwords8k',
split=[tfds.Split.TRAIN, tfds.Split.TEST],
as_supervised=True, with_info=True)
padded_shapes = ([None], ())
train_dataset = train_data.shuffle(25000).\
padded_batch(padded_shapes=padded_shapes, batch_size=16)
test_dataset = test_data.shuffle(25000).\
padded_batch(padded_shapes=padded_shapes, batch_size=16)
n_words = info.features['text'].encoder.vocab_size
class ConvModel(Model):
def __init__(self):
super(ConvModel, self).__init__()
self.embe = Embedding(n_words, output_dim=16)
self.conv = Conv1D(32, kernel_size=6, activation='elu')
self.glob = GlobalAveragePooling1D()
self.dens = Dense(2)
def call(self, x, training=None, mask=None):
x = self.embe(x)
x = self.conv(x)
x = self.glob(x)
x = self.dens(x)
return x
conv = ConvModel()
conv(next(iter(train_dataset))[0])
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
train_loss = tf.keras.metrics.Mean()
test_loss = tf.keras.metrics.Mean()
train_acc = tf.keras.metrics.CategoricalAccuracy()
test_acc = tf.keras.metrics.CategoricalAccuracy()
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
@tf.function
def train_step(inputs, labels):
with tf.GradientTape() as tape:
logits = conv(inputs, training=True)
loss = loss_object(labels, logits)
train_loss(loss)
train_acc(logits, labels)
gradients = tape.gradient(loss, conv.trainable_variables)
optimizer.apply_gradients(zip(gradients, conv.trainable_variables))
@tf.function
def test_step(inputs, labels):
logits = conv(inputs, training=False)
loss = loss_object(labels, logits)
test_loss(loss)
test_acc(logits, labels)
def learn():
train_loss.reset_states()
test_loss.reset_states()
train_acc.reset_states()
test_acc.reset_states()
for text, target in train_dataset:
train_step(inputs=text, labels=target)
for text, target in test_dataset:
test_step(inputs=text, labels=target)
def main(epochs=2):
for epoch in tf.range(1, epochs + 1):
learn()
template = 'TRAIN LOSS {:>5.3f} TRAIN ACC {:.2f} TEST LOSS {:>5.3f} TEST ACC {:.2f}'
print(template.format(
train_loss.result(),
train_acc.result(),
test_loss.result(),
test_acc.result()
))
if __name__ == '__main__':
main(epochs=1)
Run Code Online (Sandbox Code Playgroud)
TF/DR:此错误的根本原因是由于train_data批次之间形状的变化而变化。修复 的大小/形状train_data可以解决此跟踪警告。我更改了以下行,然后一切都按预期进行。完整要点在这里
padded_shapes = ([9000], ())#None.
Run Code Online (Sandbox Code Playgroud)
正如警告消息中提到的
警告:tensorflow:最近 11 次对 <function train_step at 0x7f4825f6d400> 的调用中有 10 次触发了 tf.function 回溯。跟踪成本很高,并且跟踪次数过多可能是由于 (1) 在循环中重复创建 @tf.function,(2) 传递不同形状的张量,(3) 传递 Python 对象而不是张量。对于 (1),请在循环外部定义 @tf.function。对于(2),@tf.function具有experimental_relax_shapes=True选项,可以放宽参数形状,从而避免不必要的回溯。
由于警告消息中提到的三个原因,会发生此回溯警告。原因 (1) 不是根本原因,因为 @tf.function 没有在循环中调用,原因 (3) 也不是根本原因,因为 和 的参数train_step都是test_step张量对象。所以根本原因就是警告中提到的原因 (2)。
当我打印 的尺寸时train_data,它打印出不同的尺寸。所以我尝试填充,train_data使所有批次的形状都相同。
padded_shapes = ([9000], ())#None. # this line throws tracing error as the shape of text is varying for each step in an epoch.
# as the data size is varying, tf.function will start retracing it
# For the demonstration, I used 9000 as max length, but please change it accordingly
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10290 次 |
| 最近记录: |