به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

سلام
من با استفاده از train generator اومدم تصویر رو دادم به تنسور
سوال :
1- چرا با رم دو گیگ گرافیک بیشتر از دو batch size میدم گرافیک پر میشه و اجرا نمیشه ؟(تصاویر 300*800 هستند)
2-در قسمت نمایش خطا چرا با وجود دادن دیتا ولیدیشن نمایش داده نمیشه مثل val_acc , loss_acc ? آیا داره دیتا ولیدیشن رو چک میکنه ؟

[==========] - ETA: 5:34:24 - loss: 0.6931 - acc: 0.518616375/27823 [=.....] - ETA: 5:32:15 - loss: 0.6931 - acc: 0.5182T

3- learning rate decreasing همون decay هست تو optimizer ?
4- بهترین learning rate رو باید دستی به دست آورد یا راه بهتری هست ؟
5- معمولا تو VGG ,... بهترین روش optimizer چی هست ؟
6- این خط ImageDataGenerator(rescale=1./255 میاد مقدار پیکسل رو تقسیم بر 255 میکنه که نرمال بشه ؟
با تشکر


width=300
height=800

batch_size = 2

test_datagen = ImageDataGenerator(rescale=1./255)

train_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'f:/train',  # this is the target directory
        target_size=(width, height),  # all images will be resized to 150x150
        batch_size=batch_size,
        color_mode= "grayscale",
        class_mode='binary')  # since we use binary_crossentropy loss, we need binary labels

# this is a similar generator, for validation data
validation_generator = test_datagen.flow_from_directory(
        'f:/validation',
        target_size=(width, height),
        batch_size=batch_size,
        color_mode= "grayscale",
        class_mode='binary')

  


from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense

model = Sequential()


#vgg16
model.add(Conv2D(64, (3, 3), input_shape=(width, height,1))) #??????????????????????????????????????????????????????
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3))) #??????????????????????????????????????????????????????
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(128, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(256, (3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(256, (3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(256, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))


model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(512, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(100))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(100))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))



#sgd = keras.optimizers.rmsprop(lr=0.001) #, decay=0.1
sgd = keras.optimizers.Adadelta(lr=0.001) #, decay=0.1


model.compile(loss='binary_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])


# gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333) 
# sess = tf.Session(config=tf.ConfigProto(log_device_placement=True, gpu_options=gpu_options))
 

model.fit_generator(
        train_generator,
        steps_per_epoch=int(train_generator.samples/train_generator.batch_size),
        epochs=5,
        validation_data=validation_generator,
        validation_steps=int(validation_generator.samples/validation_generator.batch_size))
توسط (208 امتیاز)

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام.
1- حجم مورد نیازتون رو باید محاسبه کنید. شما از شبکه VGG مثلا 16 لایه باید ببینید که چقدر حافظه برای هر عکس نیاز دارید. برای VGG 16 حدود 140 ملیون پارامتر داره (وزنها) که اگه هر کدوم 32 بیت باشه (4 بایت) حجم حدود 560 مگابایتی داره و اگه دقت وزنها double باشه (8بایت) میشه حدود 1.1 گیگ حافظه. این مقدار از حافظه فقط برای لود کردن شبکه مصرف میشه. برای ترین شبکه نیاز به حافظه برای نگه داری خروجی نورون ها برای هر تکرار هست. مثلا برای همین شبکه برای هر عکس ورودی با سایز 224 در 224 چیزی در حدود 93 مگابایت (اگه دقت 32 بیتی داشته باشیم) حافظه لازمه و اگه دقت 64 بیتی باشه این مقدار دو برابر میشه یعنی 186 مگابایت برای هر عکس. حالا اگه شبکه شما به جای 16 لایه 19 لایه باشه این اعداد بیشتر هم میشن. (محاسبات این اعداد رو میتونید تو لکچر 7 ام کورس استفورد شبکه های کانولوشنی مربوط به سال 2016 ببینید. همچنین تو لینک زیر). ضمنا توجه کنید که شما در ورودی از تصویر با سایز 800 در 300 استفاده کردید که حجم رو خیلی زیاد کرده. ( حدودا حجمش رو 5 برابر میکنه یعنی برای هر عکس حجم تقریبا 450 مگابایتی اشغال میکنه (با 32 بیت دقت). اگه بچ سایز 2 باشه حجمی تقریبا برابر با 2*450+560 یعنی حدود 1460 مگابایت اشغال میشه.

INPUT:     [224x224x3]    memory:  224*224*3=150K   weights: 0
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*3)*64 = 1,728
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*64)*64 = 36,864
POOL2:     [112x112x64]   memory:  112*112*64=800K  weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*128)*128 = 147,456
POOL2:     [56x56x128]    memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2:     [28x28x256]    memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [14x14x512]    memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [7x7x512]      memory:  7*7*512=25K      weights: 0
FC:        [1x1x4096]     memory:  4096             weights: 7*7*512*4096 = 102,760,448
FC:        [1x1x4096]     memory:  4096             weights: 4096*4096 = 16,777,216
FC:        [1x1x1000]     memory:  1000             weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters

2- در مورد سوال دومتون: تا جایی که یادمه مقدار loss و accuracy برای داده ولیدیشن رو در انتهای هر اپوک محاسبه میکنه.
3- پارامتر learning rate decreasing مربوط به تنظیم کاهش نرخ یادگیری هستش. معمولا نرخ یادگیری رو به مرور کاهش میدن.
4- با صحیح و خطا میشه بدست آورد یا با روشی مثل grid search یا رندم سرچ. . ولی بهتر اینه که برای تعداد تکرار کم (مثلا 1000 تکرار اول) نمودار خطا بر حسب تکرار رو به ازای نرخهای یادگیری مختلف رسم کنید و و از بالاترین نرخ یادگیری ممکن که شبکه میتونه داشته باشه استفاده کنید . در ضمن حتما نتو شبکتون از batch norm استفاده کنید تا بتونید نرخ یادگیری بالاتری داشته باشید. معمولا نرخ یادگیری رو با 0.01 تا 0.001 شروع میکنن.
5- مستقل از نوع شبکه معمولا تو شبکه های عمیق از adam به عنوان انتخاب اول صحبت میشه. rmsprop هم جز گزینه های پر کاربرد هست. ولی از SGD عادی معمولا استفاده نمیشه.
6- بله. میاد بین صفر تا یک مپ میکنه ورودی شبکه رو.
نکته کلی در مورد کارتون این که ترین همچین شبکه بزرگی اونم با این شرایط اولیه که از مدل از پیش آموزش دیده استفاده نکردید درست به نظر نمیاد. درسترش اینه که از مدل آموزش دیده روی یه دیتای بزرگ مثل imagenet استفاده کنید برای شروع شبکتون. ضمنا به جای این شبکه با این حجم از محاسبات از شبکه های دیگه با تعداد لایه های کمر استفاده کنید.

توسط (540 امتیاز)
انتخاب شده توسط
ممنونم
دقت 32 بیتی رو ما مشخص میکنیم ؟
نرخ یادگیری که مقدار بیشتری داشته باشه و دقت بهتری داشته باشه رو انتخاب میکنیم ؟
دقت 32 بیتی رو ما مشخص میکنیم. (البته شبکه ای قبلا ترین شده با یه دقت خاصی ترین شده). اکثرا دقت 32 بیتی هست. حتی تو بعضی کارا دقت 16 بیتی هم استفاده کردن. ولی پیشفرض اکثر کارا 32 بیتی هستش. شما وقتی عکسی رو لود میکنید جنسش عموما uint 8 بیتی هست که معمولا وقتی بین صفر و یک مپ میکنن دقتش رو میکنن float32 بیتی.
نرخ یادگیری که دقت و مقدار بیشری داره رو انتخاب میکنیم. ولی معمولا نرخ یادگیری رو سعی میکنن بالا بگیرن و مثلا هر 10 تا epoch نرخ یادگیری رو تقسیم بر 10 کنن.این طوری برای گام های اولیه شبکه سریع ترین میشه و در گام های بعدی شبکه با سرعت تغییرات کمتر ولی دقت بالاتر ترین میشه.
...