تنص الوثائق:
ملاحظة: إذا كان موتر
inputs
له رتبة أكبر من 2 ، فهو كذلك
بالارض قبل ضرب المصفوفة الأولية فيw
.
ومع ذلك ، إرجاع موتر التالي بالشكل shape=(2, 2, 2, 400)
، كما لو لم يتم تسطيح الإدخال
tf.layers.dense(tf.placeholder(tf.float32, (2,2,2,2)), 400)
عفوًا ، آسف ، لم أقصد إزالة نفسي. التحقيق داخليًا ، كان يحاول إضافة الشخص الذي أعتقد أنه مسؤول.
لذلك ، بعد التحقيق ، ما قيل لي هو أنه يتصرف مثل tensordot ، وبالتالي فإن السلوك والوثائق الحالية صحيحة - وقال المهندس الذي تحدثت إليه إنهم يعتقدون أنه يمكننا استخدام لغة أكثر دقة ولكن ذلك لن يكون ' تساعد بالضرورة لأن اللغة الحالية واضحة ولا لبس فيها عندما تكون في سياقها. (راجع tensordot: https://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html)
إذا كنت ترغب في محاولة إجراء طلب سحب بنفسك للقيام ببعض إعادة الصياغة ، فسيكون ذلك موضع ترحيب ، لكنني أغلق هذا الخطأ في الوقت الحالي لأننا لن نفعل أي شيء حيال ذلك داخليًا.
آه شكرًا ، اتصال tensordot يجعل الأمر أكثر وضوحًا.
يبدو tf.dense
يتصرف من خلال التعاقد مع آخر مؤشر لموتّر الإدخال مع أول مؤشر لموتّر الأوزان. كانت كلمة "مسطحة" محيرة ، ولست متأكدًا مما تعنيه هنا
مثال لعبة صنعتها لنفسي لترجمة tf.dense إلى ما يعادل np.tensordot
tf.reset_default_graph()
x0 = np.ones((3, 3, 3))
w0 = np.arange(6).reshape((3, 2))
x = tf.constant(x0)
y = tf.layers.dense(x, 2)
var_dict = {v.op.name: v for v in tf.global_variables()}
assert(var_dict["dense/kernel"].get_shape() == (3, 2))
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
sess.run(tf.assign(var_dict["dense/kernel"], w0))
sess.run(tf.assign(var_dict["dense/bias"], np.zeros((2,))))
expected_y0 = np.tensordot(x0,w0,axes=[(2,),(0,)])
y0 = sess.run(y)
np.testing.assert_allclose(y0, expected_y0)
التعليق الأكثر فائدة
آه شكرًا ، اتصال tensordot يجعل الأمر أكثر وضوحًا.
يبدو
tf.dense
يتصرف من خلال التعاقد مع آخر مؤشر لموتّر الإدخال مع أول مؤشر لموتّر الأوزان. كانت كلمة "مسطحة" محيرة ، ولست متأكدًا مما تعنيه هنامثال لعبة صنعتها لنفسي لترجمة tf.dense إلى ما يعادل np.tensordot