Keras顺序模型输入形状

约翰·苏斯(Johann Suess)

我想训练一个基于numpy数组的神经网络,该数组有4个条目作为X数据,另一个数组有一个条目作为y数据。

X_train = [x1,x2,x3,x4]
y_train = [y1]

我认为这很简单,但是我无法使输入形状起作用。我还发现很少有关输入形状工作方式的信息:您是否仅需要指定X数据?y数据呢?

我已经尝试设置input_dim = 4,因为这是要做的第一件事,但出现以下错误: Error when checking input: expected dense_1_input to have shape (4,) but got array with shape (1,)

然后,我尝试设置input_dim =(4,1),因为我认为y数据导致了该问题。但是我又收到一条错误消息:Error when checking input: expected dense_1_input to have 3 dimensions, but got array with shape (4, 1)

这是代码:

# importing the packages
import gym
import numpy as np
from collections import deque

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
from keras.wrappers.scikit_learn import KerasRegressor

from joblib import Parallel

# creating the environment
env = gym.make('CartPole-v1')

#defining global variables
lr=0.0001
decay=0.001
batch_size=None

# creating a deep learning model with keras
def model():
    model = Sequential()

    model.add(Dense(64, input_dim=4, activation='relu'))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(16, activation='relu'))

    model.add(Dense(1, activation='sigmoid'))

    model.compile(Adam(lr=lr, decay=decay), loss='mse')
    model.summary()
    return model

# running the game
for i_episodes in range(200):
    env.reset()
    for i in range(100):
        env.render()
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)

        # observation = ndarray float64
        # reward = float
        # done = bool
        # action = int
        # info = empty

        observation = np.asarray(observation)
        reward = np.asarray(reward)
        action = np.asarray(action)

        # print(observation.dtype, reward.dtype, action.dtype)
        # print(observation.shape, action.shape)

        estimator = KerasRegressor(build_fn=model, epochs=30, batch_size=3, verbose=1)
        estimator.fit(observation, action)

        if done:
            break
env.close()

如果有人可以解释输入形状的工作原理,将不胜感激。

威廉

输入形状始终将批次大小作为第一维。

例如,在您的情况下,下一层不需要形状数组(4,)

Dense(64, input_dim=4, activation='relu')

此致密层的输入形状是形状(n,4)的张量,其中n是批处理大小。

要将您observation的模型传递给模型,您首先需要按以下方式扩展其暗角:

observation = np.asarray(observation)
observation = np.expand_dims(observation, axis=0) # From shape (4,) to (1, 4)
estimator.fit(observation, action)

您的代码应如下所示。

# creating a deep learning model with keras
def build_model():
    model = Sequential()

    model.add(Dense(64, input_dim=4, activation='relu'))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(16, activation='relu'))

    model.add(Dense(1, activation='sigmoid'))

    model.compile(Adam(lr=lr, decay=decay), loss='mse')
    model.summary()
    return model

model = build_model()

# running the game
for i_episodes in range(200):
    env.reset()
    for i in range(100):
        env.render()
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)

        # observation = ndarray float64
        # reward = float
        # done = bool
        # action = int
        # info = empty

        observation = np.asarray(observation)
        reward = np.asarray(reward)
        action = np.asarray(action)

        model.fit(np.expand_dims(observation, axis=0), np.expand_dims(action, axis=0))

另外,如果您正在学习DQN,请查看本文

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章