ทำไมการฝึกอบรมใช้เวลานานมากกับ GPU ของฉัน


10

รายละเอียด:

GPU : GTX 1080

การฝึกอบรม : ~ 1.1 ล้านภาพเป็นของ 10 คลาส

การตรวจสอบความถูกต้อง : ~ 150 ภาพที่เป็นของ 10 คลาส

เวลาต่อยุค : ~ 10 ชั่วโมง

ฉันตั้งค่า CUDA, cuDNN และ Tensorflow (Tensorflow GPU ด้วย)

ฉันไม่คิดว่าแบบจำลองของฉันมีความซับซ้อนซึ่งใช้เวลา 10 ชั่วโมงต่อยุค ฉันยังตรวจสอบว่า GPU ของฉันเป็นปัญหาหรือไม่

เป็นเวลาการฝึกอบรมเนื่องจากเลเยอร์ที่เชื่อมต่อเต็มที่หรือไม่

โมเดลของฉัน:

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']
          )

เพราะมีข้อมูลจำนวนมากฉันใช้ 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"
)

2
ฉันโหวตให้ย้ายสิ่งนี้ไปยังสแต็คล้น แต่จริงๆแล้วมันเป็นของการแลกเปลี่ยนข้อมูลทางวิทยาศาสตร์, IMO
generic_user

generic_user: "data science" อาจใช้ "machine learning" แต่ไม่ใช่ทั้งหมด "machine learning" สำหรับ "data science" (ML เป็นเพียงเครื่องมืออีกอันหนึ่งเทนเซอร์โฟลว์เป็นอีกไลบรารีหนึ่ง ML อาจจะใช้ในไม่ช้า (ถ้ายังไม่ได้ใช้) แม้สำหรับงานทั่วไปเช่นการจัดการไฟล์คุณสมบัติการตั้งค่าของผู้ใช้)
michael

ดูเพิ่มเติมที่เกี่ยวข้อง (TL; DR: ตรวจสอบการทำงานจริงใน GPU ดูที่สถิติ GPU ที่สามารถให้ TF) stackoverflow.com/questions/42527492/... stackoverflow.com/questions/38559755/...
ไมเคิล

ฉันได้ลองวิธีการนั้นแล้วและระบุว่ามีการใช้ GPU ปัจจุบันของฉัน เพื่อยืนยันฉันยังใช้nvidia-smiเพื่อตรวจสอบการใช้ GPU และมันผันผวนระหว่าง 85% -99%
Pradyumna Rahul

คำตอบ:


7

นั่นเป็นเรื่องที่คาดหวัง หากคุณแบ่งจำนวนวินาทีตามจำนวนภาพที่คุณดำเนินการคุณจะได้รับ 33 มิลลิวินาทีต่อภาพซึ่งดูเหมือนว่าเหมาะสมสำหรับเครือข่ายขนาดเล็กเช่นนั้น เครือข่ายขนาดใหญ่มักใช้เวลาใน ballpark 50 ถึง 200 มิลลิวินาทีต่อภาพ

ใช่เลเยอร์หนาแน่นขนาดใหญ่น่าจะส่งผลกระทบต่อประสิทธิภาพการทำงานของคุณเนื่องจากเป็นเมทริกซ์ขนาดใหญ่ (256 x 4096) และการคูณเมทริกซ์ขนาดใหญ่เพื่อให้เข้ากันได้ทุกครั้งที่คุณใช้เครือข่าย


คุณต้องการแนะนำอะไรเพื่อปรับปรุงประสิทธิภาพ

4
1: เพิ่มขนาดแบทช์เป็น 32 หรือ 64 2: ลดขนาดของเลเยอร์ FC เป็น 1024 หรือ 2048 ยูนิตและดูว่ามันช่วยได้หรือไม่ 3: หยุดต้น อาจเป็นไปได้ว่าเครือข่ายของคุณมีการรวมตัวกันหรือเริ่มทำการ overfitting ก่อนที่คุณจะจบยุคแรกซึ่งในกรณีนี้คุณควรฝึกให้น้อยลง

ฉันควรลดขั้นตอนต่อยุคหรือไม่
Pradyumna Rahul

@shimao คุณหมายถึงอะไรโดย "train less" คุณหมายถึงใช้ข้อมูลน้อยลงหรือไม่
StatsSorceress

3

ดังที่ shimao พูดนั่นคือสิ่งที่คุณคาดหวัง แม้จะมีเลเยอร์ไม่มาก แต่ขนาดอินพุตที่ 512x512 เป็นภาพขนาดใหญ่ที่น่าเชื่อถือ เวลาในการคำนวณขนาดใหญ่มีแนวโน้มมากขึ้นเนื่องจากมีการกรองตัวกรอง 64 ภาพมากกว่าภาพใหญ่แทนที่จะเป็นเลเยอร์ที่เชื่อมต่ออย่างสมบูรณ์

เครือข่ายที่คุณรวมเข้าด้วยกันมีคอขวดข้อมูลตลก ๆ อยู่ คุณเริ่มต้นด้วยฟิลเตอร์ 64 ภาพขนาดดั้งเดิมลดลงเมื่อขนาดรูปภาพของคุณลดลงเท่านั้น เมื่อภาพผ่านเครือข่ายของคุณคุณสมบัติที่คุณกำลังเรียนรู้จะกลายเป็นนามธรรมและซับซ้อนยิ่งขึ้น เลเยอร์ Conv2D (32, (3, 3)) ของคุณนั้น จำกัด เครือข่ายในการเรียนรู้แผนที่ 128x128 จาก 32 ฟีเจอร์

สถาปัตยกรรมเครือข่ายส่วนใหญ่จะเพิ่มจำนวนของคุณลักษณะสองเท่าทุกครั้งที่พวกเขารวมและสถาปัตยกรรม imagenet ล่าสุดจริง ๆ แล้วเชื่อมโยงเลเยอร์อย่างสมบูรณ์เพื่อสนับสนุนพูลเฉลี่ยเหนือแผนที่คุณลักษณะสุดท้าย

ลองเริ่มด้วยตัวกรองที่น้อยลงพูดถึง 16 ในเลเยอร์ Convol แรกของคุณเพิ่มเป็นสองเท่าในแต่ละครั้งที่คุณก้าวเท้าหรือพูล ทำเช่นนี้สองสามครั้งเพื่อเพิ่มเขตข้อมูลที่เปิดกว้างและลดขนาดแผนที่คุณลักษณะ ทำสิ่งนี้ลงไปที่ 64x64 หรือ 32x32 ซึ่งจะเป็นตัวกรอง 128 หรือ 256 คุณสามารถใช้การรวมส่วนกลางหรือการรวมกำไรสูงสุดของ Keras เพื่อกำจัดเลเยอร์ที่เชื่อมต่ออย่างสมบูรณ์เช่นกัน สิ่งนี้ควรเกี่ยวกับความเร็วของเครือข่ายเป็นสองเท่าและฉันคาดหวังว่าจะมีความแม่นยำเพิ่มขึ้นในเวลาเดียวกัน


สถาปัตยกรรมเครือข่ายนั้นอิงจากงานวิจัยที่ฉันพยายามทำซ้ำ lirmm.fr/%7Echaumont/publications/…
Pradyumna Rahul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.