You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

M1芯片MacOS系统下TensorFlow 2.5.0运行文本分类代码异常咨询

M1芯片MacOS运行IMDB文本分类TensorFlow代码异常问题及解决方案

问题背景

在搭载M1芯片的MacOS BigSur(版本11.2.3)系统上运行François Chollet所著《深度学习》中的文本分类代码,使用TensorFlow版本为2.5.0,代码如下:

import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence
max_features = 2000
max_len = 500
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=max_len)
x_test = sequence.pad_sequences(x_test, maxlen=max_len)
model = keras.models.Sequential()
model.add(layers.Embedding(max_features, 128,input_length=max_len,name='embed'))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
model.summary()
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
callbacks=[tf.keras.callbacks.TensorBoard(log_dir='my_log_dir',histogram_freq=1,embeddings_freq=1,)]

history = model.fit(x_train, y_train, epochs=20, batch_size=128,
                    validation_split=0.2,callbacks=callbacks)

出现的问题

  • 训练输出的准确率和损失值异常偏高,相同代码在Windows 10系统运行结果完全不同
  • 更换Adam优化器运行时,会弹出Kernel appears to have died的内核崩溃提示
  • 运行过程中会弹出粉色框标注的警告信息,需要屏蔽方法

解决方案

1. 准确率/损失异常问题

TensorFlow 2.5.0对M1芯片的原生支持存在严重兼容缺陷,该版本发布时苹果尚未推出正式适配的tensorflow-metal插件,arm64架构下数值计算精度逻辑和x86平台不一致,导致结果异常,解决步骤:

  • 升级系统到MacOS 12.3及以上版本
  • 卸载原有TensorFlow,配置arm64架构的conda环境后,执行conda install tensorflow-macos tensorflow-metal安装苹果官方适配的TensorFlow版本
  • 修复原代码笔误:将model = keras.models.Sequential()修改为model = tf.keras.models.Sequential(),补全前缀避免导入异常引发的未知错误

2. Adam优化器内核崩溃问题

该问题是M1早期TensorFlow版本的已知BUG,Adam优化器的底层运算在arm64架构下会触发内存访问错误,解决方法:

  • 完成上述适配版TensorFlow安装后即可直接解决该问题
  • 若暂时无法升级版本,可将batch_size从128下调到32或64,降低内存占用也可大概率避免崩溃

3. 屏蔽警告信息问题

将以下代码添加到所有导入语句的最前方,即可过滤TensorFlow相关警告:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import warnings
warnings.filterwarnings('ignore')

TF_CPP_MIN_LOG_LEVEL设为2代表只输出错误信息,自动过滤info和warning级别的日志。


内容的提问来源于stack exchange,提问作者Syeda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:24:01