问题
I want to train a neural net based on a numpy array with 4 entries as the X-data and another array with one entry as the y-data.
X_train = [x1, x2, x3, x4]
y_train = [y1]
A rather simple thing I thought, but I can't get the input shape to work. I also found very little information about how the input shape works: Do you have to specify only the X data? What about the y data?
I already tried setting input_dim = 4, since that was the first logical thing to do but I got the following Error:
Error when checking input: expected dense_1_input to have shape (4,) but got array with shape (1,)
I then tried setting input_dim = (4, 1), since I thought the y data was causing that issue. But again I got an error message:
Error when checking input: expected dense_1_input to have 3 dimensions, but got array with shape (4, 1)
Heres the code:
# 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()
If someone could explain how the input shapes work would be much appreciated.
回答1:
Input shape always expect the batch size as first dimention.
For example in your case, the following layer does not expect an array of shape (4,)
Dense(64, input_dim=4, activation='relu')
The input shape of this dense layer is a tensor of shape (n, 4) where n is the batch size.
To pass your observation
to the model you first need to expand its dims as follows:
observation = np.asarray(observation)
observation = np.expand_dims(observation, axis=0) # From shape (4,) to (1, 4)
estimator.fit(observation, action)
Your code should look like this.
# 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))
Also if you are learning DQN check out this article
回答2:
Try this piece of code. You have to specify Input dimension when you are going to solve any regression problem with the neural net. So In input dimension you have to pass the number of columns you want to feed to your network.
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
Now You have to wrap it in the class keras regressor so that keras will know it is a regression problem you are going to solve.
estimator = KerasRegressor(build_fn=baseline_model, epochs=30, batch_size=3, verbose=1)
if you need more about how to solve Regression problem with keras than see the my notebook below you will get help from it.
Also use this line before calling Fit fucntion
(observation=observation.reshape(1,4))
Link : Solve Regression problem with Keras Neural Network
回答3:
Bro! For the second error use this code. Now its running fine for me.
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)
来源:https://stackoverflow.com/questions/57345443/keras-sequential-model-input-shape