How to add a second input argument (the first is an image) to a CNN model built with Keras?












1















Let's say I have a list of images (converted to numpy arrays) downloaded from Instagram, along with their corresponding likes and user followers. And let's say I have a CNN model (using Keras on Tensorflow) which I train on these images (200x200x3 numpy arrays) and it tries to predict the number of likes an image will get.



What if I want to give to this model each image's corresponding followers as a second input?



This is my code so far:



IMAGESIZE = (200, 200)

def create_model():
# create model and add layers
model = Sequential()

model.add(Conv2D(10, 5, 5, activation='relu',
input_shape=(IMAGESIZE[0], IMAGESIZE[1], 3)))

model.add(Conv2D(10, 5, 5, activation='relu'))
model.add(MaxPool2D((5, 5)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(50))
model.add(Activation('relu'))
model.add(Dense(1))

print(model.summary())

model.compile(loss='mse',
optimizer='rmsprop', metrics=["accuracy"])
return model

# Read the likes
likes = getlikes(src='../data/pickledump')
likesraw = np.array(likes)
likes = (likesraw - np.mean(likesraw))/np.std(likesraw) # normalize

# Read the images and resize them
images =
for imgfile in glob.glob('../data/download/*.jpeg'):
img = cv2.imread(imgfile)
resized = cv2.resize(img, IMAGESIZE)
images.append(resized)
break
images = np.array(images)

# Read the followers
followers= getfollowers(src='../data/pickledump')
followersraw= np.array(followers)
followers= (followersraw- np.mean(followersraw))/np.std(followersraw) # normalize

classifier = KerasClassifier(build_fn=create_model, epochs=20)
print("Accuracy (Cross Validation=10): ",
np.mean(cross_val_score(classifier, images, likes, cv=2)))









share|improve this question





























    1















    Let's say I have a list of images (converted to numpy arrays) downloaded from Instagram, along with their corresponding likes and user followers. And let's say I have a CNN model (using Keras on Tensorflow) which I train on these images (200x200x3 numpy arrays) and it tries to predict the number of likes an image will get.



    What if I want to give to this model each image's corresponding followers as a second input?



    This is my code so far:



    IMAGESIZE = (200, 200)

    def create_model():
    # create model and add layers
    model = Sequential()

    model.add(Conv2D(10, 5, 5, activation='relu',
    input_shape=(IMAGESIZE[0], IMAGESIZE[1], 3)))

    model.add(Conv2D(10, 5, 5, activation='relu'))
    model.add(MaxPool2D((5, 5)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(50))
    model.add(Activation('relu'))
    model.add(Dense(1))

    print(model.summary())

    model.compile(loss='mse',
    optimizer='rmsprop', metrics=["accuracy"])
    return model

    # Read the likes
    likes = getlikes(src='../data/pickledump')
    likesraw = np.array(likes)
    likes = (likesraw - np.mean(likesraw))/np.std(likesraw) # normalize

    # Read the images and resize them
    images =
    for imgfile in glob.glob('../data/download/*.jpeg'):
    img = cv2.imread(imgfile)
    resized = cv2.resize(img, IMAGESIZE)
    images.append(resized)
    break
    images = np.array(images)

    # Read the followers
    followers= getfollowers(src='../data/pickledump')
    followersraw= np.array(followers)
    followers= (followersraw- np.mean(followersraw))/np.std(followersraw) # normalize

    classifier = KerasClassifier(build_fn=create_model, epochs=20)
    print("Accuracy (Cross Validation=10): ",
    np.mean(cross_val_score(classifier, images, likes, cv=2)))









    share|improve this question



























      1












      1








      1








      Let's say I have a list of images (converted to numpy arrays) downloaded from Instagram, along with their corresponding likes and user followers. And let's say I have a CNN model (using Keras on Tensorflow) which I train on these images (200x200x3 numpy arrays) and it tries to predict the number of likes an image will get.



      What if I want to give to this model each image's corresponding followers as a second input?



      This is my code so far:



      IMAGESIZE = (200, 200)

      def create_model():
      # create model and add layers
      model = Sequential()

      model.add(Conv2D(10, 5, 5, activation='relu',
      input_shape=(IMAGESIZE[0], IMAGESIZE[1], 3)))

      model.add(Conv2D(10, 5, 5, activation='relu'))
      model.add(MaxPool2D((5, 5)))
      model.add(Dropout(0.2))
      model.add(Flatten())
      model.add(Dense(50))
      model.add(Activation('relu'))
      model.add(Dense(1))

      print(model.summary())

      model.compile(loss='mse',
      optimizer='rmsprop', metrics=["accuracy"])
      return model

      # Read the likes
      likes = getlikes(src='../data/pickledump')
      likesraw = np.array(likes)
      likes = (likesraw - np.mean(likesraw))/np.std(likesraw) # normalize

      # Read the images and resize them
      images =
      for imgfile in glob.glob('../data/download/*.jpeg'):
      img = cv2.imread(imgfile)
      resized = cv2.resize(img, IMAGESIZE)
      images.append(resized)
      break
      images = np.array(images)

      # Read the followers
      followers= getfollowers(src='../data/pickledump')
      followersraw= np.array(followers)
      followers= (followersraw- np.mean(followersraw))/np.std(followersraw) # normalize

      classifier = KerasClassifier(build_fn=create_model, epochs=20)
      print("Accuracy (Cross Validation=10): ",
      np.mean(cross_val_score(classifier, images, likes, cv=2)))









      share|improve this question
















      Let's say I have a list of images (converted to numpy arrays) downloaded from Instagram, along with their corresponding likes and user followers. And let's say I have a CNN model (using Keras on Tensorflow) which I train on these images (200x200x3 numpy arrays) and it tries to predict the number of likes an image will get.



      What if I want to give to this model each image's corresponding followers as a second input?



      This is my code so far:



      IMAGESIZE = (200, 200)

      def create_model():
      # create model and add layers
      model = Sequential()

      model.add(Conv2D(10, 5, 5, activation='relu',
      input_shape=(IMAGESIZE[0], IMAGESIZE[1], 3)))

      model.add(Conv2D(10, 5, 5, activation='relu'))
      model.add(MaxPool2D((5, 5)))
      model.add(Dropout(0.2))
      model.add(Flatten())
      model.add(Dense(50))
      model.add(Activation('relu'))
      model.add(Dense(1))

      print(model.summary())

      model.compile(loss='mse',
      optimizer='rmsprop', metrics=["accuracy"])
      return model

      # Read the likes
      likes = getlikes(src='../data/pickledump')
      likesraw = np.array(likes)
      likes = (likesraw - np.mean(likesraw))/np.std(likesraw) # normalize

      # Read the images and resize them
      images =
      for imgfile in glob.glob('../data/download/*.jpeg'):
      img = cv2.imread(imgfile)
      resized = cv2.resize(img, IMAGESIZE)
      images.append(resized)
      break
      images = np.array(images)

      # Read the followers
      followers= getfollowers(src='../data/pickledump')
      followersraw= np.array(followers)
      followers= (followersraw- np.mean(followersraw))/np.std(followersraw) # normalize

      classifier = KerasClassifier(build_fn=create_model, epochs=20)
      print("Accuracy (Cross Validation=10): ",
      np.mean(cross_val_score(classifier, images, likes, cv=2)))






      python tensorflow machine-learning keras conv-neural-network






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 7:44









      today

      10.9k22037




      10.9k22037










      asked Nov 20 '18 at 20:17









      drkostasdrkostas

      163318




      163318
























          1 Answer
          1






          active

          oldest

          votes


















          1














          One approach is to use a two branch model, where one branch processes the image and another branch processes other non-image inputs (such as posts texts or number of followers and followings, etc.). Then you can merge the result of these two branches and possibly add a few other layers afterwards to act a the final classifier/regressor. To build such a model in Keras you need to use the functional API instead. Just for demonstration, here is an example:



          inp_img = Input(shape=image_shape)
          inp_others = Input(shape=others_shape)

          # branch 1: process input image
          x = Conv2D(...)(inp_img)
          x = Conv2D(...)(x)
          x = MaxPool2D(...)(x)
          out_b1 = Flatten()(x)

          # branch 2: process other input
          out_b2 = Dense(...)(inp_other)


          # merge the results by concatenation
          merged = concatenate([out_b1, out_b2])

          # pass merged tensor to some other layers
          x = Dense(...)(merged)
          output = Dense(...)(x)

          # build the model and compile it
          model = Model([inp_img, inp_other], output)
          model.compile(...)

          # fit on training data
          model.fit([img_array, other_array], label_array, ...)


          Note that we used concatenation layer above, but there are other merge layers which you can use. And make sure you read the functional API guide, it's a must-read guide.






          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/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%2f53400895%2fhow-to-add-a-second-input-argument-the-first-is-an-image-to-a-cnn-model-built%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            One approach is to use a two branch model, where one branch processes the image and another branch processes other non-image inputs (such as posts texts or number of followers and followings, etc.). Then you can merge the result of these two branches and possibly add a few other layers afterwards to act a the final classifier/regressor. To build such a model in Keras you need to use the functional API instead. Just for demonstration, here is an example:



            inp_img = Input(shape=image_shape)
            inp_others = Input(shape=others_shape)

            # branch 1: process input image
            x = Conv2D(...)(inp_img)
            x = Conv2D(...)(x)
            x = MaxPool2D(...)(x)
            out_b1 = Flatten()(x)

            # branch 2: process other input
            out_b2 = Dense(...)(inp_other)


            # merge the results by concatenation
            merged = concatenate([out_b1, out_b2])

            # pass merged tensor to some other layers
            x = Dense(...)(merged)
            output = Dense(...)(x)

            # build the model and compile it
            model = Model([inp_img, inp_other], output)
            model.compile(...)

            # fit on training data
            model.fit([img_array, other_array], label_array, ...)


            Note that we used concatenation layer above, but there are other merge layers which you can use. And make sure you read the functional API guide, it's a must-read guide.






            share|improve this answer




























              1














              One approach is to use a two branch model, where one branch processes the image and another branch processes other non-image inputs (such as posts texts or number of followers and followings, etc.). Then you can merge the result of these two branches and possibly add a few other layers afterwards to act a the final classifier/regressor. To build such a model in Keras you need to use the functional API instead. Just for demonstration, here is an example:



              inp_img = Input(shape=image_shape)
              inp_others = Input(shape=others_shape)

              # branch 1: process input image
              x = Conv2D(...)(inp_img)
              x = Conv2D(...)(x)
              x = MaxPool2D(...)(x)
              out_b1 = Flatten()(x)

              # branch 2: process other input
              out_b2 = Dense(...)(inp_other)


              # merge the results by concatenation
              merged = concatenate([out_b1, out_b2])

              # pass merged tensor to some other layers
              x = Dense(...)(merged)
              output = Dense(...)(x)

              # build the model and compile it
              model = Model([inp_img, inp_other], output)
              model.compile(...)

              # fit on training data
              model.fit([img_array, other_array], label_array, ...)


              Note that we used concatenation layer above, but there are other merge layers which you can use. And make sure you read the functional API guide, it's a must-read guide.






              share|improve this answer


























                1












                1








                1







                One approach is to use a two branch model, where one branch processes the image and another branch processes other non-image inputs (such as posts texts or number of followers and followings, etc.). Then you can merge the result of these two branches and possibly add a few other layers afterwards to act a the final classifier/regressor. To build such a model in Keras you need to use the functional API instead. Just for demonstration, here is an example:



                inp_img = Input(shape=image_shape)
                inp_others = Input(shape=others_shape)

                # branch 1: process input image
                x = Conv2D(...)(inp_img)
                x = Conv2D(...)(x)
                x = MaxPool2D(...)(x)
                out_b1 = Flatten()(x)

                # branch 2: process other input
                out_b2 = Dense(...)(inp_other)


                # merge the results by concatenation
                merged = concatenate([out_b1, out_b2])

                # pass merged tensor to some other layers
                x = Dense(...)(merged)
                output = Dense(...)(x)

                # build the model and compile it
                model = Model([inp_img, inp_other], output)
                model.compile(...)

                # fit on training data
                model.fit([img_array, other_array], label_array, ...)


                Note that we used concatenation layer above, but there are other merge layers which you can use. And make sure you read the functional API guide, it's a must-read guide.






                share|improve this answer













                One approach is to use a two branch model, where one branch processes the image and another branch processes other non-image inputs (such as posts texts or number of followers and followings, etc.). Then you can merge the result of these two branches and possibly add a few other layers afterwards to act a the final classifier/regressor. To build such a model in Keras you need to use the functional API instead. Just for demonstration, here is an example:



                inp_img = Input(shape=image_shape)
                inp_others = Input(shape=others_shape)

                # branch 1: process input image
                x = Conv2D(...)(inp_img)
                x = Conv2D(...)(x)
                x = MaxPool2D(...)(x)
                out_b1 = Flatten()(x)

                # branch 2: process other input
                out_b2 = Dense(...)(inp_other)


                # merge the results by concatenation
                merged = concatenate([out_b1, out_b2])

                # pass merged tensor to some other layers
                x = Dense(...)(merged)
                output = Dense(...)(x)

                # build the model and compile it
                model = Model([inp_img, inp_other], output)
                model.compile(...)

                # fit on training data
                model.fit([img_array, other_array], label_array, ...)


                Note that we used concatenation layer above, but there are other merge layers which you can use. And make sure you read the functional API guide, it's a must-read guide.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 21 '18 at 7:42









                todaytoday

                10.9k22037




                10.9k22037
































                    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%2f53400895%2fhow-to-add-a-second-input-argument-the-first-is-an-image-to-a-cnn-model-built%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

                    Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

                    ComboBox Display Member on multiple fields

                    Is it possible to collect Nectar points via Trainline?