类似 Tensorflow RNN 的神经网络不会像 Mac M1 上那样进行训练

问题描述 投票:0回答:1

我正在Tensorflow官网学习python深度学习工具。

尝试构建几个文本分类网络,按照教程进行。但 LSTM 不能正常工作。

import numpy as np
import tensorflow_datasets as tfds
import tensorflow as tf
from tensorflow.keras import utils
from tensorflow.keras import losses
import matplotlib.pyplot as plt


seed = 42
BATCH_SIZE = 64

train_ds = utils.text_dataset_from_directory(
    'stack_overflow_16k/train',
    validation_split=0.2,
    subset='training',
    batch_size=BATCH_SIZE,
    seed=seed)
val_ds = utils.text_dataset_from_directory(
    'stack_overflow_16k/train',
    validation_split=0.2,
    subset='validation',
    batch_size=BATCH_SIZE,
    seed=seed)
test_ds = utils.text_dataset_from_directory(
    'stack_overflow_16k/test',
    batch_size=BATCH_SIZE)

class_names = train_ds.class_names
train_ds = train_ds.prefetch(buffer_size=tf.data.AUTOTUNE)
val_ds = val_ds.prefetch(buffer_size=tf.data.AUTOTUNE)
test_ds = test_ds.prefetch(buffer_size=tf.data.AUTOTUNE)


VOCAB_SIZE = 1000
MAX_SEQUENCE_LENGTH = 500

encoder = tf.keras.layers.TextVectorization(
    max_tokens=VOCAB_SIZE,
    output_sequence_length=MAX_SEQUENCE_LENGTH)

encoder.adapt(train_ds.map(lambda text, label: text))


model = tf.keras.Sequential([
    encoder,
    tf.keras.layers.Embedding(VOCAB_SIZE, 64, mask_zero=True),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
#     tf.keras.layers.LSTM(128),
#     tf.keras.layers.Dense(64, activation='relu'),
#     tf.keras.layers.Conv1D(64, 5, padding="valid", activation="relu", strides=2),
#     tf.keras.layers.GlobalMaxPooling1D(),
#     tf.keras.layers.GRU(64),
#     tf.keras.layers.SimpleRNN(64),
#     tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(4)
])
model.summary()


model.compile(loss='sparse_categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

history = model.fit(train_ds, epochs=10,
                    validation_data=val_ds)

这是我的完整代码,核心部分与教程相同。

但训练输出如下:

Epoch 1/10
100/100 [==============================] - 33s 273ms/step - loss: 9.6882 - accuracy: 0.2562 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 2/10
100/100 [==============================] - 25s 250ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 3/10
100/100 [==============================] - 25s 252ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 4/10
100/100 [==============================] - 25s 254ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 5/10
100/100 [==============================] - 25s 255ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 6/10
100/100 [==============================] - 26s 256ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 7/10
100/100 [==============================] - 26s 257ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 8/10
100/100 [==============================] - 26s 258ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 9/10
100/100 [==============================] - 26s 258ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587
Epoch 10/10
100/100 [==============================] - 26s 256ms/step - loss: 12.1238 - accuracy: 0.2478 - val_loss: 11.9475 - val_accuracy: 0.2587

准确率没有增加,损失也没有减少,就像没有训练一样。并且准确率与类数的倒数相同。 (例如,如果是二分类问题,那么准确率将保持在 0.5 左右,四分类问题为 0.25)

后来我与CNN进行比较,只需将LSTM层更改为CNN层即可,如教程,它可以按预期工作。 (相同的数据集,相同的

model.compile()
model.fit()
参数)

我也尝试过GRU,也出现同样的问题。

我不明白。

我是否缺少一些类似 RNN 模型的配置?有人可以帮我解决这个问题吗?谢谢!

附注

我尝试配置优化器(sgd,adam)和学习率,但不起作用。这不像过度拟合。

我尝试过的方法:


更新2023-01-30

我在我的 Linux 服务器上运行了相同的代码,它按预期工作。这可能是tensorflow-macos的一个错误。


更新2023-02-01

尝试了官方版的tensorflow for macos m1,只是

conda install tensorflow

它有效。应该是tensorflow-macos GPU支持的问题。我再次尝试仅在tensorflow-macos上使用CPU,它有效。

结论:

类似 RNN 的模型在带有 GPU 的 tensorflow-macos 上存在问题。

python tensorflow deep-learning lstm apple-m1
1个回答
0
投票

类似的问题也发生在我身上。 我在没有使用tensorflow-metal的情况下训练了我的CNN模型,效果很好。 然后我改用tensorflow-metal,看看性能是否会有所提升。问题就来了。 在我的第一次试验中,我没有更改任何参数,保留了上次训练时的参数。 起初,准确度有所上升,然后在某个时刻又下降了。在它贯穿所有纪元之前,损失就被标记为“nan”。我想降低学习率。 第二次试验时,问题依然存在。尽管它运行了所有的 epoch,但准确率不断从 60% 下降到 10%,val_accuracy 也是如此。

太奇怪了。如果您知道原因以及如何解决此问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.