在训练模型model.fit的时候报错了,直接上图
其实这里有两个问题,一个是NotFundError, 一个是Function call stack。 但是,一般会直接在意最后一个,而忽略第一个。
一、 Function call stack
请教了大神**@日月光华**,设置GPU显存按需申请
import tensorflow as tf
gpu = tf.config.experimental.list_physical_devices(device_type='GPU')
assert len(gpu) == 1
tf.config.experimental.set_memory_growth(gpu[0], True)
二、 NotFundError:Tensor(“arg_0:0”, shape=(), dtype=string); No such file or directory
其实,在大神回答我之前,我把第二个问题解决了以后,第一个问题直接就消失了。。。然后我看到有的小伙伴出现了第一个问题的同时,上面其实也有其他的问题,所以我觉得解决第二个问题上出现的问题才是重点。
很明显,我这里是由于dataset内部数据错误导致的,需要重头开始查看在哪里数据读取出现的问题。
我的思路如下:
1> 查看是否每个路径都是准确的路径
e.g. 我之前读取jpg图像路径直接采用
images = glob.glob('./data/cats/*')
因为大致略看了路径直接认为里面都是图像,但实际读取的时候里面可能包含其他的文件,所以最好是做到准确:
glob.glob('./data/cats/*.jpg')
2> 路径是否去掉了PosixPath
输出路径看是否前面有其他标识,如
若有,则整体转化为str
train_images= [str(path) for path in train_images]
3> 数据是否真正的读取到了
对于图像数据,可以用以下代码读取数据,并显示图片
import random
import IPython.display as display
for n in range(3):
image_index = random.choice(range(len(train_images)))
display.display(display.Image(all_image_paths[image_index]))
4> 构建tensor时是否正确
这里以Kaggle踩坑指南–1. 数据集的读取和图像预处理如下构建方式为例
import tensorflow as tf
def _pre_read(img_filename, label):
image = tf.io.read_file(img_filename)
image = tf.image.decode_jpeg(image,channels=3)
image = tf.image.rgb_to_grayscale(image)
image = tf.image.resize(image,[200,200])
image = tf.reshape(image,[200,200,1])
image = tf.image.per_image_standardization(image) #或者:image = image/255
label = tf.reshape(label,[1])
return image, label
BATCH_SIZE = 32
train_dataset = tf.data.Dataset.from_tensor_slices((train_images,train_labels)) #这里的train_images是图像路径
#在notebook中可以直接在下方新建cell中输入train_dataset 查看是否构建正确
train_dataset = train_dataset.map(_pre_read)
train_dataset = train_dataset.shuffle(300)
train_dataset = train_dataset.repeat()
train_dataset = train_dataset.batch(BATCH_SIZE)
当然,以上主要针对个人的代码,我的问题出现在了1>和4>中。
经验就是,大不了全部输入dataset都查看一下,看是哪一个读取数据或者转数据格式出了问题