我想训练一个基于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()
如果有人可以解释输入形状的工作原理,将不胜感激。
答案 0 :(得分:1)
输入形状始终将批次大小作为第一维。
例如,在您的情况下,下一层不希望包含形状(4,)的数组
<receiver>
此致密层的输入形状是形状(n,4)的张量,其中n是批大小。
要将您的android.intent.category.DEFAULT
传递给模型,您首先需要按以下方式扩展其暗淡度:
Intent
您的代码应如下所示。
Dense(64, input_dim=4, activation='relu')
如果您正在学习DQN,请查看此article
答案 1 :(得分:0)
尝试这段代码。要解决神经网络的任何回归问题时,必须指定输入维。因此,在输入维度中,您必须将要提供给网络的列数传递。
def baseline_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
现在,您必须将其包装在keras回归类中,以便keras知道这是您要解决的回归问题。
estimator = KerasRegressor(build_fn=baseline_model, epochs=30, batch_size=3, verbose=1)
如果您需要了解更多有关如何解决keras回归问题的知识,而不是看下面的笔记本,您将获得帮助。
在调用健身功能之前也要使用此行
(observation=observation.reshape(1,4))
答案 2 :(得分:0)
兄弟!对于第二个错误,请使用此代码。现在对我来说一切正常。
X=[]
y=[]
# 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 = np.asarray(observation)
reward = np.asarray(reward)
action = np.asarray(action)
X.append( observation)
y.append(action)
if done:
break
env.close()
X=np.asarray(X)
y=np.asarray(y)
estimator = KerasRegressor(build_fn=model, epochs=30, batch_size=3, verbose=1)
estimator.fit(X, y)