টেনসরফ্লোতে কীভাবে জাভিয়ের ইনিশিয়ালেশন করবেন


86

আমি আমার ক্যাফে নেটওয়ার্কটি টেনসরফ্লোতে বন্দরে রাখছি তবে মনে হচ্ছে এটি জাভিয়ের ইনিশিয়েশন আছে। আমি ব্যবহার করছি truncated_normalতবে মনে হচ্ছে এটি প্রশিক্ষণ করা আরও কঠিন হয়ে উঠছে।


4
জাভিয়ের হ'ল ডিফল্ট ইনিশিয়েশন। Stackoverflow.com/questions/37350131/…
টমাস আহলে

উত্তর:


12

ইন Tensorflow 2.0 এবং আরও উভয় tf.contrib.*এবং tf.get_variable()অসমর্থিত হয়েছে। জাভিয়ার ইনিশিয়ালাইজেশন করতে আপনাকে এখন স্যুইচ করতে হবে:

init = tf.initializers.GlorotUniform()
var = tf.Variable(init(shape=shape))
# or a oneliner with a little confusing brackets
var = tf.Variable(tf.initializers.GlorotUniform()(shape=shape))

গ্লোরোট ইউনিফর্ম এবং জাভিয়ের ইউনিফর্ম একই ইনিশিয়ালাইজেশন ধরণের দুটি পৃথক নাম। আপনি যদি কেরাসের সাথে বা ছাড়া TF2.0 এ কীভাবে সূচনা ব্যবহার করতে চান সে সম্পর্কে আরও জানতে চান তবে ডকুমেন্টেশন উল্লেখ করুন ।


আমি উপরের কোডটি ব্যবহার করেছি এবং নীচের মতো একটি ত্রুটি পেয়েছি; _init_xavier = tf. পরিবর্তনশীল (init (আকৃতি = আকৃতি)) নাম এরর: নাম 'আকৃতি' সংজ্ঞায়িত করা হয়নি
চিরঙ্গা

119

সংস্করণ 0.8 যেহেতু একটি জাভিয়ের ইনিশিয়ালাইজার রয়েছে, ডক্সের জন্য এখানে দেখুন

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

W = tf.get_variable("W", shape=[784, 256],
           initializer=tf.contrib.layers.xavier_initializer())

4
আপনি কি আকৃতিটি না দিয়ে get_variableএটি করতে শিখেন তবে পরিবর্তে এটি আরম্ভকারীকে দিয়েইছেন? আমি ব্যবহার করতাম tf.truncated_normal(shape=[dims[l-1],dims[l]], mean=mu[l], stddev=std[l], dtype=tf.float64)এবং আমি সেখানে আকৃতিটি নির্দিষ্ট করেছিলাম তবে এটি এখন আপনার কোড অনুসারে স্ক্রুর সাজেশন। তোমার কি কোন মতামত আছে?
পিনোচিও

4
@ পিনোকিও আপনি কেবল নিজের জন্য একটি মোড়ক লিখতে পারেন যা একই স্বাক্ষরযুক্ত tf.Variable(...)এবং ব্যবহারের মতো রয়েছেtf.get_variable(...)
'17 এ জেএসএস

4
সংস্করণ ছাড়াই "বর্তমান" লিঙ্ক: tensorflow.org/api_docs/python/tf/contrib/layers/…
স্কিপাইলট

28

জাভিয়ার এবং যোশুয়ার পদ্ধতি tf.Variableব্যবহার করে কীভাবে প্রাথমিককরণটি সংজ্ঞায়িত করতে হবে তার অন্য একটি উদাহরণ যোগ করতে :

graph = tf.Graph()
with graph.as_default():
    ...
    initializer = tf.contrib.layers.xavier_initializer()
    w1 = tf.Variable(initializer(w1_shape))
    b1 = tf.Variable(initializer(b1_shape))
    ...

এটি আমাকে nanRELUs সহ একাধিক স্তর ব্যবহার করার সময় সংখ্যাগত অস্থিরতার কারণে আমার ক্ষতির কার্যকারিতাটিতে মান রাখতে বাধা দেয় ।


4
এই ফর্ম্যাটটি আমার কোডটিকে সবচেয়ে ভাল ফিট করেছে - এবং এটি আমার শিক্ষার হারকে 0.5 তে ফিরিয়ে আনতে অনুমতি দিয়েছে (অন্য একটি পুনরায় স্তর পুনরায় যুক্ত করার সময় আমাকে এটিকে 0.06 এ নামিয়ে ফেলতে হবে)। একবার আমি এই গোপন স্তরটি সমস্ত গোপন স্তরগুলিতে প্রয়োগ করলাম আমি প্রথম কয়েক শতাধিক যুগ থেকে অবিশ্বাস্যভাবে উচ্চ বৈধকরণের হার পাচ্ছি। আমি যে পার্থক্য করেছি তা বিশ্বাস করতে পারি না!
স্কিপাইলট

12

@ আলেফ,, জাভিয়ার / গ্লোরোট সূচনাটি নিউরনের আগত সংযোগগুলির (ফ্যান_ইন) সংখ্যা, বহির্গামী সংযোগগুলি (ফ্যান_আউট) এবং ধরণের অ্যাক্টিভেশন ফাংশন (সিগময়েড বা তান) নির্ভর করে। এটি দেখুন: http://jMLr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

সুতরাং এখন, আপনার প্রশ্ন। টেনসরফ্লোতে আমি এটি এটিই করব:

(fan_in, fan_out) = ...
    low = -4*np.sqrt(6.0/(fan_in + fan_out)) # use 4 for sigmoid, 1 for tanh activation 
    high = 4*np.sqrt(6.0/(fan_in + fan_out))
    return tf.Variable(tf.random_uniform(shape, minval=low, maxval=high, dtype=tf.float32))

নোট করুন যে আমাদের অভিন্ন বন্টন থেকে নমুনা নেওয়া উচিত, এবং অন্য উত্তরে প্রস্তাবিত সাধারণ বিতরণ নয়।

ঘটনাক্রমে, গতকাল আমি টেনসরফ্লো ব্যবহার করে আলাদা কিছু করার জন্য একটি পোস্ট লিখেছিলাম যা জাভিয়ের ইনিশিয়েশনও ব্যবহার করতে দেখা যায়। আপনি যদি আগ্রহী হন তবে শেষের সাথে শেষের উদাহরণ সহ একটি অজগর নোটবুকও রয়েছে: https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb


4
আমরা কীভাবে এটি রিলু অ্যাক্টিভেশন ফাংশন সহ ব্যবহার করতে পারি।
gautam840

সেই কাগজটি সাধারণভাবে ব্যবহৃত সূচনা সহ বিভিন্ন অ্যাক্টিভেশন ফাংশনের অধীনে ওজন গ্রেডিয়েন্টগুলির আচরণ অধ্যয়ন করে। তারপরে তারা কোনও অ্যাক্টিভেশন ফাংশন নির্বিশেষে সর্বজনীন সূচনার প্রস্তাব দেয়। তদুপরি, আপনার পদ্ধতিটিও অ্যাক্টিভেশন ফাংশনের উপর নির্ভর করে না, তাই টেনসরফ্লোতে অন্তর্নির্মিত জাভিয়ার ইনিশিয়ালাইজেশন ব্যবহার করা ভাল।
ওয়াহিদ মিরজালিলি

8

একটি সুন্দর মোড়কের প্রায় tensorflowনামক prettytensorসোর্স কোডে একটি বাস্তবায়ন (থেকে সরাসরি কপি করা দেয় এখানে ):

def xavier_init(n_inputs, n_outputs, uniform=True):
  """Set the parameter initialization using the method described.
  This method is designed to keep the scale of the gradients roughly the same
  in all layers.
  Xavier Glorot and Yoshua Bengio (2010):
           Understanding the difficulty of training deep feedforward neural
           networks. International conference on artificial intelligence and
           statistics.
  Args:
    n_inputs: The number of input nodes into each output.
    n_outputs: The number of output nodes for each input.
    uniform: If true use a uniform distribution, otherwise use a normal.
  Returns:
    An initializer.
  """
  if uniform:
    # 6 was used in the paper.
    init_range = math.sqrt(6.0 / (n_inputs + n_outputs))
    return tf.random_uniform_initializer(-init_range, init_range)
  else:
    # 3 gives us approximately the same limits as above since this repicks
    # values greater than 2 standard deviations from the mean.
    stddev = math.sqrt(3.0 / (n_inputs + n_outputs))
    return tf.truncated_normal_initializer(stddev=stddev)

8

টিএফ-অবদান রয়েছে xavier_initializer। এটি কীভাবে ব্যবহার করবেন তা এখানে একটি উদাহরণ:

import tensorflow as tf
a = tf.get_variable("a", shape=[4, 4], initializer=tf.contrib.layers.xavier_initializer())
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(a)

এটি ছাড়াও, টেনসরফ্লোতে অন্যান্য আরম্ভকারী রয়েছে:


ধন্যবাদ, স্যার এটি খুব সহায়ক ছিল, আমি আপনাকে জিজ্ঞাসা করতে চাই যে আমি xavier_initializer ব্যবহার করে পক্ষপাত শুরু করতে পারি
সখরি হাউসেম

4

আমি তাকিয়েছিলাম এবং আমি কোনও অন্তর্নির্মিত পাইনি However তবে, এই অনুসারে:

http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization

জাভেয়ের ইনিশিয়ালাইজেশন কেবলমাত্র একটি (সাধারণত গাউসিয়ান) বন্টনকে নমুনা দিচ্ছে যেখানে ভেরিয়েন্সটি নিউরনের সংখ্যার ফাংশন। tf.random_normalএটি আপনার পক্ষে করতে পারে, আপনাকে কেবল স্টডিডিভ গণনা করতে হবে (অর্থাত্ আপনি যে ওজন ম্যাট্রিক্সটি শুরু করার চেষ্টা করছেন তার দ্বারা প্রতিনিধিত্ব করা নিউরনের সংখ্যা)।


ভিনস আপনি একটি অভিন্ন বিতরণ থেকে নমুনা করা উচিত।
ডিলিপ করুন

4

ইত্যাদি kernel_initializerপরামিতি মাধ্যমেtf.layers.conv2d, tf.layers.conv2d_transpose, tf.layers.Dense

যেমন

layer = tf.layers.conv2d(
     input, 128, 5, strides=2,padding='SAME',
     kernel_initializer=tf.contrib.layers.xavier_initializer())

https://www.tensorflow.org/api_docs/python/tf/layers/conv2d

https://www.tensorflow.org/api_docs/python/tf/layers/conv2d_transpose

https://www.tensorflow.org/api_docs/python/tf/layers/Dense


3

আপনি যেমনটি করেন ঠিক তেমন একটি লাইন ব্যবহার করতে চাইলে:

W = tf.Variable(tf.truncated_normal((n_prev, n), stddev=0.1))

আপনি করতে পারেন:

W = tf.Variable(tf.contrib.layers.xavier_initializer()((n_prev, n)))

0

টেনসারফ্লো 1:

W1 = tf.get_variable("W1", [25, 12288],
    initializer = tf.contrib.layers.xavier_initializer(seed=1)

টেনসারফ্লো 2:

W1 = tf.get_variable("W1", [25, 12288],
    initializer = tf.random_normal_initializer(seed=1))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.