フォルダーから Imagenet データセットを読み込んで、ResNet18 モデルでトレーニングしようとしています。Imagenet は大規模なデータセットであるため、データ サンプルを複数の GPU に分散しようとしています。nvidia-smi でトレーニングを確認すると、上記の GPU でトレーニングが開始されていることがわかります。ただし、トレーニングの精度はエポックを超えて向上せず、損失も減少していないようです。x_train、y_train を GPU に配布する際にロードされる方法が原因であると思われます。
x_train, y_train = next(train_generator) が実際に各エポックのすべてのデータセットを反復しているかどうかを調べることに興味があります。そうでない場合は、125(batch_size=125) のデータ サンプルのみをトレーニングしています。
複数の GPU にデータを分散させながら、テンソル データを from_tensor_slices() に効果的にフィードするにはどうすればよいですか。
strategy = tensorflow.distribute.MirroredStrategy() init_lr = 0.1 epochs =60 batch_size = 125 My_wd=0.0001 Loss = 'categorical_crossentropy' Optimizer = SGD(lr=init_lr,decay=0.0005, momentum=0.9, nesterov=False) def get_dataset(): train_data_dir = 'Datasets/Imagenet/ILSVRC2012_img_train/ILSVRC2012_img_train' validation_data_dir = 'Datasets/Imagenet/ILSVRC2012_img_train/ILSVRC2012_img_train' datagen = ImageDataGenerator(rescale=1./255, horizontal_flip=True, validation_split = 0.2) val_datagen = ImageDataGenerator(rescale=1./255) train_generator = datagen.flow_from_directory(train_data_dir,target_size=(224,224),color_mode='rgb',batch_size= batch_size, subset= "training",class_mode='categorical', shuffle=True, seed=42) val_generator = datagen.flow_from_directory(validation_data_dir,target_size=(224,224),color_mode='rgb',batch_size= batch_size, subset = "validation",class_mode='categorical', shuffle=True, seed=42) x_train, y_train = next(train_generator) x_val,y_val = next(val_generator) return ( tensorflow.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(1024977).repeat().batch(global_batch_size), tensorflow.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(256190).repeat().batch(global_batch_size), ) train_generator, val_generator = get_dataset() with strategy.scope(): model=resnet(input_shape=input_shape,num_classes=1000) model.compile(loss=catcross_entropy_logits_loss() ,optimizer = Optimizer, metrics=['acc']) model.summary() history = model.fit(train_generator, validation_data=val_generator, epochs=epochs, verbose=1, use_multiprocessing=False, workers=1, callbacks=callbacks, validation_steps=val_generator.n // batch_size, steps_per_epoch =train_generator.n // batch_size)