แนวทางการเรียนรู้เชิงลึกหลายแบบจำลองสำหรับการทำความเข้าใจรูปภาพและข้อความ
ด้วยความก้าวหน้าของ "การเรียนรู้เชิงลึก" เช่น "เครือข่ายประสาทเทียม" (เช่น "ConvNet") [1] "คอมพิวเตอร์วิทัศน์" จึงกลายเป็นหัวข้อการวิจัยทางวิทยาศาสตร์ที่ร้อนแรงอีกครั้ง เป้าหมายหลักประการหนึ่งของคอมพิวเตอร์วิทัศน์ในปัจจุบันคือการใช้การเรียนรู้ของเครื่อง (โดยเฉพาะการเรียนรู้เชิงลึก) เพื่อฝึกคอมพิวเตอร์ให้ได้รับความเข้าใจในระดับมนุษย์จากภาพดิจิทัล ข้อความ หรือวิดีโอ
ด้วยการใช้งานอย่างแพร่หลาย ConvNet จึงกลายเป็นโมเดลสำหรับการจดจำรูปภาพโดยพฤตินัย ตามที่อธิบายไว้ใน [1] โดยทั่วไป มีสองวิธีในการใช้ ConvNet สำหรับคอมพิวเตอร์วิทัศน์:
- การฝึกอบรมโมเดล ConvNet ใหม่ตั้งแต่เริ่มต้น
- การใช้ การถ่ายโอนการเรียนรู้ นั่นคือการใช้โมเดล ConvNet ที่ได้รับการฝึกอบรมล่วงหน้า
ดังที่แสดงในแผนภาพต่อไปนี้ โมเดล ConvNet ประกอบด้วยสองส่วน: convolutional base และ ลักษณนาม ที่เชื่อมต่อโดยสมบูรณ์
รูปที่ 1:สถานการณ์ทั่วไปของการเรียนรู้การถ่ายโอน ConvNet
การเรียนรู้การถ่ายโอน ConvNet สามารถแบ่งย่อยเพิ่มเติมได้เป็นสามวิธี:
- วิธีที่ 1: การแยกคุณสมบัติโดยไม่มีข้อโต้แย้งเกี่ยวกับรูปภาพ [1]
วิธีการนี้ใช้ฐานการบิดที่ได้รับการฝึกอบรมมาล่วงหน้าเพื่อแปลงรูปภาพใหม่ให้เป็นอาร์เรย์ เช่น อาร์เรย์ Numpy (สามารถบันทึกเป็นไฟล์ได้หากจำเป็น) ) ก่อน จากนั้นจึงใช้การแทนค่าอาร์เรย์ของรูปภาพในหน่วยความจำเพื่อฝึกโมเดลการจัดหมวดหมู่ใหม่ที่แยกจากกันด้วยน้ำหนักเริ่มต้นแบบสุ่ม - วิธีที่ 2: การแยกคุณลักษณะด้วยการโต้แย้งรูปภาพ [1]
วิธีการนี้จะสร้างโมเดลใหม่ที่มีฐาน Convolutional ที่ได้รับการฝึกไว้ล่วงหน้าเป็นเลเยอร์อินพุต หยุดน้ำหนักของฐาน Convolutional และสุดท้าย เพิ่มลักษณนามเอาต์พุตใหม่พร้อมน้ำหนักเริ่มต้นแบบสุ่ม - วิธีที่ 3: การปรับแบบละเอียด [1]
วิธีนี้ไม่ใช้ฐานการบิดที่ฝึกไว้ล่วงหน้าแบบแช่แข็งทั้งหมด ช่วยให้คลายการแช่แข็งชั้นบนสุดของฐาน Convolutional ที่ผ่านการฝึกอบรมมาแล้วแบบแช่แข็งได้ เพื่อให้ชั้นบนสุดที่ไม่แช่แข็งเหล่านั้นสามารถฝึกร่วมกับตัวแยกประเภทที่เชื่อมต่ออย่างสมบูรณ์ตัวใหม่ได้
วิธีที่ 2 ใช้ในบทความนี้สำหรับการเรียนรู้การถ่ายโอนแบบจำลองหลายอินพุต
แนวคิดหลักเบื้องหลังการเรียนรู้แบบถ่ายโอนสามารถใช้ได้ไม่เพียงแต่กับ ConvNet ที่มีการดูแลเท่านั้น แต่ยังรวมถึงอัลกอริธึมการเรียนรู้เชิงลึกอื่นๆ ด้วย เช่น โมเดล การฝังคำ ที่ไม่มีผู้ดูแลสำหรับการประมวลผลภาษาธรรมชาติ ("NLP")[4]
มีโมเดลการฝังคำที่ได้รับการฝึกล่วงหน้ายอดนิยมอยู่สองโมเดล: word2vec และ GloVe [3] เช่นเดียวกับโมเดล word2vec-keras ที่ใช้ใน [4] โมเดลการฝังคำที่ได้รับการฝึกอบรมล่วงหน้าเหล่านี้มักจะรวมกับอัลกอริธึมการเรียนรู้เชิงลึกที่ได้รับการดูแลอื่นๆ เช่น "โครงข่ายประสาทเทียมที่เกิดซ้ำ" (RNN) "LSTM" สำหรับ "NLP" เช่น การจำแนกข้อความ [4]
โมเดล ConvNet หรือโมเดล NLP (เช่น การรวมกันของคำที่ฝังด้วย LSTM) สามารถใช้แยกกันเพื่อแก้ไขปัญหาที่น่าสนใจมากมายในคอมพิวเตอร์วิทัศน์และ NLP ตามที่แสดงไว้ในบทความนี้ โมเดลประเภทต่างๆ เหล่านี้ยังสามารถนำมารวมกันได้หลายวิธี [1] เพื่อสร้างโมเดลที่มีประสิทธิภาพยิ่งขึ้นเพื่อจัดการกับปัญหาที่ท้าทายมากขึ้น เช่น “ระบบอัตโนมัติกระบวนการเคลมประกัน” ที่ไม่เพียงต้องการความสามารถในการจดจำภาพเท่านั้น แต่ยังรวมถึงความเข้าใจภาษาธรรมชาติ (เช่น ข้อความ) ด้วย
บทความนี้ใช้ชุดข้อมูลที่น่าสนใจแต่ท้าทายใน Kaggle "ความท้าทายในการเรียนรู้การเป็นตัวแทน: การเรียนรู้แบบหลายรูปแบบ" [2] เพื่อนำเสนอโมเดลการเรียนรู้การถ่ายโอนหลายอินพุตใหม่ที่รวมเอาโมเดลอินพุตสองโมเดลเข้ากับชั้นการจำแนกประเภทที่เชื่อมต่อกันอย่างสมบูรณ์สำหรับทั้งสอง การจดจำรูปภาพและการจดจำแท็กคำในเวลาเดียวกัน (ดูรูปที่ 2)
แนวคิดหลักเบื้องหลังโมเดลอินพุตหลายตัวใหม่คือการแปลปัญหาการจดจำรูปภาพและแท็กคำให้กลายเป็นปัญหาการจำแนกการเรียนรู้ของเครื่อง กล่าวคือ การกำหนดว่ารูปภาพที่กำหนดตรงกับชุดแท็กคำที่กำหนดหรือไม่ (0-ไม่ใช่ 1-ใช่)
1. การเตรียมข้อมูล
หลังจากที่ชุดข้อมูล Kaggle ของไฟล์รูปภาพและไฟล์แท็กคำ [2] ได้รับการดาวน์โหลดลงในเครื่องท้องถิ่นแล้ว โค้ดด้านล่างสามารถใช้เพื่อสร้างและสับเปลี่ยนรายการชื่อไฟล์รูปภาพและชื่อไฟล์แท็กคำที่เกี่ยวข้องได้ มีไฟล์รูปภาพ 100,000 ไฟล์และไฟล์แท็กคำที่เกี่ยวข้อง 100,000 ไฟล์ในชุดข้อมูลเพื่อวัตถุประสงค์ในการฝึกอบรม
original_dataset_dir = './multi_task_learning/data/ESPGame100k' base_dataset_dir = './multi_task_learning/data/ESPGame100k_small' original_label_path = original_dataset_dir + '/labels' original_label_files = [f for f in listdir(original_label_path) if isfile(join(original_label_path, f))] original_image_path = original_dataset_dir + '/thumbnails' original_image_files = [f for f in listdir(original_image_path) if isfile(join(original_image_path, f))] original_image_files = np.array(original_image_files) original_label_files = np.array(original_label_files) dataset_size = original_label_files.shape[0] perm = np.arange(dataset_size) np.random.shuffle(perm) original_image_files = original_image_files[perm] original_label_files = original_label_files[perm]
เพื่อฝึกโมเดลที่มีอินพุตหลายอินพุตใหม่บนแล็ปท็อปภายในระยะเวลาที่เหมาะสม (ไม่กี่ชั่วโมง) ฉันจึงสุ่มเลือกรูปภาพ 2,000 ภาพและไฟล์แท็กคำ 2,000 คำที่เกี่ยวข้องสำหรับการฝึกโมเดลสำหรับบทความนี้:
if not os.path.isdir(base_dataset_dir): os.mkdir(base_dataset_dir) small_label_path = os.path.join(base_dataset_dir, 'labels') small_image_path = os.path.join(base_dataset_dir, 'thumbnails') if not os.path.isdir(small_label_path): os.mkdir(small_label_path) if not os.path.isdir(small_image_path): os.mkdir(small_image_path) for fname in original_label_files[:2000]: src = os.path.join(original_label_path, fname) dst = os.path.join(small_label_path, fname) shutil.copyfile(src, dst) for fname in original_label_files[:2000]: img_fname = fname[:-5] src = os.path.join(original_image_path, img_fname) dst = os.path.join(small_image_path, img_fname) shutil.copyfile(src, dst)
โค้ดด้านล่างนี้คือการโหลดชื่อไฟล์แท็กรูปภาพ 2,000 ชื่อและแท็กคำ 2,000 แท็กที่เกี่ยวข้องลงใน Pandas DataFrame:
label_map = {'label_file' : [], 'word_tags' : []} for fname in listdir(small_label_path): f = join(small_label_path, fname) if isfile(f): f = open(f) label_map['label_file'].append(fname) line = f.read().splitlines() label_map['word_tags'].append(line) label_df = pd.DataFrame(label_map) label_df.head()
เช่นเดียวกับ [4] ขั้นตอนการประมวลผลข้อมูลล่วงหน้าที่เป็นข้อความจะรวมอยู่ในสมุดบันทึก Jupyter [5] เพื่อดำเนินการประมวลผลข้อมูลล่วงหน้าขั้นต่ำ เช่น ลบคำหยุดและตัวเลข ในกรณีที่สร้างความแตกต่างที่มีนัยสำคัญ:
ตามที่อธิบายไว้ใน [4] ผลกระทบของการประมวลผลข้อมูลล่วงหน้าที่เป็นข้อความไม่มีนัยสำคัญ ดังนั้นแท็กคำดิบที่ไม่มีการประมวลผลล่วงหน้าจึงถูกนำมาใช้สำหรับการฝึกโมเดลในบทความนี้
2. สถาปัตยกรรมของการเรียนรู้แบบถ่ายโอนแบบจำลองหลายอินพุต
ดังที่แสดงในแผนภาพด้านล่าง โมเดลการเรียนรู้การถ่ายโอนหลายอินพุตใหม่ใช้โมเดล ConvNet ที่ได้รับการฝึกล่วงหน้า VGG16 สำหรับการรับและจัดการรูปภาพและโมเดล NLP ใหม่ (การผสมผสานระหว่างโมเดลการฝังคำที่ผ่านการฝึกอบรมมาแล้ว GloVe และ Keras LSTM ) สำหรับการรับและจัดการแท็กคำ โมเดลอินพุตทั้งสองนี้จะถูกรวมเข้าด้วยกันก่อนแล้วจึงรวมกับโมเดลการจำแนกเอาท์พุตที่เชื่อมต่ออย่างสมบูรณ์ซึ่งใช้ทั้งเอาท์พุตของโมเดลการจดจำรูปภาพและเอาท์พุตของโมเดล NLP เพื่อพิจารณาว่าคู่อินพุตของรูปภาพและชุดของแท็กคำนั้นหรือไม่ การแข่งขัน (0-ไม่, 1-ใช่)
รูปที่ 2: สถาปัตยกรรมของโมเดลการเรียนรู้เชิงลึกใหม่สำหรับโมเดลการเรียนรู้แบบหลายอินพุต
3. ถ่ายทอดการเรียนรู้เพื่อการจดจำภาพ
ดังแสดงในรูปที่ 2 โมเดลการเรียนรู้การถ่ายโอนหลายอินพุตใหม่ใช้โมเดล ConvNet VGG16 ที่ได้รับการฝึกล่วงหน้าสำหรับการจดจำรูปภาพ โมเดล VGG16 ได้รวมอยู่ในไลบรารี Keras แล้ว รหัสต่อไปนี้จาก [1] ใช้เพื่อรวมฐานการหมุนวน VGG16 เข้ากับตัวแยกประเภทที่เชื่อมต่ออย่างสมบูรณ์ใหม่เพื่อสร้างรูปแบบอินพุตการรับรู้ภาพใหม่:
from keras.applications import VGG16 image_input = Input(shape=(150, 150, 3), name='image') vgg16 = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))(image_input) x = layers.Flatten()(vgg16) x = layers.Dense(256, activation='relu')(x)
4. ถ่ายทอดการเรียนรู้เพื่อการจำแนกข้อความ
ดังที่แสดงในรูปที่ 2 โมเดลการเรียนรู้การถ่ายโอนข้อมูลแบบหลายอินพุตใหม่ใช้โมเดลการฝังคำที่ได้รับการฝึกไว้ล่วงหน้า GloVe [3] สำหรับการแปลงแท็กคำให้เป็นเวกเตอร์ขนาดเล็ก เมื่อดาวน์โหลดชุดข้อมูล GloVe [3] ลงในเครื่องแล้ว สามารถใช้โค้ดต่อไปนี้จาก [1] เพื่อโหลดโมเดลคำที่ฝังลงในหน่วยความจำ:
glove_dir = './multi_task_learning/data/' embeddings_index = {} f = open(os.path.join(glove_dir, 'glove.6B.100d.txt')) for line in f: values = line.split() word = values[0] coefs = np.asarray(values[1:], dtype='float32') embeddings_index[word] = coefs f.close()
ดังที่เห็นในรูปที่ 2 การฝังคำของ GloVe จะถูกรวมเข้ากับ Keras LSTM เพื่อสร้างโมเดลอินพุต NLP ใหม่สำหรับการทำนาย/การรับรู้แท็กคำ:
tag_input = Input(shape=(None,), dtype='int32', name='tag') embedded_tag = layers.Embedding(max_words, embedding_dim)(tag_input) encoded_tag = layers.LSTM(512)(embedded_tag)
5. การรวมโมเดลหลายอินพุตเข้ากับลักษณนามที่เชื่อมต่ออย่างสมบูรณ์
เมื่อสร้างโมเดลอินพุตการจดจำรูปภาพใหม่และโมเดลอินพุต NLP ใหม่แล้ว โค้ดต่อไปนี้สามารถรวมเข้ากับตัวแยกประเภทเอาต์พุตใหม่ให้เป็นโมเดลการเรียนรู้การถ่ายโอนหลายอินพุตเดียว:
concatenated = layers.concatenate([x, encoded_tag], axis=-1) output = layers.Dense(1, activation='sigmoid')(concatenated)model = Model([image_input, tag_input], output) model.summary()
ตามที่อธิบายไว้ใน [1] ทั้งฐาน Convolutional VGG16 ที่ได้รับการฝึกล่วงหน้าและเลเยอร์การฝังคำ GloVe จะต้องถูกแช่แข็งเพื่อไม่ให้น้ำหนักที่ได้รับการฝึกล่วงหน้าของโมเดลเหล่านั้นจะไม่ได้รับการแก้ไขในระหว่างการฝึกโมเดลหลายอินพุตใหม่:
# model.layers[1].trainable = False # freeze VGG16 model.layers[4].set_weights([embedding_matrix]) model.layers[4].trainable = False # freeze GloVe word embedding
อย่างไรก็ตาม สำหรับฐานการหมุนวน VGG16 เป็นที่น่าสนใจที่จะทราบว่าฉันได้ลองทั้งสองวิธี (แช่แข็งหรือไม่แช่แข็ง) แต่ไม่เห็นความแตกต่างที่มีนัยสำคัญในแง่ของเวลาการฝึกโมเดลหรือผลการทำนายโมเดล
6. การฝึกอบรมแบบจำลองหลายอินพุต
ชุดข้อมูลการฝึกอบรม Kaggle ดั้งเดิมจะมีเพียงคู่รูปภาพที่ถูกต้องและแท็กคำที่เกี่ยวข้องเท่านั้น คู่ที่ถูกต้องแต่ละคู่จะมีป้ายกำกับเป็น 1 (ตรงกัน) ในบทความนี้ (ดูโค้ดด้านล่างด้วย) เพื่อสร้างชุดข้อมูลที่สมดุล โค้ดต่อไปนี้จะสร้างคู่รูปภาพและแท็กคำที่ไม่ถูกต้อง 2,000 คู่ นอกเหนือจากคู่รูปภาพและแท็กคำที่ถูกต้อง 2,000 คู่ที่มีอยู่ เพื่อความง่าย สามารถทำได้โดยการจับคู่แต่ละภาพ (เช่น รูปภาพ i) จากรูปภาพ 2,000 ภาพที่เลือก กับแท็กคำของไฟล์รูปภาพถัดไป (เช่น แท็กคำของรูปภาพ i+1)
import cv2 dim = (150, 150) X_image_train = [] X_tag_train = tag_data y_train = [] for fname in listdir(small_image_path): fpath = os.path.join(small_image_path, fname) im = cv2.imread(fpath) im_resized = cv2.resize(im, dim, interpolation = cv2.INTER_AREA) X_image_train.append(im_resized) y_train.append(1) # add incorrect image and tag pairs num_negative_samples = len(y_train) for i in range(num_negative_samples): image = X_image_train[i] X_image_train.append(image) j = (i + 1) % num_negative_samples # get a different tag tag = X_tag_train[j] X_tag_train = np.append(X_tag_train, tag) y_train.append(0)
มีรูปภาพและแท็กคำทั้งหมด 4,000 คู่ คู่ที่ถูก 2,000 คู่ และคู่ที่ไม่ถูกต้อง 2,000 คู่
แท็กคำรูปภาพแต่ละแท็กจะต้องเข้ารหัสเป็นจำนวนเต็ม และแต่ละรายการ/ลำดับของแท็กคำจะต้องแปลงเป็นลำดับของค่าจำนวนเต็มก่อนที่แท็กคำจะสามารถใช้งานได้โดยโมเดลการฝังคำ ซึ่งสามารถทำได้ดังต่อไปนี้โดยใช้และแก้ไขโค้ดใน [1]:
from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences maxlen = 100 training_samples = num_of_samples tag_vocabulary_size = 10000 max_words = tag_vocabulary_size num_of_samples = label_df.shape[0] tokenizer = Tokenizer(num_words=max_words) texts = [] for tag_list in label_df_clean['word_tags']: texts.append(' '.join(tag_list)) tokenizer.fit_on_texts(texts) sequences = tokenizer.texts_to_sequences(texts) word_index = tokenizer.word_index print('Found {} unique tokens'.format(len(word_index))) tag_data = pad_sequences(sequences, maxlen=maxlen)
ชุดข้อมูลการฝึกแท็กรูปภาพและคำที่ได้จะถูกแปลงเป็นอาร์เรย์ Numpy และสับเปลี่ยนสำหรับการฝึกโมเดล:
X_image_train = np.array(X_image_train) X_tag_train = np.array(X_tag_train) y_train = np.array(y_train) perm = np.arange(y_train.shape[0]) np.random.shuffle(perm) X_image_train = X_image_train[perm] X_tag_train = X_tag_train[perm] y_train = y_train[perm]
โมเดลอินพุตหลายอินพุตใหม่ได้รับการรวบรวมและฝึกฝนดังต่อไปนี้โดยมีเพียง 30 ยุคและคู่รูปภาพและแท็กคำที่สมดุล 4,000 คู่:
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) model.fit([X_image_train, X_tag_train], y_train, epochs=30, batch_size=64)
7. การทำนายแบบจำลอง
ดังที่แสดงด้านล่าง ชุดข้อมูลการทดสอบส่วนตัวใน [2] ประกอบด้วยรูปภาพ 500 ภาพ และแต่ละภาพเชื่อมโยงกับแท็กคำสองชุด:
เมื่อพิจารณาจากรูปภาพในชุดข้อมูลการทดสอบ โมเดลการเรียนรู้การถ่ายโอนหลายอินพุตใหม่จะต้องสามารถคาดเดาได้ว่าแท็กคำใดจากสองชุดที่กำหนดให้ตรงกับรูปภาพ
รหัสต่อไปนี้คือการโหลดภาพทดสอบลงในหน่วยความจำ:
dim = (150, 150) X_image_test = [] for fname in listdir(test_image_dir): fpath = os.path.join(test_image_dir, fname) im = cv2.imread(fpath) im_resized = cv2.resize(im, dim, interpolation = cv2.INTER_AREA) X_image_test.append(im_resized)
แท็กคำทดสอบจะถูกแปลงเป็นลำดับของค่าจำนวนเต็มที่เข้ารหัสดังต่อไปนี้:
tokenizer_test = Tokenizer(num_words=max_words) texts_1 = [] texts_2 = [] texts_all = [] for tag_list in test_image_label_df['word_tags_1']: texts_1.append(' '.join(tag_list)) for tag_list in test_image_label_df['word_tags_2']: texts_2.append(' '.join(tag_list)) texts_all.extend(texts_1) texts_all.extend(texts_2) tokenizer_test.fit_on_texts(texts_all) sequences_1 = tokenizer_test.texts_to_sequences(texts_1) sequences_2 = tokenizer_test.texts_to_sequences(texts_2) word_index_test = tokenizer_test.word_index print('Found {} unique tokens in test'.format(len(word_index_test))) tag_data_test_1 = pad_sequences(sequences_1, maxlen=maxlen) tag_data_test_2 = pad_sequences(sequences_2, maxlen=maxlen)
จากนั้นผลลัพธ์อาร์เรย์ Python ของรูปภาพและแท็กคำจะถูกแปลงเป็นอาร์เรย์ Numpy และปรับให้เข้ากับโมเดลที่ได้รับการฝึกอบรมเพื่อการทำนาย:
X_image_test = np.array(X_image_test) X_tag_test_1 = np.array(tag_data_test_1) X_tag_test_2 = np.array(tag_data_test_2) y_predict_1 = loaded_model.predict([X_image_test, X_tag_test_1]) y_predict_2 = loaded_model.predict([X_image_test, X_tag_test_2])
ตารางต่อไปนี้แสดงผลการทำนาย 20 รายการแรก:
รูปภาพต่อไปนี้คือ Image 201.png ในชุดข้อมูลการทดสอบ:
แท็กคำที่เกี่ยวข้องสองชุดมีดังนี้:
word-tag-set-0: ['bloom', 'glow', 'overexposed', 'bright', 'white', 'face', 'woman', 'blonde'] word-tag-set-1: ['iron', 'nuggets', 'samples', 'metal', 'ore', 'shadow', 'white', 'grey', 'gray', 'rust', 'shiny']
แบบจำลองคาดการณ์:
word-tag-set-0: probability of 0.797 word-tag-set-1: probability of 0.999
คำตอบที่มีความน่าจะเป็นสูงกว่าคือ 0.999 คือ:
['เหล็ก', 'นักเก็ต', 'ตัวอย่าง', 'โลหะ', 'แร่', 'เงา', 'สีขาว', 'สีเทา', 'สีเทา', 'สนิม', 'แวววาว' ]
สำหรับตัวอย่างเชิงบวกอีกประการหนึ่ง ต่อไปนี้คือ Image 76.png ในชุดข้อมูลการทดสอบ:
ต่อไปนี้เป็นแท็กคำสองชุดที่เกี่ยวข้องกัน:
word-tag-set-0: ['person', 'man', 'shirt', 'pinstripe', 'smile', 'balding', 'grey', 'gray'] word-tag-set-1: ['country', 'music', 'man', 'instrument', 'guitar', 'musician', 'person', 'playing', 'watch', 'striped', 'shirt', 'red', 'glasses']
แบบจำลองคาดการณ์:
word-tag-set-0: probability of 0.997 word-tag-set-1: probability of 0.530
คำตอบที่มีความน่าจะเป็นสูงกว่าคือ 0.997 คือ:
['บุคคล', 'ผู้ชาย', 'เสื้อเชิ้ต', 'ลายทาง', 'ยิ้ม', 'หัวล้าน', 'สีเทา', 'สีเทา']
จากตัวอย่างผลบวกลวง ต่อไปนี้คือ Image 189.png ในชุดข้อมูลการทดสอบ:
ต่อไปนี้เป็นแท็กคำสองชุดที่เกี่ยวข้องกัน:
word-tag-set-0: ['necklace', 'woman', 'earring', 'jewelry', 'mouth', 'chin', 'closeup'] word-tag-set-1: ['circle', 'lines', 'round', 'window', 'porthole', 'man', 'face', 'beard', 'person', 'dark', 'shadow']
แบบจำลองคาดการณ์:
word-tag-set-0: probability of 0.016 word-tag-set-1: probability of 0.999
คำตอบเชิงบวกลวงที่มีความน่าจะเป็นสูงกว่าคือ 0.999 คือ:
['วงกลม', 'เส้น', 'กลม', 'หน้าต่าง', 'ช่องหน้าต่าง', 'ผู้ชาย', 'ใบหน้า', 'เครา', 'บุคคล', 'ความมืด', 'เงา']
ผลการทดสอบข้างต้นแสดงให้เห็นว่าแม้ว่าโมเดลการเรียนรู้การถ่ายโอนข้อมูลแบบหลายอินพุตใหม่จะได้รับการฝึกด้วยรูปภาพและแท็กคำเพียง 4,000 คู่และ 30 ยุค แต่โมเดลก็สามารถได้รับผลลัพธ์ที่สมเหตุสมผลในแง่ของความแม่นยำ
อย่างไรก็ตาม โมเดลยังสร้างผลบวกลวงค่อนข้างมากเนื่องจากโมเดลเกินพอดี
สรุป
บทความนี้นำเสนอโมเดลการเรียนรู้การถ่ายโอนข้อมูลเชิงลึกแบบหลายอินพุตใหม่ที่รวมโมเดลอินพุตที่ได้รับการฝึกล่วงหน้าสองโมเดล (VGG16 และ GloVe และ LSTM) เข้ากับเลเยอร์การจำแนกประเภทที่เชื่อมต่ออย่างสมบูรณ์ใหม่สำหรับการรับรู้รูปภาพและแท็กคำพร้อมกัน
จุดสำคัญของวิธีการเรียนรู้เชิงลึกแบบหลายอินพุตใหม่คือการแปลปัญหาการจดจำรูปภาพและแท็กคำให้กลายเป็นปัญหาการจำแนกประเภท นั่นคือ การกำหนดว่ารูปภาพที่กำหนดตรงกับชุดแท็กคำที่กำหนดหรือไม่ (0-ไม่ใช่ 1-ใช่)
ชุดข้อมูลสาธารณะที่ท้าทายใน Kaggle "ความท้าทายในการเรียนรู้การเป็นตัวแทน: การเรียนรู้แบบหลายรูปแบบ" [2] ถูกนำมาใช้ในการฝึกอบรมและประเมินโมเดลใหม่
ผลการคาดการณ์แบบจำลองแสดงให้เห็นว่าโมเดลใหม่ทำงานได้ดีพอสมควรด้วยการฝึกโมเดลที่จำกัด (เพียง 30 ยุคและ 4,000 คู่รูปภาพและแท็กคำ) เพื่อวัตถุประสงค์ในการสาธิต อย่างไรก็ตาม จึงไม่น่าแปลกใจเลยที่แบบจำลองยังสร้างผลบวกลวงค่อนข้างมากเนื่องจากโมเดลพอดีเกินไป ปัญหานี้สามารถแก้ไขได้ด้วยการฝึกโมเดลให้มียุคสมัยที่มากขึ้นและ/หรือคู่รูปภาพและแท็กคำมากขึ้น
เห็นได้ชัดว่าภาพการฝึกอบรม 2,000 ภาพที่ได้รับการสุ่มเลือกนั้นไม่เพียงพอในการเป็นตัวแทนของภาพการฝึกอบรมที่มีอยู่ทั้งหมด 100,000 ภาพ ควรปรับปรุงประสิทธิภาพของโมเดลอย่างมีนัยสำคัญโดยเพิ่มจำนวนอิมเมจการฝึกจาก 2,000 เป็นขนาดที่ใหญ่ขึ้น เช่น 10,000
สมุดบันทึก Jupyter พร้อมซอร์สโค้ดทั้งหมดมีอยู่ใน Github [5]
อ้างอิง
(1) F. Chollet, การเรียนรู้เชิงลึกกับ Python, Manning Publications Co., 2018
[2] ความท้าทายในการเรียนรู้การเป็นตัวแทน: การเรียนรู้แบบหลายรูปแบบ
[3] เจ. เพนนิงตัน, อาร์. โซเชอร์, ซีดี. แมนนิ่ง "GloVe: เวกเตอร์ระดับโลกสำหรับการแทนคำ"
[4] Y. Zhang, การเรียนรู้เชิงลึกสำหรับการประมวลผลภาษาธรรมชาติโดยใช้ word2vec-keras
[5] Y. Zhang, สมุดบันทึก Jupyter ใน "Github"
คำชี้แจงการเปิดเผยข้อมูล: © 2019 Capital One ความคิดเห็นเป็นของผู้เขียนแต่ละคน เว้นแต่จะระบุไว้เป็นอย่างอื่นในโพสต์นี้ Capital One ไม่มีส่วนเกี่ยวข้องหรือรับรองโดยบริษัทใด ๆ ที่กล่าวถึง เครื่องหมายการค้าและทรัพย์สินทางปัญญาอื่น ๆ ทั้งหมดที่ใช้หรือแสดงเป็นทรัพย์สินของเจ้าของที่เกี่ยวข้อง