Mengapa pelatihan begitu lama pada GPU saya?

10

Detail:

GPU : GTX 1080

Pelatihan : ~ 1,1 Juta gambar milik 10 kelas

Validasi : ~ 150 Ribu gambar milik 10 kelas

Waktu per Zaman : ~ 10 jam

Saya sudah menyiapkan CUDA, cuDNN dan Tensorflow (GPU Tensorflow juga).

Saya tidak berpikir model saya yang rumit yang membutuhkan waktu 10 jam per zaman. Saya bahkan memeriksa apakah GPU saya adalah masalahnya tetapi ternyata tidak.

Apakah waktu pelatihan karena lapisan yang terhubung sepenuhnya?

Model saya:

model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

model.summary()

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy']
          )

Karena ada banyak data saya menggunakan ImageDataGenerator.

gen = ImageDataGenerator(
 horizontal_flip=True
)

train_gen = gen.flow_from_directory(
        'train/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

valid_gen = gen.flow_from_directory(
        'validation/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)
Pradyumna Rahul
sumber
2
Saya memilih untuk memindahkan ini ke stack overflow, tetapi sebenarnya itu milik pertukaran pertukaran sains data, IMO
generic_user
generic_user: "ilmu data" dapat menggunakan "pembelajaran mesin", tetapi tidak semua "pembelajaran mesin" adalah untuk "ilmu data". (ML hanyalah alat lain, tensorflow hanya perpustakaan lain; ML mungkin segera (jika belum) digunakan bahkan untuk tugas-tugas biasa seperti mengelola file properti preferensi pengguna.)
michael
lihat juga terkait (tl; dr: verifikasi benar-benar berjalan pada GPU, lihat statistik GPU yang dapat disediakan) stackoverflow.com/questions/42527492/… stackoverflow.com/questions/38559755/…
michael
Saya sudah mencoba pendekatan itu dan menyatakan bahwa GPU saya saat ini sedang digunakan. Untuk mengkonfirmasi saya juga menggunakan nvidia-smi untuk memeriksa pemanfaatan GPU dan itu agak berfluktuasi antara 85% -99%.
Pradyumna Rahul

Jawaban:

7

Itu tentang yang diharapkan. Jika Anda membagi jumlah detik dengan jumlah gambar yang Anda proses, Anda mendapatkan 33 milidetik per gambar, yang sepertinya tepat untuk jaringan sekecil itu. Jaringan yang lebih besar biasanya mengambil rata-rata 50 hingga 200 milidetik per gambar.

Ya, lapisan padat besar kemungkinan akan merusak kinerja Anda, karena itu adalah matriks besar (256 oleh 4096) dan perkalian matriks besar untuk menyertainya setiap kali Anda menjalankan jaringan.

shimao
sumber
Apa yang Anda sarankan untuk meningkatkan kinerja?
4
1: menambah ukuran batch menjadi 32 atau 64. 2: mengecilkan ukuran lapisan FC menjadi mungkin 1024 atau 2048 unit dan melihat apakah itu membantu. 3: Berhenti lebih awal. Ada kemungkinan bahwa jaringan Anda telah konvergen atau mulai overfitting sebelum Anda menyelesaikan zaman pertama Anda, dalam hal ini Anda harus berlatih lebih sedikit.
Haruskah saya mengurangi langkah per zaman?
Pradyumna Rahul
@shimao apa yang Anda maksud dengan "kurang berlatih"? Apakah maksud Anda menggunakan lebih sedikit data?
StatsSorceress
3

Seperti kata shimao, itu tentang apa yang kamu harapkan. Meskipun tidak memiliki banyak lapisan, ukuran input 512x512 adalah gambar besar yang harus dibelit. Waktu komputasi yang besar kemungkinan lebih karena menggabungkan 64 filter pada gambar besar, daripada lapisan yang sepenuhnya terhubung.

Jaringan yang Anda kumpulkan memiliki hambatan informasi yang lucu di dalamnya. Anda memulai dengan 64 filter pada gambar berukuran asli, hanya berkurang karena ukuran gambar Anda berkurang. Saat gambar melewati jaringan Anda, fitur yang Anda pelajari menjadi lebih dan lebih abstrak dan kompleks. Lapisan Conv2D (32, (3, 3)) Anda pada dasarnya membatasi jaringan untuk mempelajari peta 128x128 dengan 32 fitur.

Sebagian besar arsitektur jaringan menggandakan jumlah fitur setiap kali mereka pool, dan arsitektur imagenet terbaru benar-benar membuang lapisan yang sepenuhnya terhubung dalam mendukung kolam rata-rata di atas peta fitur akhir, dan pada dasarnya melakukan regresi logistik pada output pool itu.

Coba mulai dengan lebih sedikit filter, katakan 16 di lapisan konvolusi pertama Anda, dua kali lipat setiap kali Anda melangkah atau menyatu. Lakukan ini beberapa kali lebih banyak daripada Anda, untuk meningkatkan bidang penerimaan dan mengurangi ukuran peta fitur. Lakukan ini hingga 64x64 atau 32x32, yang akan menjadi 128 atau 256 filter. Anda dapat menggunakan Keras 'Global Avg atau Max pooling untuk menghilangkan lapisan yang terhubung sepenuhnya juga. Itu seharusnya sekitar dua kali lipat kecepatan jaringan, dan saya akan mengharapkan peningkatan akurasi pada saat yang sama.

mpotma
sumber
Nah, arsitektur jaringan didasarkan pada makalah penelitian yang saya coba untuk mereproduksi. lirmm.fr/%7Echaumont/publications/…
Pradyumna Rahul