在Keras中,合并辅助输入会保留排序顺序

时间:2018-03-30 17:50:13

标签: keras

在一个模型体系结构中,主要数据包含应用于早期级别的卷积,然后是连接(合并),然后是密集操作,我们可以在批量洗牌时依赖于连接中的适当排序吗?

例如,考虑每周不同日期拍摄的照片集。在建筑学中,首先将照片进行卷积,然后进行压平操作。展平后,单个参数day_of_week将连接到展平张量,然后密集操作将导致最终输出。

我担心的是,示例照片与星期几之间的关联将会丢失。这会自动处理模型(输入= [photoconvdata,dowdata],...)语句吗?

1 个答案:

答案 0 :(得分:1)

Td; lr 是的,否则多输入模型可用于卷积。 有人可能会在后面的答案中引用代码路径,我将尝试提供一些经验证据。

首先让我们模拟一个3D Tensor(假设你在照片中使用了频道 - 这很重要)。我们希望明白这一点 未触及示例的索引。所以我们会留下一堆零 在最后一个例子中(样本)。你会注意到,当我们检查输出时,那些相同的零是最后一个示例输出。

我们测试它的方法是构建并适合模型。每个时代 我们将检查连接层的输出。我们应该找到一些迹象表明串联发生在正确的索引上。

Person * p = new Person ( name, surname, email );
auto it_l = lower_bound( sortedbyemail.begin(), sortedbyemail.end(),
                         p, PersonMailComparator() );

正如所料。但这不是你的问题,你对批处理期间发生的事情感兴趣。让批次和随机播放。我们来看看 在每个纪元之后输出Op并且我们可以预期输出为零(模型的重量将改变)我们应该看到最后一个例子中的所有值都是相同的。

from keras.model import Model
from keras.layers import Dense, Conv2D, concatenate, Flatten, Input
X = np.zeros((10, 10, 10, 10), dtype=np.int8)
# making the example different
X[:9, :] = np.random.randint(100, 110, (9, 10, 10, 10))

X_ this is your second input (photo_date)
X_ = np.ones((10, 1))

# model
inp = Input((10, 10, 10))
inp2 = Input((1,))
conv  = Conv2D(3, (2, 2))(inp)
flat = Flatten()(conv)
merge = concatenate([flat, inp2])
out = Dense(1, activation='sigmoid')(merge)
model = Model(inputs = [inp, inp2], outputs=[out])

# here is the function we're going to use to checkout the output 
# at the concatenation layer
concat_output = K.function([model.inputs[0], model.inputs[1], 
                        K.learning_phase()], 
                       [model.layers[4].output])

# print the output before training. This is what we expect, 0's are
# in the last position with a 1 concatenated to every index.
concat_output([X, X_, 0])

>>>    [array([[ 113.494606,   54.331547, -290.99573 , ...,   53.661514,
         -289.99292 ,    1.      ],
        [ 114.72675 ,   51.808422, -284.84506 , ...,   48.507256,
         -286.96945 ,    1.      ],
        [ 110.17914 ,   54.97028 , -288.6585  , ...,   51.36793 ,
         -287.4386  ,    1.      ],
        ...,
        [ 111.09259 ,   57.093   , -281.43994 , ...,   49.77134 ,
         -288.38226 ,    1.      ],
        [ 108.35742 ,   45.220837, -284.50668 , ...,   48.4583  ,
         -295.17084 ,    1.      ],
        [   0.      ,    0.      ,    0.      , ...,    0.      ,
            0.      ,    1.      ]], dtype=float32)]

是的,请注意,最后一个索引中的值都是相同的,这可以作为最后一个示例仍然是转换形式的证据 我们输入0。

希望这能让您确信不会将照片时间连接到错误的图像索引。