树莓派3运行TensorFlow 1.5.0-rc0脚本遇int64类型错误求助
解决TensorFlow 1.5.0-rc0在树莓派上的int64类型错误
这个问题是TensorFlow 1.x早期版本在ARM架构(比如树莓派3)上的常见兼容性问题——默认的global_step训练步数变量是int64类型,但该环境下的AssignAdd操作(用于更新训练步数)不支持这个数据类型,因此抛出了类型不匹配的错误。
下面给你两种可行的解决方案,按复杂度从低到高排序:
方案1:猴子补丁快速修复(最简单)
在你的Python脚本最开头添加这段代码,它会修改TensorFlow获取全局步数的函数,自动把int64类型的步数转换为支持的int32类型:
import tensorflow as tf from tensorflow.python.training import training_util # 替换默认的get_global_step函数,强制转换为int32 original_get_global_step = training_util.get_global_step def patched_get_global_step(): step = original_get_global_step() if step is not None and step.dtype == tf.int64: return tf.cast(step, tf.int32) return step training_util.get_global_step = patched_get_global_step
添加后直接运行你的原有代码即可,不需要修改其他逻辑。
方案2:自定义ModelFn(更可控)
如果你希望更深入地控制模型训练流程,可以自定义模型函数,手动指定global_step的类型为int32,替代预定义的DNNRegressor:
import tensorflow as tf import pandas as pd import numpy as np # 保留你原有的FEATURES, LABEL, COLUMNS定义... def custom_dnn_regressor(features, labels, mode, params): # 构建DNN网络结构(和原DNNRegressor逻辑一致) input_layer = tf.feature_column.input_layer(features, params['feature_columns']) net = input_layer for units in params['hidden_units']: net = tf.layers.dense(net, units=units, activation=tf.nn.relu) logits = tf.layers.dense(net, units=1) # 计算损失 loss = tf.losses.mean_squared_error(labels=labels, predictions=logits) # 训练阶段:强制使用int32类型的global_step if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.AdamOptimizer() # 获取或创建全局步数,转换为int32 global_step = tf.train.get_or_create_global_step() if global_step.dtype == tf.int64: global_step = tf.cast(global_step, tf.int32) train_op = optimizer.minimize(loss, global_step=global_step) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) # 预测和评估逻辑(和原DNNRegressor一致) predictions = {'predictions': tf.squeeze(logits, 1)} if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) eval_metric_ops = { 'mse': tf.metrics.mean_squared_error(labels=labels, predictions=predictions['predictions']) } return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops) # 替换原有的regressor创建代码 feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES] regressor = tf.estimator.Estimator( model_fn=custom_dnn_regressor, params={ 'feature_columns': feature_cols, 'hidden_units': [256, 64, 32] }, model_dir='./checkpoint/data_model_location_256-64-32' ) # 保留你原有的数据准备和训练代码... regressor.train(input_fn=get_input_fn(data_train), steps=100)
这个方案完全复刻了DNNRegressor的功能,同时解决了类型不兼容的问题,适合需要自定义训练逻辑的场景。
内容的提问来源于stack exchange,提问作者David Seiden




