在Android 8运行TensorFlow模型时遇两类保存错误,求技术帮助
解决Android 8上TensorFlow模型保存的目录权限问题
看起来你遇到的两个错误本质上是同一个问题:模型保存的目标目录不存在或者应用没有权限访问它。在Android的沙箱环境里,应用不能随便读写系统目录或未授权的路径,咱们一步步来解决:
错误原因分析
NotFoundError:TensorFlow尝试创建保存目录失败,因为当前路径没有写权限或者目录本身不存在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
相关产品推荐
相关产品推荐

