微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 DQNAgent.fit 会为我的输入数据添加额外的维度?

如何解决为什么 DQNAgent.fit 会为我的输入数据添加额外的维度?

我正在使用 Keras 的一种深度 q 学习代理:DQNAgent。当我将环境传递给 DQNAgent.fit 时,收到以下错误

**3 dqn.fit(env,nb_steps=50000,visualize=False,verbose=1)**

/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training_utils_v1.py 在standardize_input_data(数据,名称,形状,check_batch_axis, 异常前缀)

655                            ': expected ' + names[i] + ' to have ' +
656                            str(len(shape)) + ' dimensions,but got array '
**657                            'with shape ' + str(data_shape))**
658         if not check_batch_axis:
659           data_shape = data_shape[1:]

ValueError:检查输入时出错:预期的dense_18_input有 二维,但得到了形状为 (1,1,65) 的数组

我的环境状态和空间定义如下:

self.state = np.zeros(65,dtype=int)
self.action_space = spaces.Tuple((spaces.discrete(64),spaces.discrete(64)))
self.observation_space = spaces.Box(low=0,high=16,shape=(65,),dtype=np.int)

我正在使用以下模型:

states = env.observation_space.shape
actions = 64**2
def build_model(states,actions):
    model = Sequential()    
    model.add(Dense(100,activation='relu',input_shape=states))
    model.add(Dense(200,activation='relu'))
    model.add(Dense(actions,activation='linear'))
    return model

我环境的状态向量的形状为 (65,),但 fit 方法将其增强为 (1,65) -- 导致形状不匹配。需要明确的是,self.state 是作为对环境的观察返回的。有谁知道为什么会这样?

解决方法

首先,当您指定模型的输入时,Keras 会添加另一个维度,因为它需要一个 Batch。例如:

input_shape=(65,) --> (None,65)

因此,当您将单个观察结果转发到模型中时,Keras 会假设 batch_size=1。因此,您的输入大小变为:

(None,65) --> (1,65)

现在,为了获得形状为 (1,1,65) 的输入,这意味着您喂食和观察尺寸为 batch_size + (1,65) = (1,65)。这意味着出于某种原因,您的观察结果在实际输入网络之前被转置(重塑)。

在将其提供给网络之前,您是否检查了观察形状?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。