0

フォルダーから Imagenet データセットを読み込んで、ResNet18 モデルでトレーニングしようとしています。Imagenet は大規模なデータセットであるため、データ サンプルを複数の GPU に分散しようとしています。nvidia-smi でトレーニングを確認すると、上記の GPU でトレーニングが開始されていることがわかります。ただし、トレーニングの精度はエポックを超えて向上せず、損失も減少していないようです。x_train、y_train を GPU に配布する際にロードされる方法が原因であると思われます。

  1. x_train, y_train = next(train_generator) が実際に各エポックのすべてのデータセットを反復しているかどうかを調べることに興味があります。そうでない場合は、125(batch_size=125) のデータ サンプルのみをトレーニングしています。

  2. 複数の 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)
    
4

0 に答える 0