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

با تشکر

دسته بندی ها

0 امتیاز

با سلام،
فرض کنید من می خوام تعدادی setting مختلف برای اندازه فیلتر لایه کانولوشن یا میزان pooling یا stride رو تست کنم. یه راه اینه که برای هر حالت یه فایل prototxt جداگانه بنویسم و اونها رو یکی یکی فراخوانی کنم و شبکه رو تست کنم. اما فکر کردم قاعدتا باید یه راه ساده تر وجود داشته باشه که بشه یه لوپ نوشت و این پارامترها رو در هر بار اجرا تغییر داد و شبکه رو آموزش داده و تست کرد. آیا چنین امکانی در کفی وجود داره؟

توسط (110 امتیاز)

1 پاسخ

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

سلام
بله باید با استفاده از netspec که مثالش تو پوشه examples هست معماری شبکه رو بصورت کد بنویسید . بعد چون کدنویسی هست دست خودتونه و هر هنری دارید میتونید اجرا کنید.
مثال زیر نحوه تعریف مدل رو در netspec نشون میده شیوه ترینینگ هم مثل قبل هست:

# helper function for common structures
def conv_relu(bottom, ks, nout, stride=1, pad=0, group=1):
    conv = L.Convolution(bottom, kernel_size=ks, stride=stride,
                                num_output=nout, pad=pad, group=group)
    return conv, L.ReLU(conv, in_place=True)

# another helper function
def fc_relu(bottom, nout):
    fc = L.InnerProduct(bottom, num_output=nout)
    return fc, L.ReLU(fc, in_place=True)

# yet another helper function
def max_pool(bottom, ks, stride=1):
    return L.Pooling(bottom, pool=P.Pooling.MAX, kernel_size=ks, stride=stride)

# main netspec wrapper
def caffenet_multilabel(data_layer_params, datalayer):
    # setup the python data layer 
    n = caffe.NetSpec()
    n.data, n.label = L.Python(module = 'pascal_multilabel_datalayers', layer = datalayer, 
                               ntop = 2, param_str=str(data_layer_params))

    # the net itself
    n.conv1, n.relu1 = conv_relu(n.data, 11, 96, stride=4)
    n.pool1 = max_pool(n.relu1, 3, stride=2)
    n.norm1 = L.LRN(n.pool1, local_size=5, alpha=1e-4, beta=0.75)
    n.conv2, n.relu2 = conv_relu(n.norm1, 5, 256, pad=2, group=2)
    n.pool2 = max_pool(n.relu2, 3, stride=2)
    n.norm2 = L.LRN(n.pool2, local_size=5, alpha=1e-4, beta=0.75)
    n.conv3, n.relu3 = conv_relu(n.norm2, 3, 384, pad=1)
    n.conv4, n.relu4 = conv_relu(n.relu3, 3, 384, pad=1, group=2)
    n.conv5, n.relu5 = conv_relu(n.relu4, 3, 256, pad=1, group=2)
    n.pool5 = max_pool(n.relu5, 3, stride=2)
    n.fc6, n.relu6 = fc_relu(n.pool5, 4096)
    n.drop6 = L.Dropout(n.relu6, in_place=True)
    n.fc7, n.relu7 = fc_relu(n.drop6, 4096)
    n.drop7 = L.Dropout(n.relu7, in_place=True)
    n.score = L.InnerProduct(n.drop7, num_output=20)
    n.loss = L.SigmoidCrossEntropyLoss(n.score, n.label)
    
    return str(n.to_proto())

اینجا رو هم ببینید خوبه . ولی یادتون باشه کفی در همین بخش بطور خاص خیلی مشکل داره (بخاطر مستنداتش) برای اینکه بفهمید چیکار باید بکنید یا چه توابعی در اختیار دارید باید از طریق مثالهایی که هست بفهمید یا اینکه رپر پایتونی که وجود داره رو باز کنید و تک تک فایلها رو بخونید و از کامنتها و کدها متوجه بشید چه چیزی وجود داره و چیکار باید کرد. کارهای عادی مثالهاش هست اما یکم بیشتر ادم بخواد کار واقعا بمشکل میخوره.

توسط (4.3k امتیاز)
انتخاب شده توسط
ممنون از پاسخ. من مثال netsurgery رو نگاه کردم اما چیزی که من لازم دارم تغییر ضرایب و بایاس فیلترها نیست بلکه اندازه خود فیلتر لایه کانولوشن هست. توی netsurgery بحثش تا جایی که من متوجه شدم یا تغییر ضرایب و بایاس است یا اینکه بخشی از شبکه ای که قبلا تعریف شده رو به یک شبکه دیگه منتقل کنیم، که باز هم در این حالت پارامترهای ساختاری هر دو تا شبکه باید قبلا تو قایل prototxt تعریف شده باشه و اون پارامترهایی که توی فایل prototxt تعریف میشه تو کد ما قابل تغییر نیست (مثلا تعداد فیلترهای لایه کانولوشن یا میزان pooling). آیا چنین تغییراتی رو میشه به صورت دینامیک انجام داد؟
سلام. نه netspec اجازه تعریف یک شبکه کامل رو بشما میده . من تو مثال یه اشتباه کردم. (فکر کردم تو نت سرجری ما از Netspec استفاده کردیم برای همین ارجاع به اون دادم) لینک مثال رو دوباره دادم و توضیحات تکمیلی هم دادم .
خیلی ممنون از توضیح تون. آیا در این خصوص تنسورفلو امکانات راحت تر و دسترسی ساده تری می ده؟
سلام . برای کد نویسی بله حتما تنسورفلو نسبت به کفی پیشنهاد میشه. کفی واقعا یه افتضاح به تمام معناس وقتی صحبت از مستندات میشه.  فقط زمانی خوبه که شما حداقل یکبار کل سورس کد رو از اول تا اخر خودتون خونده باشید تحلیل کرده باشید و گرفته باشید هر بخش چیکار میکنه اونوقت خب دیگه هر کاری خواستید میتونید بکنید. البته بخش سی++اش بهتر از پایتونشه و توابع و کلاسها یه توضیحات حداقلی دارن اما پایتون خیلی بده. الان اگرم کاری بخوایید بکنید با کفی با سی++ کنید شاید بهتر باشه قبلا اینطور نبود برعکس همیشه گفته میشد برید پایتون بهتره ما مثالها رو تو پایتون میزنیم و... بعد اینم رفت برای خودش) و من خودم شخصا وقت خیلی زیادی ازم تلف شد بخاطر نبود مستندات درست و حسابی. اینم بگم که API سی++ با پایتون متفاوته اینطور نیست که فک کنید مستندات رو میرم از کدای سی++ میخونم بعد میام تو پایتون کدش رو میزنم .نه متاسفانه اینجا هم یه داستان دیگه داره . مثلا MemoryDataLayer از طریق پایتون ساختش اصلا پشتیبانی نمیشه ولی سی++ هیچ مشکلی نداره. خلاصه اگه سرتون برای دردسر درد نمیکنه و دوست ندارید اذیت بشید بیخیال شید و با تنسورفلو هرکاری میخوایید رو انجام بدید.
...