【问题标题】:Keras - If I want to take three or more inputs of varying data sizes and types, is this model architecture correct?Keras - 如果我想接受三个或更多不同数据大小和类型的输入,这个模型架构是否正确?
【发布时间】:2019-08-02 05:24:10
【问题描述】:

我想将三个不同格式的输入(例如,一个是数字,一个是一个热编码数组,另一个是嵌入问题)传入我的 Keras 函数模型并得到一个数字(回归问题)。我过去只使用过顺序模型,所以我很难理解它是如何工作的。

这是我当前的模型架构(input_a 是一个热门,input_b 是一个从 0 到 1 的数字,input_c 是另一个热门,大小不同):

但是,我不确定这是否是我的模型应该按照我的意图进行格式化的“正确”方式。因为当我将第三个输入更改为嵌入输入时,Keras 抱怨输入形状不正确。该数据集应该是一个整数数组,所以我将input_size 设置为 1,但嵌入层说它得到了一个 129 大小的数组。这是我在它上面的密集层的长度,所以我认为它接收的是密集层的输出而不是我的输入。

这是我的模型格式相同,但嵌入(失败):

input_a = Input(shape=genres.shape[1:], name='input_a')

x = Dense(128, activation='relu')(input_a)
output_a = Dense(128, activation='relu')(x)

input_b = Input(shape=(1,), name='input_b')
x = keras.layers.concatenate([output_a, input_b])

x = Dense(128, activation='relu')(x)
output_b = Dense(128, activation='relu')(x)

input_c = Input(shape=(1,), name='input_c')
x = keras.layers.concatenate([output_b, input_c])

x = Embedding(max(directors) + 1, 16, input_length=1)(x)
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
x = Dense(128, activation='relu')(x)

output_c = Dense(1)(x)

model = Model(inputs=[input_a, input_b, input_c], outputs=output_c)

但我得到"input_length" is 1, but received input has shape (None, 129)

如何让input_c 接收实际的第三个输入,而不是上述层的输出?

【问题讨论】:

  • 您将连接的输出传递给嵌入层,这是不正确的。 input_c 代表董事吗?如果是这样,那么只需将其直接传递给嵌入层。

标签: python keras


【解决方案1】:
input_c = Input(shape=(10,))
x = Embedding(1024, 16, input_length=10)(input_c)
output_c = Flatten()(x)

input_a = Input(shape=(10,))
x = Dense(128, activation='relu')(input_a)
output_a = Dense(128, activation='relu')(x)

input_b = Input(shape=(1,))
x = concatenate([output_a, input_b])
x = Dense(128, activation='relu')(x)
output_b = Dense(128, activation='relu')(x)

x = concatenate([output_b, output_c], axis=1)
output_c = Dense(1)(x)

model = Model([input_a, input_b, input_c], output_c)
model.predict([np.random.randn(1000,10), 
               np.random.randn(1000,1), 
               np.random.randint(0,1023,size=(1000,10))])

嵌入层将单词的索引作为输入,因此不要将其与其他输入连接。而是将 input_c 传递给嵌入层,然后将扁平化的词嵌入与其他嵌入连接起来。

【讨论】:

  • 非常感谢!看起来真的很好。我想出了类似的东西现在可以工作,所以我只需要对模型架构进行一些比较,看看哪个是最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 2023-04-03
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多