python - Keras 自定义数据生成器通过多输入和多输出提供维度错误(功能性 api 模型)
问题描述
我已经用 Keras 编写了一个生成器函数,在返回 X,y 之前,__getitem__
我仔细检查了 X 和 Y 的形状,它们没问题,但是生成器给出了维度不匹配数组和警告。
(Colab 代码重现:https ://colab.research.google.com/drive/1bSJm44MMDCWDU8IrG2GXKBvXNHCuY70G?usp=sharing )
我的训练和验证生成器与
class ValidGenerator(Sequence):
def __init__(self, df, batch_size=64):
self.batch_size = batch_size
self.df = df
self.indices = self.df.index.tolist()
self.num_classes = num_classes
self.shuffle = shuffle
self.on_epoch_end()
def __len__(self):
return int(len(self.indices) // self.batch_size)
def __getitem__(self, index):
index = self.index[index * self.batch_size:(index + 1) * self.batch_size]
batch = [self.indices[k] for k in index]
X, y = self.__get_data(batch)
return X, y
def on_epoch_end(self):
self.index = np.arange(len(self.indices))
if self.shuffle == True:
np.random.shuffle(self.index)
def __get_data(self, batch):
#some logic is written here
#hat prepares 3 X features and 3 Y outputs
X = [input_array_1,input_array_2,input_array_3]
y = [out_1,out_2,out_3]
#print(len(X))
return X, y
我返回 X,y 的元组,每个元组有 3 个输入特征和 3 个输出特征,所以 X 的形状是(3,32,10,1)
我正在使用功能 api 来构建模型(我有诸如串联、多输入/输出之类的东西,这在顺序上是不可能的)具有以下结构
当我尝试使用以下代码为模型拟合生成器时
train_datagen = TrainGenerator(df=train_df, batch_size=32, num_classes=None, shuffle=True)
valid_datagen = ValidGenerator(df=train_df, batch_size=32, num_classes=None, shuffle=True)
model.fit(train_datagen, epochs=2,verbose=1,callbacks=[checkpoint,es])
我收到了这些不会消失的警告和错误
Epoch 1/2 WARNING:tensorflow:Model 是用形状 (None, 10) 构造的输入 >Tensor("input_1:0", shape=(None, 10), dtype=float32),但它在输入上被调用 >形状不兼容(无,无,无)。
WARNING:tensorflow:Model 是用形状 (None, 10) 构建的输入张量 ("input_2:0", shape=(None, 10), dtype=float32), 但它是在形状不兼容的输入上调用的 (None,无,无)。WARNING:tensorflow:Model 是用形状 (None, 10) 作为输入 Tensor("input_3:0", shape=(None, 10), dtype=float32) 构建的,但它是在形状不兼容的输入上调用的 (None,无,无)。... ... 调用 return super(RNN, self)。调用(输入,**kwargs)/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:975 调用 input_spec.assert_input_compatibility(self.input_spec,输入,/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:176 assert_input_compatibility raise ValueError('输入' + str(input_index) + ' 层 ' +
ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, None, None, 88]
我已经重新检查了整个代码,并且不可能在警告或错误中输入(无,无,无),我的输入维度是(3,32,10,1)
更新
我也尝试用 python 编写一个生成器函数并得到完全相同的错误。
我的生成器功能
def generate_arrays_from_file(batchsize,df):
#print(bat)
inputs = []
targets = []
batchcount = 0
while True:
df3 = df.loc[np.arange(batchcount*batchsize,(batchcount*batchsize)+batchsize)]
#Some pre processing
X = [input_array_1,input_array_2,input_array_3]
y = [out_1,out_2,out_3]
yield X,y
batchcount = batchcount +1
keras 内部似乎有问题(可能是由于我使用的是功能性 API)
更新 2
我也尝试输出元组
X = (input1_X,input2_X,input3_X)
y = (output1_y,output2_y,output3_y)
并且还命名为输入/输出,但它不起作用
X = {"input_1": input1_X, "input_2": input2_X,"input_3": input3_X}
y = {"output_1": output1_y, "output_2": output2_y,"output_3": output3_y}
关于问题表述的注意事项:
将单个 X 特征更改为 (32,10) 而不是 (32,10,1) 可能有助于消除此错误,但这不是我想要的,它改变了我的问题(我不再有 10 个时间步每个功能一个)
解决方案
Keras 对动态维度使用“无”。
正如您在 model.summary() 图表上看到的 - 模型期望所有输入的 shape(None, 10) 是二维的。使用批量维度 - 您应该将三维数据提供给模型。
但是您正在提供四维数据。
我猜您的模型不会将您的输入列表分成三个输入。尝试将输入更改为元组:
X = (input_array_1,input_array_2,input_array_3)
推荐阅读
- node.js - 无法在 nodeJS 服务器上实现 HTTPS
- python - 如何去除python中base64编码字符串的噪声?
- java - 从 List 中特定键的所有值生成字符串
- react-native - 如何在 React Native 中使用单例模式
- python - 'chromedriver' 可执行文件需要在 PATH 中。将 chromedriver 添加到我的 PATH 后
- ruby-on-rails - 为什么我会收到此 Ruby on Rails 错误?:#index 缺少请求格式的模板:text/html
- r - 使用 Tidyverse 和 fitdistrplus 进行批量分布拟合
- composer-php - PHPUnit 找不到我的类,但 composer.json 中的自动加载看起来不错
- css - 容器部分之外的图像
- java - 如何使用apache POI在excel中基于多列值查找数据