【发布时间】:2020-02-29 16:51:17
【问题描述】:
我使用 Keras 使用以下指南制作了一个数据生成器方案:
https://stanford.edu/~shervine/blog/keras-how-to-generate-data-on-the-fly
我的数据生成器脚本似乎可以正确生成 numpy 数组。但是,当我使用功能 API 制作模型时,出现以下错误:
ValueError:检查模型输入时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预计会看到 2 个数组,但得到了以下 1 个数组的列表:
而且我似乎不明白这个错误。我的模型需要两个不同的输入。它将一个矩阵(大小为 7000 x 208)作为卷积层的输入,并将一个向量(7000,)作为神经网络的输入。并将这两个分支合并并提供给全连接层,然后是输出层。这就是我设置网络的方式:
ksize = 2
l2_lambda = 0.0001
i1 = Input(shape=(7000, 208))
c1 = Conv1D(128*2, kernel_size=ksize,activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(i1)
c1 = Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c1)
c1 = AveragePooling1D(pool_size=ksize)(c1)
c1 = Dropout(0.2)(c1)
c1 = Flatten()(c1)
i2 = Input(shape=(7000, ))
c2 = Dense(64, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(i2)
c2 = Dropout(0.1)(c2)
c = concatenate([c1, c2])
x = Dense(256, activation='relu', kernel_initializer='normal',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c)
x = Dropout(0.25)(x)
output = Dense(5, activation='softmax')(x)
model = Model([i1, i2], [output])
model.summary()
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adam(),
metrics=['accuracy'])
model.fit_generator(generator=training_generator,validation_data=validation_generator)
而且我的生成器脚本基本上是生成一批特定大小的,这样我就不必一次将所有内容都加载到内存中。数据生成脚本
class DataGenerator(keras.utils.Sequence):
def __init__(self,list_IDs_snp,list_IDs_pos,labels,batch_size=32,n_channels=1,
n_classes=5,shuffle=True):
self.batch_size = batch_size
self.list_IDs_snp = list_IDs_snp
self.list_IDs_pos = list_IDs_pos
self.n_channels = n_channels
self.n_classes = n_classes
self.shuffle = shuffle
self.labels = labels
self.on_epoch_end()
def __len__(self):
'Denotes the number of batches per epoch'
return int(np.floor(len(self.list_IDs_snp) / self.batch_size))
def __getitem__(self, index):
'Generate one batch of data'
# Generate indexes of the batch
indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]
# Find list of IDs
list_IDs_temp_snp = [self.list_IDs_snp[k] for k in indexes]
list_IDs_temp_pos = [self.list_IDs_pos[k] for k in indexes]
# Generate data
snp,pos,y = self.__data_generation(list_IDs_temp_snp,list_IDs_temp_pos)
return snp,pos,y
def on_epoch_end(self):
self.indexes = np.arange(len(self.list_IDs_snp))
if self.shuffle==True:
np.random.shuffle(self.indexes)
def __data_generation(self,list_IDs_temp_snp,list_IDs_temp_pos):
snp = np.empty((self.batch_size,7000,208))
pos = np.empty((self.batch_size,7000))
y = np.empty((self.batch_size),dtype=int)
for ID in range(len(list_IDs_temp_snp)):
snp[ID] = np.load(list_IDs_temp_snp[ID])
pos[ID] = np.load(list_IDs_temp_pos[ID])
y[ID] = self.labels[list_IDs_temp_snp[ID]]
return snp,pos,y
这个数据生成方案和我一开始分享的链接一样。
为了生成数据,我如下调用我的脚本:
params = {'batch_size': 3,
'n_classes': 5,
'n_channels': 1,
'shuffle': True}
training_generator = DataGenerator(partition_snp['train'], partition_pos['train'],labels, **params)
validation_generator = DataGenerator(partition_snp['valid'],partition_pos['valid'], labels, **params)
您认为问题可能是我分别发送 partition_snp 和 partition_pos 吗? Partition_snp 和 partition_pos 只是带有每个示例路径的字典。每个字典都有两个键:'train' 和 'valid'。
如果有人能解释我收到上述错误的原因,我将不胜感激。在执行代码时,我打印了矩阵和向量的类型,并显示为 numpy array 因此,我不知道为什么会出现此错误。我们将不胜感激。
【问题讨论】:
-
尝试在 getitem 中返回 (snp,pos), y
-
我在发布问题之前也尝试过,但后来出现以下错误:AttributeError: 'tuple' object has no attribute 'shape'。我编辑了我的问题,向您展示我如何调用我的数据生成脚本。你认为我在那里做错了吗?
-
对不起,它需要是一个列表,应该是 [snp, pos], y ,而不是元组
标签: python-3.x keras neural-network conv-neural-network