कुछ रैखिक-बीजगणित पृष्ठभूमि
एकवचन मूल्य अपघटन (SVD) किसी भी मैट्रिक्स W
के अपघटन तीन मैट्रिक्स में है:
W = U S V*
कहाँ U
और V
ऑर्थो-सामान्य मैट्रिक्स हैं, और S
है विकर्ण पर कम परिमाण में तत्वों के साथ विकर्ण। SVD के दिलचस्प गुण यह है कि यह करने के लिए आसानी से एक कम रैंक मैट्रिक्स के साथ अनुमानित W
की अनुमति देता है: मान लीजिए आप काट-छांट S
केवल अपने k
प्रमुख तत्वों के लिए तो
W_app = W S_trunc V*
(बजाय विकर्ण पर सभी तत्वों का) रैंक k
W
का अनुमान है। deploy_full.prototxt
मॉडल के लिए प्रशिक्षित मापदंडों -
एक पूरी तरह से जुड़ा परत
मान लीजिए हम एक पूरी तरह से जुड़ा परत
# ... some layers here
layer {
name: "fc_orig"
type: "InnerProduct"
bottom: "in"
top: "out"
inner_product_param {
num_output: 1000
# more params...
}
# some more...
}
# more layers...
इसके अलावा के साथ एक मॉडल deploy_full.prototxt
है अनुमान लगाने के लिए SVD का उपयोग करना, हम trained_weights_full.caffemodel
है।
कॉपी deploy_full.protoxt
deploy_svd.protoxt
करने और अपनी पसंद के संपादक में खोलें। इन दो परतों के साथ पूरी तरह से जुड़ा परत बदलें:
layer {
name: "fc_svd_U"
type: "InnerProduct"
bottom: "in" # same input
top: "svd_interim"
inner_product_param {
num_output: 20 # approximate with k = 20 rank matrix
bias_term: false
# more params...
}
# some more...
}
# NO activation layer here!
layer {
name: "fc_svd_V"
type: "InnerProduct"
bottom: "svd_interim"
top: "out" # same output
inner_product_param {
num_output: 1000 # original number of outputs
# more params...
}
# some more...
}
अजगर में, एक छोटे से net surgery:
import caffe
import numpy as np
orig_net = caffe.Net('deploy_full.prototxt', 'trained_weights_full.caffemodel', caffe.TEST)
svd_net = caffe.Net('deploy_svd.prototxt', 'trained_weights_full.caffemodel', caffe.TEST)
# get the original weight matrix
W = np.array(orig_net.params['fc_orig'][0].data)
# SVD decomposition
k = 20 # same as num_ouput of fc_svd_U
U, s, V = np.linalg.svd(W)
S = np.zeros((U.shape[0], k), dtype='f4')
S[:k,:k] = s[:k] # taking only leading k singular values
# assign weight to svd net
svd_net.params['fc_svd_U'][0].data[...] = np.dot(U,S)
svd_net.params['fc_svd_V'][0].data[...] = V[:k,:]
svd_net.params['fc_svd_V'][1].data[...] = orig_net.params['fc_orig'][1].data # same bias
# save the new weights
svd_net.save('trained_weights_svd.caffemodel')
अब हम trained_weights_svd.caffemodel
साथ deploy_svd.prototxt
है कि अब तक के साथ मूल शुद्ध का अनुमान लगाए कम गुणा, और वजन।
एक अच्छा समाधान! – Dale
अद्भुत समाधान :) –
@ मेरा समाधान नहीं है - यह रॉस गिरशिक है। – Shai