Kaggle TPU V3-8运行EfficientNet年龄性别预测模型连接报错如何解决
报错原因及解决方案
这个GRPC连接报错是TPU运行TensorFlow代码时的典型适配问题,由以下几个错误触发,按优先级修复即可:
1. 模型未放在TPU策略作用域内创建
这是最核心的错误。你已经完成了TPU集群初始化和TPUStrategy创建,但所有模型定义、编译的逻辑都必须放在strategy.scope()的上下文管理器中,才能保证模型参数被分发到所有TPU核心上。
修复方式:将模型定义、编译的代码包裹在作用域内:
with strategy.scope(): efficient_net = EfficientNetB0( weights='imagenet', include_top=False, input_shape=(224,224, 3), pooling='max' ) base_model = models.Sequential() base_model.add(efficient_net) features=base_model.output # 同步修正逻辑错误:年龄是回归任务,输出1个神经元即可,不需要softmax age_output = Dense(units=1, activation="linear", name="age_output")(features) # 二分类如果用one-hot标签就用softmax,若用0/1单标签可换成sigmoid+1个输出神经元 gender_output = Dense(units=2, activation="softmax", name="gender_output")(features) model = Model(inputs=base_model.input, outputs=[age_output, gender_output]) model.compile(optimizer = "adam", loss={'age_output': 'mse', 'gender_output': 'categorical_crossentropy'}, metrics={'age_output': 'mae', 'gender_output': 'accuracy'}, loss_weights={'age_output': 2., 'gender_output': 1.})
2. 使用了TPU不兼容的Python自定义生成器
普通的Python yield生成器是CPU侧的动态逻辑,无法被TensorFlow计算图识别,也无法高效分发数据到8个TPU核心,必须替换为tf.data.Dataset格式的输入流水线。
示例实现:
def load_image(file_path, age, gender): img = tf.io.read_file(DIR_UTKFace + '/' + file_path) img = tf.image.decode_jpeg(img, channels=3) img = tf.image.resize(img, (IMG_HEIGHT, IMG_WIDTH)) # 用EfficientNet官方预处理,不要手动除以255 img = tf.keras.applications.efficientnet.preprocess_input(img) return img, (age/maxAge, tf.one_hot(gender, 2)) # 构建训练集数据集 train_ds = tf.data.Dataset.from_tensor_slices(( df.iloc[train_idx]['file_name'], df.iloc[train_idx]['age'], df.iloc[train_idx]['gender'] )) train_ds = train_ds.map(load_image, num_parallel_calls=tf.data.AUTOTUNE) train_ds = train_ds.shuffle(1000).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE) # 构建验证集数据集 valid_ds = tf.data.Dataset.from_tensor_slices(( df.iloc[valid_idx]['file_name'], df.iloc[valid_idx]['age'], df.iloc[valid_idx]['gender'] )) valid_ds = valid_ds.map(load_image, num_parallel_calls=tf.data.AUTOTUNE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
后续model.fit直接传入train_ds和valid_ds即可,不需要自定义生成器,也不需要手动计算steps参数。
3. Batch size适配TPU核心数
TPU V3-8有8个计算核心,全局batch size必须是8的倍数才能被均匀分发到所有核心,建议将BATCH_SIZE调整为64(每个核心处理8条数据),最大化TPU利用率。
内容的提问来源于stack exchange,提问作者pcampana
相关产品推荐
相关产品推荐

