Как добавить второй входной аргумент (первый - изображение) в модель CNN, созданную с помощью Keras? - PullRequest
0 голосов
/ 20 ноября 2018

Допустим, у меня есть список изображений (преобразованных в массивы), загруженных из Instagram, вместе с соответствующими им лайками и пользователем подписчиков .И скажем, у меня есть модель CNN (использующая Keras на Tensorflow ), которую я тренирую на этих изображениях (массивы 200x200x3), и она пытается предсказать числоиз лайков , которые получит изображение.

Что, если я хочу дать этой модели каждому соответствующему изображению подписчиков в качестве второго входа ?

Это мой код:

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)))

1 Ответ

0 голосов
/ 21 ноября 2018

Один из подходов состоит в том, чтобы использовать модель с двумя ветвями, в которой одна ветвь обрабатывает изображение, а другая ветвь обрабатывает другие входные данные, не относящиеся к изображению (такие как сообщения текстов или количество подписчиков и подписок и т. Д.).Затем вы можете объединить результаты этих двух ветвей и, возможно, добавить несколько других слоев впоследствии, чтобы действовать в качестве окончательного классификатора / регрессора.Чтобы построить такую ​​модель в Keras, вам нужно использовать функциональный API .Просто для демонстрации, вот пример:

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, ...)

Обратите внимание, что мы использовали слой concatenation выше, но есть и другие слои слияния , которые вы можете использовать.И убедитесь, что вы прочитали функциональное руководство по API , это руководство, которое нужно прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...