Bien que google colab soit étonnamment pratique, il existe un problème en raison du fait que la lecture des données directement à partir de Google Drive est anormalement lente. (Données d'image dans mon cas) Je vais donc utiliser un fichier .p ou un fichier .h5 pour accélérer la lecture (aussi vite que la lecture depuis un appareil normal).
Je pense que la méthode changera en fonction de la personne, mais dans mon cas
Je vais le faire comme ça.
En raison de l'influence de la tâche (synthèse vocale) sur laquelle je travaille actuellement, j'écris également la sortie, mais pour les tâches de classification, etc., je pense qu'il est préférable de sauvegarder l'entrée et la sortie sous forme de taple sans les séparer.
maketxt.py
import re
import glob
from sklearn.model_selection import train_test_split
def Create_txt(txt_path):
#La condition est isfile car ce n'est que pour les images en mouvement=Je pense que c'est bien.
fileList = [p for p in glob.glob('./image/**/', recursive=True) if re.search('/segment_', p)]
#Les données sont 8:1:1
train_data, val_test_data = train_test_split(fileList, test_size=0.2)
val_data, test_data = train_test_split(val_test_data, test_size=0.5)
try:
train_txt = os.path.join(txt_path, 'train.txt')
with open(train_txt, mode='x') as f:
for train_path in train_data:
f.write(train_path.rstrip('/') + '\n')
val_txt = os.path.join(txt_path, 'val.txt')
with open(val_txt, mode='x') as f:
for val_path in val_data:
f.write(val_path.rstrip('/') + '\n')
test_txt = os.path.join(txt_path, 'test.txt')
with open(test_txt, mode='x') as f:
for test_path in test_data:
f.write(test_path.rstrip('/') + '\n')
except FileExistsError:
print('already exists')
Que fais tu
À l'origine, le fichier .txt ne prend pas beaucoup de temps, vous pouvez donc l'ignorer.
p est un acronyme pour pickle. C'est un module Python qui permet de sauvegarder l'état d'un objet en sérialisant l'objet. (Je vous serais reconnaissant si vous pouviez voir d'autres pages pour le contenu spécifique.)
Dans ce cas, une grande quantité de chaînes de caractères (chemins de nom de fichier) est stockée dans un fichier. Je vais mettre le code ci-dessous, mais je viens de lire le fichier texte et de le mettre dans le fichier pickle.
import pickle
video_list =list()
txt_path = os.path.join(txt_path)+ '.txt'
with open(txt_path, 'r') as textFile:
for line in textFile:
line = line.replace('\n', '')
video_list.append(line)
pickle.dump(data_dict, open('txt_file.p', "wb"))
C'est la partie principale de ce temps.
Le fichier .h5 est l'un des fichiers binaires appelés HDF5, et vous pouvez avoir une structure hiérarchique dans un seul fichier. En d'autres termes, gérons les fichiers qui sont généralement effectués sur l'ordinateur dans un fichier énorme.
En stockant un grand nombre de fichiers image dans un fichier énorme, le temps de chargement des images est réduit. Surtout google colab est lent, donc je l'ai utilisé quand je ne l'avais pas. (La première époque était particulièrement serrée, cela a pris 10 minutes au lieu de 2 heures.)
fileName = 'data.h5'
path = ('./data_file')
#lire les données de pickle
dataFileList = pickle.load(open('txt_file.p', "rb"))
train_list=dataFileList['train']
count =0
with h5py.File(fileName, "w") as f:
f.create_group('/train')
f.create_group('/train/input')
f.create_group('/train/output')
for train in train_list:
data = pull_item(train)
f.create_dataset('/train'+data[0].strip('.'), data=data[2])
f.create_dataset('/train'+data[1].strip('.'), data=data[3])
f.flush()
if count %100 ==0:
print(count)
count +=1
En tant que flux,
Créez un fichier h5 et créez un répertoire pour l'entrée et un répertoire pour la sortie. (La structure des répertoires est gratuite, mais elle semble difficile à lire s'il y a trop de hiérarchies.)
Enregistrez de plus en plus de données d'entraînement.
f.create_dataset('nom de fichier', data=Contenu des données)
Faire.
import h5py
from PIL import Image
import numpy as np
image = ('/train/input/images_18')
output = ('/train/output/images_18.csv')
with h5py.File('data.h5', mode = 'r') as data:
img_data = data[image]
img_group = img_data[...]
img_group = img_group.astype(np.float64)
feature = data[output]
feature_data = feature[...]
data.close()
En raison des spécifications, l'objet pour HDF5 est lu lorsque les données sont lues pour la première fois, donc
img_group = img_data[...]
Il est nécessaire de spécifier que le contenu de l'objet doit être récupéré comme dans. Le reste est comme d'habitude.
Même si je cherchais "google colab loading is slow" etc., je n'ai pas trouvé d'article sur l'utilisation d'un fichier binaire, donc j'espère que vous connaîtrez son existence en lisant cet article.
Cela semble être plus profond que je ne le pensais, mais je n'ai pas beaucoup de temps et de motivation pour le rechercher correctement, donc si vous voulez en savoir plus, je pense que vous devriez regarder d'autres pages.