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

在Android 8运行TensorFlow模型时遇两类保存错误,求技术帮助

解决Android 8上TensorFlow模型保存的目录权限问题

看起来你遇到的两个错误本质上是同一个问题:模型保存的目标目录不存在或者应用没有权限访问它。在Android的沙箱环境里,应用不能随便读写系统目录或未授权的路径,咱们一步步来解决:

错误原因分析

  1. NotFoundError:TensorFlow尝试创建保存目录失败,因为当前路径没有写权限或者目录本身不存在
  2. ValueError:直接提示tfdroid.ckpt的父目录不存在,这更明确了路径配置的问题

具体解决方案

1. 选择Android应用的合法存储路径

优先使用应用的内部私有存储目录(不需要额外权限),路径格式一般是:/data/data/[你的应用包名]/files/。如果需要用外部存储,得在AndroidManifest.xml中添加WRITE_EXTERNAL_STORAGE权限,Android 6及以上版本还要动态申请权限。

2. 修改代码:创建目录+使用绝对路径保存

先导入os模块,在代码里先创建目标目录,再用绝对路径保存模型和计算图:

import os
import tensorflow as tf
import numpy as np

# 替换成你的应用实际的私有存储路径
SAVE_DIR = "/data/data/com.your.package.name/files/tf_model"

def tester(x) :
    # 获取数据
    getTrainTest(n_classes)
    # 构建模型
    pred = alex_net(x, weights, biases, keep_prob)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
    saver = tf.train.Saver()
    hm_epochs = 10

    # 创建保存目录(如果不存在)
    if not os.path.exists(SAVE_DIR):
        os.makedirs(SAVE_DIR)

    with tf.Session() as sess:
        # 建议使用这个初始化方法,tf.initialize_all_variables()已经被废弃
        sess.run(tf.global_variables_initializer())
        
        # 用绝对路径保存计算图
        tf.train.write_graph(sess.graph_def, SAVE_DIR, 'tfdroid.pbtxt')
        
        # 训练网络
        for epoch in range(hm_epochs):
            epoch_loss = 0
            i = 0
            while i < len(Xtrain):
                start = i
                end = i + batch_size
                epoch_x = np.array(Xtrain[start:end])
                epoch_y = np.array(Ytrain[start:end])
                print(epoch_x.shape)
                _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y, keep_prob:1. })
                epoch_loss += c
                i = i + batch_size
            print('Epoch', epoch, 'completed out of', hm_epochs, 'loss :', epoch_loss)
        
        # 用绝对路径保存模型权重
        saver.save(sess, os.path.join(SAVE_DIR, 'tfdroid.ckpt'))

3. 额外注意事项

  • 如果你是在Android项目中通过JNI或其他方式调用这段TensorFlow代码,建议在Android端先获取合法路径(比如通过context.getFilesDir().getAbsolutePath()),再传递给Python代码,这样能适配不同设备的路径规则。
  • 可以去系统设置里检查下应用的存储权限是否开启,避免被系统限制读写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:06