【发布时间】:2020-10-16 03:15:39
【问题描述】:
我有一个网络。最后一层之前的一层是致密层。我希望最后一层返回前一层的最大值和该最大值的索引。
所以如果密集层的输出是 [0,4,5,120,1],那么最后一层应该返回 [120, 3]。 我需要网络处理的损失仅根据最大值计算,而不是索引。因此,我为第二个输出(即索引)编写了一个损失函数,该函数始终返回零 - 但如果有更好的解决方案,除了如何修复此错误之外,我还想听听。
代码是:
def ignor_loss(preds, trues):
return 0
# build deep q network
inputs = Input((240,256,3))
pool0 = MaxPooling2D()(inputs)
conv1 = Conv2D(30,3,activation='relu')(pool0)
pool1 = MaxPooling2D()(conv1)
conv2 = Conv2D(40,3,activation='relu')(pool1)
pool2 = MaxPooling2D()(conv2)
conv3 = Conv2D(50,3,activation='relu')(pool2)
pool3 = MaxPooling2D()(conv3)
conv4 = Conv2D(60,3,activation='relu')(pool3)
pool4 = MaxPooling2D()(conv4)
conv5 = Conv2D(80,3,activation='relu')(pool4)
flat = Flatten()(conv5)
dense1 = Dense(70)(flat)
dense2 = Dense(40)(dense1)
values = Dense(env.action_space.n)(dense2)
max_, ind = Lambda(lambda x : [K.max(x),K.argmax(x)])(values)
m = Model(inputs, [max_, ind])
m.compile('adam', ['mse',ignor_loss])
错误是:
TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'
有什么想法吗?
编辑:
这是我更新的代码:
# build deep q network
inputs = Input((240,256,3))
pool0 = MaxPooling2D()(inputs)
conv1 = Conv2D(30,3,activation='relu')(pool0)
pool1 = MaxPooling2D()(conv1)
conv2 = Conv2D(40,3,activation='relu')(pool1)
pool2 = MaxPooling2D()(conv2)
conv3 = Conv2D(50,3,activation='relu')(pool2)
pool3 = MaxPooling2D()(conv3)
conv4 = Conv2D(60,3,activation='relu')(pool3)
pool4 = MaxPooling2D()(conv4)
conv5 = Conv2D(80,3,activation='relu')(pool4)
flat = Flatten()(conv5)
dense1 = Dense(70)(flat)
dense2 = Dense(40)(dense1)
q_values = Dense(env.action_space.n)(dense2)
max_q = Lambda(lambda x : K.max(x), name='max')(q_values)
ind = Lambda(lambda x : K.argmax(x), name='ind')(q_values)
m = Model(inputs, [max_q,ind])
m.compile('adam', {'max':'mse','ind':'mse'}, loss_weights=[1., 0.0])
我仍然遇到同样的错误:
unsupported operand type(s) for -: 'int' and 'NoneType'
我需要知道为什么会出现这个错误?有什么想法吗?
编辑 2:
现在我将 keepdims=True 添加到 max 函数,并将 K.expand_dims 添加到 argmax 函数,如下所示:
q_values = Dense(env.action_space.n)(dense2)
max_q = Lambda(lambda x : K.max(x, keepdims=True), name='max')(q_values)
ind = Lambda(lambda x : K.expand_dims(K.argmax(x)), name='ind')(q_values)
m = Model(inputs, [max_q,ind])
m.compile('adam', {'max':'mse','ind':'mse'}, loss_weights=[1., 0.0])
但我得到一个不同的错误:
TypeError: Expected int64, got 0.0 of type 'float' instead.
【问题讨论】:
标签: tensorflow keras deep-learning loss-function