【问题标题】:Last output layer with multiple classes. Keras backed by Tensorflow具有多个类的最后一个输出层。由 Tensorflow 支持的 Keras
【发布时间】:2018-03-09 08:56:45
【问题描述】:

关注此example 和此article 进行强化学习。我终于设法创建了一个类似的 Q-learning 来学习玩另一个游戏环境。我唯一的问题是神经网络的最后一个输出层,它代表了游戏的输入动作。

游戏环境的机制/逻辑与此问题无关,但游戏环境需要为每个给定动作同时输入 2 种类型的输入:

  1. 输入数字 1 表示在 3 个可能之间的单个按键 键。所以基本上这个层应该输出3个概率总和为1的类。然后我会选择最高的类 这三个中的概率。
  2. 输入数字 2 表示从 0 到 1 的百分比。并且应该独立于前三个类。

我真的不知道如何创建最后一个输出层,以便它总共有 4 个输出类。前 3 类应给出彼此之间的概率,总和为 1。最后一类应独立于前 3 类,取值范围为 0 到 1。

有人可以为我指出如何实现这一目标的正确方向吗?我如何构建这样一个层?

我正在为第一个输入考虑这样的事情:

model.add(Dense(output_dim=3))
model.add(Activation("softmax"))
model.compile(loss='categorical_crossentropy', optimizer="adam")

然后对于第二个输入类似这样的内容

model.add(Dense(output_dim=1))
model.add(Activation("sigmoid"))
model.compile(loss='binary_crossentropy', optimizer='adam')

但我如何将它们组合成一个输出层?

也许您想到了另一种结构?

【问题讨论】:

标签: tensorflow neural-network deep-learning keras reinforcement-learning


【解决方案1】:

您需要使用functional API。然后,您可以有多个输出并为每个输出使用不同的损失函数,因为 compile()loss 参数接受字典。这是一个小例子。我编造了num_samplesnum_features,但在其他方面遵循了您的规范:

import numpy as np

from keras.layers import Input, Dense
from keras.models import Model
from keras.utils import to_categorical

num_samples = 10
num_features = 5
num_keys = 3

inputs = Input(shape=(num_features,))
hidden = Dense(30)(inputs)
key_press = Dense(num_keys, name='key_press', activation='softmax')(hidden)
percentage = Dense(1, name='percentage', activation='sigmoid')(hidden)

model = Model(inputs=inputs, outputs=[key_press, percentage])

loss_map = {'key_press': 'categorical_crossentropy', 'percentage': 'mse'}

model.compile(loss=loss_map, optimizer='sgd')

然后,当您 fit() 时,您需要传入 y 的字典。

y_key_press = np.random.randint(num_keys, size=num_samples)
y_key_press = to_categorical(y_key_press)  # needs to be one-hot encoded

y_percentage = np.random.uniform(size=num_samples)

y = {'key_press': y_key_press, 'percentage': y_percentage}
x = np.random.normal(size=(num_samples, num_features))

model.fit(x=x, y=y, epochs=5)

【讨论】:

  • 谢谢,这正是我要找的 :)
【解决方案2】:

您可以使用 2 个输出层,每个层都有自己的损失。在 keras 的模型定义中使用输出数组。

【讨论】:

  • 能举个例子吗?最后调用model.compile 时,我真的不明白这怎么可能
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 2019-09-17
  • 2019-03-28
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多