You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派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

火山引擎 最新活动