如何操纵数组输入数据的神经网络输出形状

问题描述 投票:0回答:1

我是 Python 机器学习新手,我正在尝试调试在操作用于猜测游戏中字母的简单 DQN 模型的层大小和形状时遇到的错误。

states = 
def build_model():
    model = Sequential()    
    model.add(Dense(30, activation='relu', input_shape=(26,41)))
    model.add(Dense(30, activation='relu'))
    model.add(Dense(26, activation='linear'))
    return model
model = build_model()
model.summary()

上面的代码给出了以下模型

Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_1 (Dense)            (None, 26, 30)            1260      
                                                                 
 dense_2 (Dense)            (None, 26, 30)            930       
                                                                 
 dense_3 (Dense)            (None, 26, 26)            806       
                                                                 
=================================================================
Total params: 2,996
Trainable params: 2,996
Non-trainable params: 0
_________________________________________________________________

但是运行模型会在终端中出现以下错误:

Model output "Tensor("dense_61/BiasAdd:0", shape=(None, 26, 26), dtype=float32)" has invalid shape. DQN expects a model that has one dimension for each action, in this case 26.

我看到我的最终密集层正在输出 (None, 26, 26),这导致了错误。使用 keras 的重塑图层,我可以将图层更改为 (None, 780, 1),这仍然不是我想要的。我的问题是,如果密集层没有结构,为什么密集层的输出形状是多维的而不是一维的,以及如何操作输出形状以返回一维向量?

python keras deep-learning tensorflow2.0 dqn
1个回答
0
投票

Dense 实现操作:输出=激活(点(输入,内核)+偏差)

如果输入的维度为 (batch_size, d0, d1),那么我们创建一个形状为 (d1,units) 的内核,并且该内核沿输入的轴 2 对形状为 (1, 1, d1) 的每个子张量进行操作)(有batch_size * d0这样的子张量)。这种情况下的输出将具有形状(batch_size,d0,单位)。

在上面的代码中,当您传递实际数据时,None 将被替换为批量大小。摘要为您提供了整体情况,而无需实际传递任何数据。

例如,如果您有 100 张 26x24 图像,您的输入形状将为 (100, 26, 24)。您必须预处理数据,以便最终将其输入到构建的模型中。

© www.soinside.com 2019 - 2024. All rights reserved.