展平和密集层之间的矩阵大小不兼容

时间:2019-09-27 03:08:18

标签: python-2.7 tensorflow keras

我正在尝试使用Keras实现多代理A2C算法。
使用Keras后端功能(K.fuction)时出现问题。

我输入了形状为(None,3,4,5)的输入。
此输入通过Flatten(),然后连接到Dense()

当我使用model.predict(input)时,它可以很好地工作,但是当我使用通过K.function定制的优化器时出现了问题。

我在K.function的model.input中输入了形状为(1000,3,4,5)的输入,但是出现了与矩阵大小不兼容的错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Matrix size-incompatible: In[0]: [3,20], In[1]: [60,64]
    [[{{node dense_1/Relu}}]]

看来Flatten()不能正常工作。

网络看起来像这样:

def build_network(self):
    inp = Input(shape=(3,4,5))
    x = Flatten()(inp)
    x = Dense(64, activation='relu')(x)
    x = Dense(128, activation='relu')(x)
    x = Dense(128, activation='relu')(x)
    out = Dense(9, activation='softmax')(x)

    return Model(inp, out)

self.model = self.build_network()

model.summary()

定制的优化器在这里:

import keras.backend as K

def optimizer(self):
    weighted_actions = K.sum(self.action_pl * self.model.ouput, axis=1)
    eligibility = K.log(weighted_actions + 1e-10) * K.stop_gradient(self.advantages_pl)
    entropy = K.sum(self.model.output * K.log(self.model.output + 1e-10), axis=1)
    loss = 0.001 * entropy - K.sum(eligibility)

    _out = K.zeros(shape=(1))
    updates = self.rms_optimizer.get_updates(self.model.trainable_weights, [], loss)

    return K.fucntion([self.model.input, self.action_pl, self.advantages_pl], _out, updates=updates)

self.opt = self.optimizer()

self.opt([input, actions, advantages]) # Error occured here. input.shape = (1000,3,4,5)

我不知道为什么会发生以及如何解决这个问题。

任何建议将不胜感激。

环境: Ubuntu16.04 Python2.7 凯拉斯:2.3.0 tensorflow 1.14.0

1 个答案:

答案 0 :(得分:0)

问题似乎是输入的形状为[3,20],但在展平后应该为[1000,60]。

请检查输入的形状。您也可以使用

tf.expand_dims(
    input,
    axis,
    name=None
)

为您的输入添加尺寸并尝试。它应该可以解决您的问题。