Python 当批量大小不为';与数据量不匹配
我在Python2.7中使用Keras。我正在制作自己的数据生成器来计算火车的批次。我对基于此模型的数据发生器有一些疑问: 好的,下面是我的几个问题: 你能证实我对函数调用顺序的看法吗?这是:Python 当批量大小不为';与数据量不匹配,python,tensorflow,machine-learning,keras,data-generation,Python,Tensorflow,Machine Learning,Keras,Data Generation,我在Python2.7中使用Keras。我正在制作自己的数据生成器来计算火车的批次。我对基于此模型的数据发生器有一些疑问: 好的,下面是我的几个问题: 你能证实我对函数调用顺序的看法吗?这是: - __init__ - loop for each epoc : - loop for each batches : - __len_ - __get_item__ (+data generation) - on_epoch_end 如果您知道调试生成器
- __init__
- loop for each epoc :
- loop for each batches :
- __len_
- __get_item__ (+data generation)
- on_epoch_end
如果您知道调试生成器的方法,我想知道,断点和打印不适用于此
此外,我的处境很糟糕,但我认为每个人都有问题:
例如,我有200个数据(和200个标签ok),例如,我希望批大小为64。如果我想得好的话,len会给出200/64=3(而不是3125)。那么1个历元将分3批完成?其余的数据呢?我有一个错误,因为我的数据量不是批量大小的倍数
第二个例子,我有200个数据,我想要一批256个?在这种情况下,我需要做什么来调整我的发电机?我曾考虑检查批次大小是否优于我向CNN提供1个批次的数据量,但该批次将没有预期的大小,因此我认为它会出错
谢谢你的阅读。我更喜欢使用伪代码,因为我的问题更多的是关于理论而不是编码错误 Keras在python环境中使用了生成器,如果您无法调试它,原因就在别处 cf:
\uuuu len\uuuu
:提供小批量的数量
\uuuu getitem\uuuu
:给出第i个小批量
您不必知道何时何地调用它们,但更像是这样:
- __init__
- __len_
- loop for each epoc :
- loop for each batches :
- __get_item__
- on_epoch_end
至于小批量大小,您有两个(经典)选择,通过再次从集合中拾取条目来截断或填充。
如果您在每个历元随机排列列车组,随着时间的推移,某些项目不会过度曝光或曝光不足- __len_uu;:返回批次数
- __getitem\返回第i批
从keras.models导入
从keras.layers导入稠密、二维、平坦
从keras.utils导入到_category
进口干酪
#创建模型
模型=顺序()
#添加模型层
添加(Conv2D(64,内核大小=3,激活=relu,输入形状=(10,10,1)))
model.add(展平())
model.add(密集(2,activation='softmax'))
compile(优化器='adam',loss='classifical_crossentropy',metrics=['accurity'])
类数据生成器(keras.utils.Sequence):
定义初始大小(自、X、y、批次大小):
self.X=X
self.y=y
self.batch\u size=批次大小
定义(自我):
l=int(len(self.X)/self.batch\u大小)
如果l*self.batch\u尺寸
输出:
1/10纪元
16/16[===================================================-0秒/步-损耗:0.6774-acc:0.6097
正如您所见,它在一个时期内运行了16个批次,即
13*15+5=200
这个问题的调试方面听起来像是我最近试图发布的问题,但没有得到答案。我最终找到了答案,我认为这是一个简单的原则,初学者很容易错过。如果下面是tensorflow gpu,则不能在keras源代码级别中断/调试。keras代码被“翻译”到gpu上运行。我想如果在cpu上运行tensorflow,可能会中断,但不,这也不可能。有很多方法可以在tensorflow级别上调试/中断gpu,但这已经超出了高级keras的简单性。感谢您的回答,这很清楚。在您的示例中,如果“(index+1)*self.batch_size”是X数组中的索引,那么在X=self.X[…]行发生了什么?(如果在len函数期间添加l+=1,那么最后一批5必须是这种情况?@Alexy它将返回元素,直到数组结束。它不会给出任何错误。检查np.arange(10)[5:20]
将返回[5,6,7,8,9]
你让我开心!我将尝试将其适应我的情况,谢谢,因为它是一个多处理任务,无法调试ok。好的,我喜欢有两种不同的场景,谢谢!
- __init__
- __len_
- loop for each epoc :
- loop for each batches :
- __get_item__
- on_epoch_end
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten
from keras.utils import to_categorical
import keras
#create model
model = Sequential()
#add model layers
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(10,10,1)))
model.add(Flatten())
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
class DataGenerator(keras.utils.Sequence):
def __init__(self, X, y, batch_size):
self.X = X
self.y = y
self.batch_size = batch_size
def __len__(self):
l = int(len(self.X) / self.batch_size)
if l*self.batch_size < len(self.X):
l += 1
return l
def __getitem__(self, index):
X = self.X[index*self.batch_size:(index+1)*self.batch_size]
y = self.y[index*self.batch_size:(index+1)*self.batch_size]
return X, y
X = np.random.rand(200,10,10,1)
y = to_categorical(np.random.randint(0,2,200))
model.fit_generator(DataGenerator(X,y,13), epochs=10)