আমি রিগ্রেশন-এর জন্য একটি সাধারণ কনভোলিউশনাল নিউরাল নেটওয়ার্ক প্রশিক্ষণ দিচ্ছি, যেখানে কাজটি কোনও চিত্রের একটি বাক্সের (x, y) অবস্থানের পূর্বাভাস দেওয়া, যেমন:
নেটওয়ার্কের আউটপুটটিতে দুটি নোড রয়েছে, একটি এক্স এর জন্য এবং একটি y এর জন্য। নেটওয়ার্কের বাকি অংশগুলি একটি স্ট্যান্ডার্ড কনভুলেশনাল নিউরাল নেটওয়ার্ক। ক্ষতিটি বাক্সের পূর্বাভাসিত অবস্থান এবং স্থল সত্যের অবস্থানের মধ্যে একটি স্ট্যান্ডার্ড গড় স্কোয়ার ত্রুটি। আমি এই চিত্রগুলির 10000 উপর প্রশিক্ষণ দিচ্ছি, এবং 2000 এ যাচাই করছি।
আমার যে সমস্যাটি হচ্ছে তা হ'ল তাৎপর্যপূর্ণ প্রশিক্ষণের পরেও ক্ষতিটি হ্রাস পায় না। নেটওয়ার্কের আউটপুট পর্যবেক্ষণ করার পরে, আমি লক্ষ্য করেছি যে নেটওয়ার্ক দুটি আউটপুট নোডের জন্য শূন্যের কাছাকাছি আউটপুট মানগুলিতে ঝোঁক করে। যেমন, বাক্সের অবস্থানের পূর্বাভাস সবসময় চিত্রের কেন্দ্রস্থলে থাকে। পূর্বাভাসে কিছু বিচ্যুতি থাকলেও সর্বদা শূন্যের কাছাকাছি থাকে। নীচে ক্ষতি দেখায়:
আমি এই গ্রাফটিতে প্রদর্শিত চেয়ে অনেক বেশি যুগের জন্য এটি চালিয়েছি, এবং ক্ষতি এখনও কমেনি। মজার ব্যাপার হল, ক্ষতি আসলে এক পর্যায়ে বৃদ্ধি পায়।
সুতরাং, দেখে মনে হচ্ছে নেটওয়ার্কটি ভাল ফিট শেখার পরিবর্তে প্রশিক্ষণের ডেটার গড়ের পূর্বাভাস দিচ্ছে। এটি কেন হতে পারে সে সম্পর্কে কোনও ধারণা? আমি প্রাথমিক মানের ০.০১ শিক্ষার হার সহ অ্যাডামটিকে অপ্টিমাইজার হিসাবে ব্যবহার করছি এবং অ্যাক্টিভেশন হিসাবে পুনরায় রেখেছি
আপনি যদি আমার কিছু কোডে (কেরাস) আগ্রহী হন তবে এটি নীচে রয়েছে:
# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))
# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)
# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)