Keras要求输出形状似乎不代表实际数据

时间:2018-04-19 18:35:36

标签: tensorflow neural-network keras reshape

我使用这个模型将84x84图像作为输入,4个类作为输出:

def __buildModel(self):
    model = Sequential()
    model.add(Conv2D(16, kernel_size=(8,8), strides=(4,4),
                     activation='relu',
                     input_shape=(None,84,84,)))
    model.add(Conv2D(32, kernel_size=(4,4), strides=(2,2), activation='relu'))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(4,activation='linear'))

    model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.RMSprop())

    return model

我将输入(状态)和输出(动作)塑造成我的想法:

actions = np.zeros((1,1,sampleSize,self.actionSize))
states = np.zeros((1,sampleSize,84,84))

self.model.fit(states,actions,epochs=1)

我收到错误:

ValueError: Error when checking target: expected dense_2 to have shape (None, None, 9, 4) but got array with shape (1, 1, 126, 4)

所以我把它改成了:

actions = np.zeros((1,sampleSize,9,self.actionSize))

但我明白了:

InvalidArgumentError (see above for traceback): Incompatible shapes: [1,79,9,4] vs. [1,8,9,4]
 [[Node: loss/dense_2_loss/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_dense_2_target_0_2, loss/dense_2_loss/Log)]]

任何人都知道发生了什么事,或者我在制作模型时犯了错误,我一直试图解决这个问题?感谢

1 个答案:

答案 0 :(得分:0)

参见model.summary(),您将看到模型正在使用的形状。

请注意,订单为(images, side1, side2, channels)

您正在反转input_shape,它应该是input_shape=(84,84,you_need_channels)。如果图像是B& W,则通道的数量可以是1;如果它们是RGB,则通道的数量可以是3,如果它们具有α通道,则可以是4,等等。

双方将沿着褶皱缩小,因为它们会失去边界。 (您可以在这些图层中使用padding='same'来阻止这种情况。

另请注意,Dense图层会保留图像边。

您可以使用Flatten()图层折叠边(如果您打算使用可变尺寸图像,则可能总是使用sizze 84x84,或GlobalMaxPooling2D()GlobalAveragePooling2D()。 / p>