我正在 Udacity 观看一门关于深度学习的在线类(class),这个概念是对 not_Mnist 数据集的简单分类。一切都解释得很好,但我对给出的部分代码有点困惑。如果您愿意,我将不胜感激有时间帮帮我吧!
例如,我们有一个'notMNIST_large.tar.gz'文件
。
因此,首先我们删除.tar.gz
,根目录为root = notMNIST_large
。之后,我们检查是否已经存在具有该名称的目录。如果没有,我们从 'notMNIST_large.tar.gz' 文件中提取子文件夹
,这就是我有点困惑的地方......
num_classes = 10
np.random.seed(133)
def maybe_extract(filename, force=False):
root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz
if os.path.isdir(root) and not force:
# You may override by setting force=True.
print('%s already present - Skipping extraction of %s.' % (root, filename))
else:
print('Extracting data for %s. This may take a while. Please wait.' % root)
tar = tarfile.open(filename)
sys.stdout.flush()
tar.extractall(data_root)
tar.close()
data_folders = [
os.path.join(root, d) for d in sorted(os.listdir(root))
if os.path.isdir(os.path.join(root, d))]
if len(data_folders) != num_classes:
raise Exception(
'Expected %d folders, one per class. Found %d instead.' % (
num_classes, len(data_folders)))
print(data_folders)
return data_folders
train_folders = maybe_extract(train_filename)
test_folders = maybe_extract(test_filename)
所以如果可能的话我想对此部分进行解释
data_folders = [
os.path.join(root, d) for d in sorted(os.listdir(root))
if os.path.isdir(os.path.join(root, d))]
if len(data_folders) != num_classes:
raise Exception(
'Expected %d folders, one per class. Found %d instead.' % (
num_classes, len(data_folders)))
最佳答案
它收集子目录列表并检查是否有预期的数量。
data_folders = [thing(d) for d in something() if predicate(d)]
是一个列表理解,它循环遍历something()
的结果并收集predicate
为True<的那些项目
。它将 thing()
应用于这些条目,并将结果列表收集到 data_folders
中。
这里,something
是当前目录中的文件列表,predicate
检查该项目是否是一个目录(而不是常规文件) ); thing
是 os.path.join(root,d)
即我们在提取的条目前面添加回 root
目录。
因此,在本例中,代码检查子目录的数量是否与类的数量相同(假设每个子目录都包含一个类)。
关于python os.path.dir 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47907306/