2016-01-21 7 views
7

क्या टेंसफोर्लो वैरिएबल बड़ा बनाने का कोई तरीका है? जैसे, मान लें कि मैं प्रशिक्षण के बीच में एक तंत्रिका नेटवर्क की एक परत में एक न्यूरॉन जोड़ना चाहता था। मुझसे यह कैसे होगा? This question में एक जवाब ने मुझे बताया कि वेरिएबल के आकार को बदलने के लिए, वजन बढ़ाने की एक और पंक्ति फिट करने के लिए इसे विस्तारित करने के लिए, लेकिन मुझे नहीं पता कि उन नए वजन को कैसे प्रारंभ किया जाए।एक टेंसफोर्लो वैरिएबल का विस्तार कैसे करें

मुझे लगता है कि इस बारे में जाने का एक और तरीका वैरिएबल को संयोजित करने में शामिल हो सकता है, जैसे वजन को दूसरे चर में पहले शुरू करना और फिर इसे पहले चर के एक नई पंक्ति या कॉलम के रूप में जोड़ना, लेकिन मुझे कुछ भी नहीं मिला जो मुझे ऐसा करने देता है।

उत्तर

1

यह पता लगाया। यह एक चौराहे की प्रक्रिया है, लेकिन यह केवल एक ही है जो मैं बता सकता हूं कि वास्तव में कार्य करता है। आपको पहले चर को अनपैक करने की आवश्यकता है, फिर नए वैरिएबल को अंत में जोड़ दें, फिर उन्हें एक साथ वापस पैक करें।

यदि आप पहले आयाम के साथ विस्तार कर रहे हैं, तो यह छोटा है: वास्तविक कोड की केवल 7 पंक्तियां।

#the first variable is 5x3 
v1 = tf.Variable(tf.zeros([5, 3], dtype=tf.float32), "1") 

#the second variable is 1x3 
v2 = tf.Variable(tf.zeros([1, 3], dtype=tf.float32), "2") 

#unpack the first variable into a list of size 3 tensors 
#there should be 5 tensors in the list 
change_shape = tf.unpack(v1) 

#unpack the second variable into a list of size 3 tensors 
#there should be 1 tensor in this list 
change_shape_2 = tf.unpack(v2) 

#for each tensor in the second list, append it to the first list 
for i in range(len(change_shape_2)): 
    change_shape.append(change_shape_2[i]) 

#repack the list of tensors into a single tensor 
#the shape of this resultant tensor should be [6, 3] 
final = tf.pack(change_shape) 

यदि आप दूसरे आयाम के साथ विस्तार करना चाहते हैं, तो यह कुछ हद तक अधिक हो जाता है।

#First variable, 5x3 
v3 = tf.Variable(tf.zeros([5, 3], dtype=tf.float32)) 

#second variable, 5x1 
v4 = tf.Variable(tf.zeros([5, 1], dtype=tf.float32)) 

#unpack tensors into lists of size 3 tensors and size 1 tensors, respectively 
#both lists will hold 5 tensors 
change = tf.unpack(v3) 
change2 = tf.unpack(v4) 

#for each tensor in the first list, unpack it into its own list 
#this should make a 2d array of size 1 tensors, array will be 5x3 
changestep2 = [] 
for i in range(len(change)): 
    changestep2.append(tf.unpack(change[i])) 

#do the same thing for the second tensor 
#2d array of size 1 tensors, array will be 5x1 
change2step2 = [] 
for i in range(len(change2)): 
    change2step2.append(tf.unpack(change2[i])) 

    #for each tensor in the array, append it onto the corresponding array in the first list 
    for j in range(len(change2step2[i])): 
    changestep2[i].append(change2step2[i][j]) 

    #pack the lists in the array back into tensors 
    changestep2[i] = tf.pack(changestep2[i]) 

#pack the list of tensors into a single tensor 
#the shape of this resultant tensor should be [5, 4] 
final2 = tf.pack(changestep2) 

मुझे नहीं पता कि ऐसा करने का एक और अधिक प्रभावी तरीका है, लेकिन यह काम करता है, जहां तक ​​यह जाता है। आगे के आयामों को बदलने के लिए आवश्यकतानुसार सूचियों की अधिक परतों की आवश्यकता होगी।

+3

ध्यान दें कि tf.concat() टेंसर को जोड़ता है। उदाहरण के लिए, आपका उदाहरण 1 हो सकता है: v1 = tf.variable (... [5, 3] ...) v2 = tf.variable (... [1, 3] ...) अंतिम = टीएफ ।concat (0, [v1, v2]) आपका दूसरा उदाहरण किया जा सकता है: v1 = tf.variable (... [5, 3] ...) v2 = tf.variable (... [5 , 1] ...) अंतिम = tf.concat (1, [v1, v2]) मुझे लगता है कि vrv क्या सुझाव दिया गया है। – zfc

9

आप इसे पूरा करने के कई तरीके हैं।

1) उस पोस्ट का दूसरा उत्तर (https://stackoverflow.com/a/33662680/5548115) बताता है कि आप validate_shape = गलत के साथ 'असाइन' को कॉल करके एक चर के आकार को कैसे बदल सकते हैं। उदाहरण के लिए, आप

# Assume var is [m, n] 
# Add the new 'data' of shape [1, n] with new values 
new_neuron = tf.constant(...) 

# If concatenating to add a row, concat on the first dimension. 
# If new_neuron was [m, 1], you would concat on the second dimension. 
new_variable_data = tf.concat(0, [var, new_neuron]) # [m+1, n] 

resize_var = tf.assign(var, new_variable_data, validate_shape=False) 

की तरह कुछ फिर जब आप resize_var चलाने के लिए, डेटा 'var' द्वारा की ओर इशारा कर सकता है अब अद्यतन डेटा होगा।

2) आप एक बड़े प्रारंभिक चर भी बना सकते हैं, और चर के विभिन्न क्षेत्रों पर tf.slice को कॉलिंग के रूप में कॉल कर सकते हैं क्योंकि आप गतिशील रूप से 'प्रारंभ' और 'आकार' स्लाइस के गुणों को बदल सकते हैं।

+0

यदि मैंने आकार का एक नया चर जोड़ा [एम, 1], तो अंतिम आकार [एम, एन + 1] होगा? – Beez

+0

और एक तीसरे आयाम के साथ सिर्फ एक चर बनाने के लिए पैक नहीं होगा? एपीआई यही कहता है, और जब पैक चल रहा है तो मुझे त्रुटियां मिल रही हैं कि आयाम तब तक संगत नहीं हैं जब तक कि मैं आयामों को एक ही आकार नहीं बना देता, इस स्थिति में यह आकार 2 का तीसरा आयाम जोड़ता है। – Beez

+0

आह, आप सही हैं पैक। मुझे लगता है कि आप tf.concat (0, [... tensors ...]) (या जो भी आयाम आप चाहते हैं उस आकार को जोड़ना चाहते हैं) मैंने इसे प्रतिबिंबित करने के लिए उत्तर संपादित किया है । – vrv

4

बस एक Tensorflow वैरिएबल का विस्तार करने के लिए tf.concat का उपयोग करके, आप विस्तार के लिए api_docs देख सकते हैं।

v1 = tf.Variable(tf.zeros([5,3]),dtype=tf.float32) 
    v2 = tf.Variable(tf.zeros([1,3]),dtype=tf.float32) 
    v3 = tf.concat(0,[v1, v2]) 
संबंधित मुद्दे