python - Keras模型输入形状错误

标签 python numpy tensorflow keras

我有一个 keras 模型,其布局如下

def keras_model(x_train, y_train, x_test, y_test):
    model = Sequential()
    model.add(Dense(128, input_dim=x_train.shape[1], activation='relu'))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(512,activation='relu'))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(128,activation='relu'))
    #model.add(Dense(10,activation='relu'))
    model.add(Dense(y_train.shape[1], activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    monitor = EarlyStopping(monitor='val_loss', min_delta=1e-3, patience=5, verbose=1, mode='auto')
    checkpointer = ModelCheckpoint(filepath="best_weights.hdf5", verbose=0, save_best_only=True) # save best model

    model.fit(x_train ,y_train, validation_data=(x_test, y_test),callbacks=[monitor,checkpointer], verbose=2,epochs=1000)
    model.load_weights('best_weights.hdf5') # load weights from best model

    return model

根据开放式健身房 cartpole 游戏的数据进行训练并保存模型。 下一步是使用训练好的模型进行预测

from keras.models import load_model
model = load_model('data/model-v0.h5')
action = random.randrange(0,2)

import gym
env = gym.make("CartPole-v0")
env.reset()
>>> array([ 0.02429215, -0.00674185, -0.03713565, -0.0046836 ])

import random
action = random.randrange(0,2)
observation, reward, done, info = env.step(action)
observation.shape
>>> (4,)

new_observation, reward, done, info = env.step(action)
prev_obs = new_observation
prev_obs
>>> array([-0.00229585,  0.15330146,  0.02160273, -0.30723955])

prev_obs.shape
>>> (4,)

model.predict(prev_obs)
>>>
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-943f2f44ed64> in <module>()
----> 1 model.predict(prev_obs)

c:\users\samuel\appdata\local\programs\python\python35\lib\site-packages\keras\engine\training.py in predict(self, x, batch_size, verbose, steps)
   1145                              'argument.')
   1146         # Validate user data.
-> 1147         x, _, _ = self._standardize_user_data(x)
   1148         if self.stateful:
   1149             if x[0].shape[0] > batch_size and x[0].shape[0] % batch_size != 0:

c:\users\samuel\appdata\local\programs\python\python35\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    747             feed_input_shapes,
    748             check_batch_axis=False,  # Don't enforce the batch size.
--> 749             exception_prefix='input')
    750 
    751         if y is not None:

c:\users\samuel\appdata\local\programs\python\python35\lib\site-packages\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    135                             ': expected ' + names[i] + ' to have shape ' +
    136                             str(shape) + ' but got array with shape ' +
--> 137                             str(data_shape))
    138     return data
    139 

ValueError: Error when checking input: expected dense_1_input to have shape (4,) but got array with shape (1,)

观察的形状与所使用的训练数据的形状相似,问题甚至正如您所看到的,观察prev_observation的形状为(4,) 但当输入模型进行预测时会抛出错误并声称输入的形状为 (1,)

我什至尝试过 reshape 它

prev_obs.shape = (4,)
prev_obs.reshape((4,))

但它仍然抛出相同的错误。

最佳答案

keras 的 API 始终假设您以批处理或数组形式提供数据,以便从中提取批处理数据。因此,即使模型的第一层需要 (4,) 的输入形状,您也必须将数据 reshape 为 (1,4) 形状。

model.predict(prev_obs.reshape((1, -1)

这告诉模型对 1 个数据样本进行预测,该数据样本由 4 维向量(观察值)组成。

关于python - Keras模型输入形状错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51925937/

相关文章:

python - 如何在某些条件下获取特定日期之前的行数

python - 如何使用索引和值迭代 1d NumPy 数组

python - 我的绘图和 FWHM 计算出现错误

tensorflow - 是否有可能有一个返回数组(或张量)而不是数字的度量?

python - 如何在实时网站上的 Django 中向 Google 授权应用程序

python - SSL 超越任何东西?

python - 使用 einsum 进行 Numpy 重写操作

python - Tensorflow - 值错误 : Output tensors to a Model must be the output of a TensorFlow `Layer`

python - 有没有办法限制现有的 TensorFlow 对象检测模型?

python - python 类 __init__ 方法会隐式返回 None 吗?