How to compute weighted average of tensor A along an axis with weights specified by tensor B in tensorflow?Numpy averaging with multi-dimensional weights along an axisTensorFlow: how to batch mut-mul a batch tensor by a weight variable?In tensorflow, how to iterate over a sequence of inputs stored in a tensor?Sample from a tensor in Tensorflow along an axisWhat is the difference between tensors and sparse tensors?how to average a tensor axis with specified mask in tensorflowN-D tensor matrix multiplication with tensorflowslicing a tensor along a dimension with given indexTensor Operation in Tensorflow

Why would a fighter use the afterburner and air brakes at the same time?

Why does Canada require a minimum rate of climb for ultralights of 300 ft/min?

What exactly is a web font, and what does converting to one involve?

My passport was stamped with an exit stamp while transiting to another Schengen country via Turkey. Was this a mistake?

EU compensation - fire alarm at the Flight Crew's hotel

Manager manipulates my leaves, what's in it for him?

How can I check that parent has more than 1 child?

What is the word for a person who destroys monuments?

Which block cipher parameters should be kept secret?

What the did the controller say during my approach to land (audio clip)?

Plausibility and performance of a composite longbow

Is Zack Morris's 'time stop' ability in "Saved By the Bell" a supernatural ability?

What was the deeper meaning of Hermione wanting the cloak?

Amiga 500 OCS/ECS vs Mega Drive VDP

Why can't we use uninitialized local variable to access static content of its type?

Minimum number of lines to draw 111 squares

Applications of mathematics in clinical setting

Should the pagination be reset when changing the order?

Inquiry answerer

Account creation and log-in system

With a 500GB SSD and a 250GB SSD is it possible to mirror a 250GB partition on the 500GB with the 250GB SSD using ZFS?

Exam design: give maximum score per question or not?

Can one guy with a duplicator trigger a nuclear apocalypse?

Does rpcpassword need to be non-obvious in bitcoind?



How to compute weighted average of tensor A along an axis with weights specified by tensor B in tensorflow?


Numpy averaging with multi-dimensional weights along an axisTensorFlow: how to batch mut-mul a batch tensor by a weight variable?In tensorflow, how to iterate over a sequence of inputs stored in a tensor?Sample from a tensor in Tensorflow along an axisWhat is the difference between tensors and sparse tensors?how to average a tensor axis with specified mask in tensorflowN-D tensor matrix multiplication with tensorflowslicing a tensor along a dimension with given indexTensor Operation in Tensorflow






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








1















I am trying to apply a weighted average scheme on RNN output.

RNN output is represented by tensor A having dimension (a,b,c).

I can simply take tf.reduce_mean(A,axis=1) to get the tensor C having dimension (a,c).



However, I want to do the "weighted average" of tensor A along axis = 1.

Weights are specified in the matrix B having dimension (d,b).



For d = 1, I can do tf.tensordot(A,B,[1,1]) to get the result of dimension (a,c).

Now for d=a, I am unable to compute the weighted average.



Can someone suggest a solution?










share|improve this question


























  • Try tf.reduce_sum(A * B[:, :, None], axis=1) / tf.reduce_sum(B, axis=1, keepdims=True). If it works, I'll turn it into an answer.

    – Siyuan Ren
    Mar 28 at 15:30











  • @SiyuanRen can you please explain what it does?

    – abhi
    Mar 29 at 8:29











  • @SiyuanRen weights are already normalized. So no need for division operation. I think division operation is normalizing weights so that it sums to 1. Can you explain the evaluation of the first part?

    – abhi
    Mar 29 at 9:21

















1















I am trying to apply a weighted average scheme on RNN output.

RNN output is represented by tensor A having dimension (a,b,c).

I can simply take tf.reduce_mean(A,axis=1) to get the tensor C having dimension (a,c).



However, I want to do the "weighted average" of tensor A along axis = 1.

Weights are specified in the matrix B having dimension (d,b).



For d = 1, I can do tf.tensordot(A,B,[1,1]) to get the result of dimension (a,c).

Now for d=a, I am unable to compute the weighted average.



Can someone suggest a solution?










share|improve this question


























  • Try tf.reduce_sum(A * B[:, :, None], axis=1) / tf.reduce_sum(B, axis=1, keepdims=True). If it works, I'll turn it into an answer.

    – Siyuan Ren
    Mar 28 at 15:30











  • @SiyuanRen can you please explain what it does?

    – abhi
    Mar 29 at 8:29











  • @SiyuanRen weights are already normalized. So no need for division operation. I think division operation is normalizing weights so that it sums to 1. Can you explain the evaluation of the first part?

    – abhi
    Mar 29 at 9:21













1












1








1








I am trying to apply a weighted average scheme on RNN output.

RNN output is represented by tensor A having dimension (a,b,c).

I can simply take tf.reduce_mean(A,axis=1) to get the tensor C having dimension (a,c).



However, I want to do the "weighted average" of tensor A along axis = 1.

Weights are specified in the matrix B having dimension (d,b).



For d = 1, I can do tf.tensordot(A,B,[1,1]) to get the result of dimension (a,c).

Now for d=a, I am unable to compute the weighted average.



Can someone suggest a solution?










share|improve this question
















I am trying to apply a weighted average scheme on RNN output.

RNN output is represented by tensor A having dimension (a,b,c).

I can simply take tf.reduce_mean(A,axis=1) to get the tensor C having dimension (a,c).



However, I want to do the "weighted average" of tensor A along axis = 1.

Weights are specified in the matrix B having dimension (d,b).



For d = 1, I can do tf.tensordot(A,B,[1,1]) to get the result of dimension (a,c).

Now for d=a, I am unable to compute the weighted average.



Can someone suggest a solution?







python tensorflow recurrent-neural-network weighted-average






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 28 at 13:53







abhi

















asked Mar 28 at 13:46









abhiabhi

987 bronze badges




987 bronze badges















  • Try tf.reduce_sum(A * B[:, :, None], axis=1) / tf.reduce_sum(B, axis=1, keepdims=True). If it works, I'll turn it into an answer.

    – Siyuan Ren
    Mar 28 at 15:30











  • @SiyuanRen can you please explain what it does?

    – abhi
    Mar 29 at 8:29











  • @SiyuanRen weights are already normalized. So no need for division operation. I think division operation is normalizing weights so that it sums to 1. Can you explain the evaluation of the first part?

    – abhi
    Mar 29 at 9:21

















  • Try tf.reduce_sum(A * B[:, :, None], axis=1) / tf.reduce_sum(B, axis=1, keepdims=True). If it works, I'll turn it into an answer.

    – Siyuan Ren
    Mar 28 at 15:30











  • @SiyuanRen can you please explain what it does?

    – abhi
    Mar 29 at 8:29











  • @SiyuanRen weights are already normalized. So no need for division operation. I think division operation is normalizing weights so that it sums to 1. Can you explain the evaluation of the first part?

    – abhi
    Mar 29 at 9:21
















Try tf.reduce_sum(A * B[:, :, None], axis=1) / tf.reduce_sum(B, axis=1, keepdims=True). If it works, I'll turn it into an answer.

– Siyuan Ren
Mar 28 at 15:30





Try tf.reduce_sum(A * B[:, :, None], axis=1) / tf.reduce_sum(B, axis=1, keepdims=True). If it works, I'll turn it into an answer.

– Siyuan Ren
Mar 28 at 15:30













@SiyuanRen can you please explain what it does?

– abhi
Mar 29 at 8:29





@SiyuanRen can you please explain what it does?

– abhi
Mar 29 at 8:29













@SiyuanRen weights are already normalized. So no need for division operation. I think division operation is normalizing weights so that it sums to 1. Can you explain the evaluation of the first part?

– abhi
Mar 29 at 9:21





@SiyuanRen weights are already normalized. So no need for division operation. I think division operation is normalizing weights so that it sums to 1. Can you explain the evaluation of the first part?

– abhi
Mar 29 at 9:21












2 Answers
2






active

oldest

votes


















1
















I don't quite get why B should have dimensions (d,b). If B contains the weights to do a weighted average of A across only one dimension, B only has to be a vector (b,), not a matrix.



If B is a vector, you can do:



C = tf.tensordot(A,B,[1,0]) to get a vector C of shape (a,c) which contains the weighted average of A across axis=1 using the weights specified in B.



Update:



You can do something like:



A = A*B[:,:,None] 


which is doing element wise multiplication of A and B, where B stores the weights given to each element in A.
Then:



C = tf.reduce_mean(A,axis=1)


will do the weighted average since each element in A has been multiplied by its weight.






share|improve this answer



























  • I have obtained the results for the d=1 case. I need d=a case because I have weights for each input and batch size is specified by a and d.

    – abhi
    Mar 29 at 8:12







  • 1





    Ok, sorry, then you can do something like: A = A*B[:,:,None] (this is doing element wise multiplication of A and B, where B stores the weights given to each element in A) and then C = tf.reduce_mean(A,axis=1), which will do the weighted mean since each element in A has been multiplied by its weight.

    – Guillem Cucurull
    Mar 30 at 8:35


















1
















Since B is already normalized, the answer is



tf.reduce_sum(A * B[:, :, None], axis=1)


Indexing with None adds a new dimension, a behavior inherited from numpy.B[:,:, None] adds a last dimension so the result has shape (a, b, 1). You can achieve the same thing with tf.expand_dims, whose name may make more sense to you.



A has shape (a, b, c) while B[:, :, None] has shape (a, b, 1). When they are multiplied, expanded B will be treated as having shape (a, b, c) too, with the last dimension being c copies of the same value. This is called broadcasting.



Because of how broadcasting works, the same answer also works if B has shape (1, b).






share|improve this answer



























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );














    draft saved

    draft discarded
















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55399197%2fhow-to-compute-weighted-average-of-tensor-a-along-an-axis-with-weights-specified%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1
















    I don't quite get why B should have dimensions (d,b). If B contains the weights to do a weighted average of A across only one dimension, B only has to be a vector (b,), not a matrix.



    If B is a vector, you can do:



    C = tf.tensordot(A,B,[1,0]) to get a vector C of shape (a,c) which contains the weighted average of A across axis=1 using the weights specified in B.



    Update:



    You can do something like:



    A = A*B[:,:,None] 


    which is doing element wise multiplication of A and B, where B stores the weights given to each element in A.
    Then:



    C = tf.reduce_mean(A,axis=1)


    will do the weighted average since each element in A has been multiplied by its weight.






    share|improve this answer



























    • I have obtained the results for the d=1 case. I need d=a case because I have weights for each input and batch size is specified by a and d.

      – abhi
      Mar 29 at 8:12







    • 1





      Ok, sorry, then you can do something like: A = A*B[:,:,None] (this is doing element wise multiplication of A and B, where B stores the weights given to each element in A) and then C = tf.reduce_mean(A,axis=1), which will do the weighted mean since each element in A has been multiplied by its weight.

      – Guillem Cucurull
      Mar 30 at 8:35















    1
















    I don't quite get why B should have dimensions (d,b). If B contains the weights to do a weighted average of A across only one dimension, B only has to be a vector (b,), not a matrix.



    If B is a vector, you can do:



    C = tf.tensordot(A,B,[1,0]) to get a vector C of shape (a,c) which contains the weighted average of A across axis=1 using the weights specified in B.



    Update:



    You can do something like:



    A = A*B[:,:,None] 


    which is doing element wise multiplication of A and B, where B stores the weights given to each element in A.
    Then:



    C = tf.reduce_mean(A,axis=1)


    will do the weighted average since each element in A has been multiplied by its weight.






    share|improve this answer



























    • I have obtained the results for the d=1 case. I need d=a case because I have weights for each input and batch size is specified by a and d.

      – abhi
      Mar 29 at 8:12







    • 1





      Ok, sorry, then you can do something like: A = A*B[:,:,None] (this is doing element wise multiplication of A and B, where B stores the weights given to each element in A) and then C = tf.reduce_mean(A,axis=1), which will do the weighted mean since each element in A has been multiplied by its weight.

      – Guillem Cucurull
      Mar 30 at 8:35













    1














    1










    1









    I don't quite get why B should have dimensions (d,b). If B contains the weights to do a weighted average of A across only one dimension, B only has to be a vector (b,), not a matrix.



    If B is a vector, you can do:



    C = tf.tensordot(A,B,[1,0]) to get a vector C of shape (a,c) which contains the weighted average of A across axis=1 using the weights specified in B.



    Update:



    You can do something like:



    A = A*B[:,:,None] 


    which is doing element wise multiplication of A and B, where B stores the weights given to each element in A.
    Then:



    C = tf.reduce_mean(A,axis=1)


    will do the weighted average since each element in A has been multiplied by its weight.






    share|improve this answer















    I don't quite get why B should have dimensions (d,b). If B contains the weights to do a weighted average of A across only one dimension, B only has to be a vector (b,), not a matrix.



    If B is a vector, you can do:



    C = tf.tensordot(A,B,[1,0]) to get a vector C of shape (a,c) which contains the weighted average of A across axis=1 using the weights specified in B.



    Update:



    You can do something like:



    A = A*B[:,:,None] 


    which is doing element wise multiplication of A and B, where B stores the weights given to each element in A.
    Then:



    C = tf.reduce_mean(A,axis=1)


    will do the weighted average since each element in A has been multiplied by its weight.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Mar 30 at 8:37

























    answered Mar 28 at 15:24









    Guillem CucurullGuillem Cucurull

    1,3611 gold badge17 silver badges27 bronze badges




    1,3611 gold badge17 silver badges27 bronze badges















    • I have obtained the results for the d=1 case. I need d=a case because I have weights for each input and batch size is specified by a and d.

      – abhi
      Mar 29 at 8:12







    • 1





      Ok, sorry, then you can do something like: A = A*B[:,:,None] (this is doing element wise multiplication of A and B, where B stores the weights given to each element in A) and then C = tf.reduce_mean(A,axis=1), which will do the weighted mean since each element in A has been multiplied by its weight.

      – Guillem Cucurull
      Mar 30 at 8:35

















    • I have obtained the results for the d=1 case. I need d=a case because I have weights for each input and batch size is specified by a and d.

      – abhi
      Mar 29 at 8:12







    • 1





      Ok, sorry, then you can do something like: A = A*B[:,:,None] (this is doing element wise multiplication of A and B, where B stores the weights given to each element in A) and then C = tf.reduce_mean(A,axis=1), which will do the weighted mean since each element in A has been multiplied by its weight.

      – Guillem Cucurull
      Mar 30 at 8:35
















    I have obtained the results for the d=1 case. I need d=a case because I have weights for each input and batch size is specified by a and d.

    – abhi
    Mar 29 at 8:12






    I have obtained the results for the d=1 case. I need d=a case because I have weights for each input and batch size is specified by a and d.

    – abhi
    Mar 29 at 8:12





    1




    1





    Ok, sorry, then you can do something like: A = A*B[:,:,None] (this is doing element wise multiplication of A and B, where B stores the weights given to each element in A) and then C = tf.reduce_mean(A,axis=1), which will do the weighted mean since each element in A has been multiplied by its weight.

    – Guillem Cucurull
    Mar 30 at 8:35





    Ok, sorry, then you can do something like: A = A*B[:,:,None] (this is doing element wise multiplication of A and B, where B stores the weights given to each element in A) and then C = tf.reduce_mean(A,axis=1), which will do the weighted mean since each element in A has been multiplied by its weight.

    – Guillem Cucurull
    Mar 30 at 8:35













    1
















    Since B is already normalized, the answer is



    tf.reduce_sum(A * B[:, :, None], axis=1)


    Indexing with None adds a new dimension, a behavior inherited from numpy.B[:,:, None] adds a last dimension so the result has shape (a, b, 1). You can achieve the same thing with tf.expand_dims, whose name may make more sense to you.



    A has shape (a, b, c) while B[:, :, None] has shape (a, b, 1). When they are multiplied, expanded B will be treated as having shape (a, b, c) too, with the last dimension being c copies of the same value. This is called broadcasting.



    Because of how broadcasting works, the same answer also works if B has shape (1, b).






    share|improve this answer





























      1
















      Since B is already normalized, the answer is



      tf.reduce_sum(A * B[:, :, None], axis=1)


      Indexing with None adds a new dimension, a behavior inherited from numpy.B[:,:, None] adds a last dimension so the result has shape (a, b, 1). You can achieve the same thing with tf.expand_dims, whose name may make more sense to you.



      A has shape (a, b, c) while B[:, :, None] has shape (a, b, 1). When they are multiplied, expanded B will be treated as having shape (a, b, c) too, with the last dimension being c copies of the same value. This is called broadcasting.



      Because of how broadcasting works, the same answer also works if B has shape (1, b).






      share|improve this answer



























        1














        1










        1









        Since B is already normalized, the answer is



        tf.reduce_sum(A * B[:, :, None], axis=1)


        Indexing with None adds a new dimension, a behavior inherited from numpy.B[:,:, None] adds a last dimension so the result has shape (a, b, 1). You can achieve the same thing with tf.expand_dims, whose name may make more sense to you.



        A has shape (a, b, c) while B[:, :, None] has shape (a, b, 1). When they are multiplied, expanded B will be treated as having shape (a, b, c) too, with the last dimension being c copies of the same value. This is called broadcasting.



        Because of how broadcasting works, the same answer also works if B has shape (1, b).






        share|improve this answer













        Since B is already normalized, the answer is



        tf.reduce_sum(A * B[:, :, None], axis=1)


        Indexing with None adds a new dimension, a behavior inherited from numpy.B[:,:, None] adds a last dimension so the result has shape (a, b, 1). You can achieve the same thing with tf.expand_dims, whose name may make more sense to you.



        A has shape (a, b, c) while B[:, :, None] has shape (a, b, 1). When they are multiplied, expanded B will be treated as having shape (a, b, c) too, with the last dimension being c copies of the same value. This is called broadcasting.



        Because of how broadcasting works, the same answer also works if B has shape (1, b).







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Mar 30 at 2:05









        Siyuan RenSiyuan Ren

        4,7302 gold badges34 silver badges46 bronze badges




        4,7302 gold badges34 silver badges46 bronze badges































            draft saved

            draft discarded















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid …


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55399197%2fhow-to-compute-weighted-average-of-tensor-a-along-an-axis-with-weights-specified%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            How to preserve electronics (computers, tablets and phones) for hundreds of years Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) The network's official Twitter account is up and running again. What content…How might modern humans leave a message for 50,000 years?How would an aquatic race develop computers?How do we make computers care for human life?Keeping supplies for 1000 yearsWhat will cell phones become in 100 years?What body armor protects against a laser?Could a society attain 1800s technology if limited to using copper and bronze?Electricity power (magic) and electronicsScavenging metal resources in post-apocalypse after 100 yearsWhy would precursors create devices that can survive and still work after hundreds of years?

            155 수학 과학 기타 둘러보기 메뉴eh추가해eh문서를 완성해

            Convert JSON to MapSimplest way to convert a string representing JSON array into Java array List of key value pairsHow to take String JSON values into HashMapConvert a JSON String to a HashMapCreating BSON object from JSON stringJSONObject - How to get a value ?Better Map ConstructorReading JSON from Url javaUpdate columns if input values are not null otherwise ignore and keep the existing values of column in databaseHow to store object represented as Json string into Couchbase Lite?Go JSON into MapHow do I efficiently iterate over each entry in a Java Map?Sort a Map<Key, Value> by valuesHow to round a number to n decimal places in JavaCan comments be used in JSON?How do I read / convert an InputStream into a String in Java?How can I pretty-print JSON in a shell script?What is the correct JSON content type?How can I deserialize JSON to a simple Dictionary<string,string> in ASP.NET?Why does Google prepend while(1); to their JSON responses?Parse JSON in JavaScript?