How to ignore part of input and output in Keras?











up vote
0
down vote

favorite












I'm trying to train a model that takes n values as input and output n values. The problem is that n can be from 1 to 700. So I build a network with 700 as input and 700 as output. The extra inputs and outputs are set to zero.
When training the model, I don't care about if the extra outputs are accurate or not. So I tried to define my own loss function as follows:



def mse_truncate(y_true, y_pred):
def fn(x):
return tf.cond(x < 0.01,lambda: 0.0,lambda: 1.0)
#Ignore the square error if y_true[i] is near zero
sgn = tf.map_fn(fn,y_true)
return K.mean(sgn * K.square(y_true-y_pred),axis=-1)


This function works on console.
But when I compile the model, I get an error:



model.compile(optimizer='sgd',loss=mse_truncate, metrics=['accuracy'])
ValueError: Shape must be rank 0 but is rank 1 for 'loss_5/dense_2_loss/map/while/cond/Switch' (op: 'Switch') with input shapes: [?], [?].


Can someone tell me what's wrong here?
Or are there better ways to handle the variable length input and output?



Note:
More on the problem, the input is a sequence(length <= 700) and the output is the distance between the first element and each element in the sequence.










share|improve this question


























    up vote
    0
    down vote

    favorite












    I'm trying to train a model that takes n values as input and output n values. The problem is that n can be from 1 to 700. So I build a network with 700 as input and 700 as output. The extra inputs and outputs are set to zero.
    When training the model, I don't care about if the extra outputs are accurate or not. So I tried to define my own loss function as follows:



    def mse_truncate(y_true, y_pred):
    def fn(x):
    return tf.cond(x < 0.01,lambda: 0.0,lambda: 1.0)
    #Ignore the square error if y_true[i] is near zero
    sgn = tf.map_fn(fn,y_true)
    return K.mean(sgn * K.square(y_true-y_pred),axis=-1)


    This function works on console.
    But when I compile the model, I get an error:



    model.compile(optimizer='sgd',loss=mse_truncate, metrics=['accuracy'])
    ValueError: Shape must be rank 0 but is rank 1 for 'loss_5/dense_2_loss/map/while/cond/Switch' (op: 'Switch') with input shapes: [?], [?].


    Can someone tell me what's wrong here?
    Or are there better ways to handle the variable length input and output?



    Note:
    More on the problem, the input is a sequence(length <= 700) and the output is the distance between the first element and each element in the sequence.










    share|improve this question
























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I'm trying to train a model that takes n values as input and output n values. The problem is that n can be from 1 to 700. So I build a network with 700 as input and 700 as output. The extra inputs and outputs are set to zero.
      When training the model, I don't care about if the extra outputs are accurate or not. So I tried to define my own loss function as follows:



      def mse_truncate(y_true, y_pred):
      def fn(x):
      return tf.cond(x < 0.01,lambda: 0.0,lambda: 1.0)
      #Ignore the square error if y_true[i] is near zero
      sgn = tf.map_fn(fn,y_true)
      return K.mean(sgn * K.square(y_true-y_pred),axis=-1)


      This function works on console.
      But when I compile the model, I get an error:



      model.compile(optimizer='sgd',loss=mse_truncate, metrics=['accuracy'])
      ValueError: Shape must be rank 0 but is rank 1 for 'loss_5/dense_2_loss/map/while/cond/Switch' (op: 'Switch') with input shapes: [?], [?].


      Can someone tell me what's wrong here?
      Or are there better ways to handle the variable length input and output?



      Note:
      More on the problem, the input is a sequence(length <= 700) and the output is the distance between the first element and each element in the sequence.










      share|improve this question













      I'm trying to train a model that takes n values as input and output n values. The problem is that n can be from 1 to 700. So I build a network with 700 as input and 700 as output. The extra inputs and outputs are set to zero.
      When training the model, I don't care about if the extra outputs are accurate or not. So I tried to define my own loss function as follows:



      def mse_truncate(y_true, y_pred):
      def fn(x):
      return tf.cond(x < 0.01,lambda: 0.0,lambda: 1.0)
      #Ignore the square error if y_true[i] is near zero
      sgn = tf.map_fn(fn,y_true)
      return K.mean(sgn * K.square(y_true-y_pred),axis=-1)


      This function works on console.
      But when I compile the model, I get an error:



      model.compile(optimizer='sgd',loss=mse_truncate, metrics=['accuracy'])
      ValueError: Shape must be rank 0 but is rank 1 for 'loss_5/dense_2_loss/map/while/cond/Switch' (op: 'Switch') with input shapes: [?], [?].


      Can someone tell me what's wrong here?
      Or are there better ways to handle the variable length input and output?



      Note:
      More on the problem, the input is a sequence(length <= 700) and the output is the distance between the first element and each element in the sequence.







      python machine-learning keras conv-neural-network loss-function






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 8 at 21:41









      Varelse

      13




      13





























          active

          oldest

          votes











          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',
          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/3.0/"u003ecc by-sa 3.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%2f53216564%2fhow-to-ignore-part-of-input-and-output-in-keras%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53216564%2fhow-to-ignore-part-of-input-and-output-in-keras%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 pass form data using jquery Ajax to insert data in database?

          National Museum of Racing and Hall of Fame

          Guess what letter conforming each word