Tensorflow keras fit_生成器的结果与fit不同

Tensorflow keras fit_生成器的结果与fit不同,tensorflow,keras,neural-network,Tensorflow,Keras,Neural Network,这是我的代码,我的训练集的形状是(5000000,30223),我的测试集的形状是(2500000,30223) 当我使用拟合时,这两种计算均方误差的方法的结果是相同的,拟合的实际效果更好。这里提到的实际效果是sklearn的均方误差,尽管拟合的有效损失为4.96。实际mse也为4.96,拟合生成器显示为1.53,但实际为17.76。对于列车组,配合转换为2.5。对于有效集,拟合仅转换为4.96。那么问题出在哪里呢?我把结果留给需要的人。我的问题可能会发生,因为我的生成器没有洗牌。下面是我举的一

这是我的代码,我的训练集的形状是(5000000,30223),我的测试集的形状是(2500000,30223)


当我使用拟合时,这两种计算均方误差的方法的结果是相同的,拟合的实际效果更好。这里提到的实际效果是sklearn的均方误差,尽管拟合的有效损失为4.96。实际mse也为4.96,拟合生成器显示为1.53,但实际为17.76。对于列车组,配合转换为2.5。对于有效集,拟合仅转换为4.96。那么问题出在哪里呢?

我把结果留给需要的人。我的问题可能会发生,因为我的生成器没有洗牌。下面是我举的一个例子:

def minibatches(inputs=None, targets=None, batch_size=None):
   np.random.seed(5)  
   while 1: 
      assert len(inputs) == len(targets)
      indices = np.arange(len(inputs))
      np.random.shuffle(indices)

      for start_idx in range( 0,len(inputs) - batch_size, batch_size ):
         excerpt = indices[start_idx:start_idx + batch_size]
         yield inputs[excerpt], targets[excerpt]

请注意,我的代码可能会忽略最后一个批次,因为如果最后一个批次没有达到特定的批次长度,如果有人可以帮助我修改它,我将非常感谢。

拟合生成器是否也转换为2.5?如果执行预测,则对小批次执行该操作,将所有批次相加,除以批次数以获得最终结果。你能在预测测试中使用随机批次循环预测吗?因此,很明显,fit_生成器上的模型序列尚未达到最低损失。这种差异可能是由权重的随机初始引起的。您可以尝试进行更长时间的训练,并调整一点以适应发电机对于训练集,fit转换为2.5,与fit发电机类似。对于有效集,fit仅转换为4.96您的测试不是完全收敛的,那么当您在predict中仅计算一个批次时,误差可能非常高,甚至超过4.96(因为4.96是平均数)。此外,划分小批次的方式不是随机的,而当您使用fit时,批处理将是随机抽样。首先,您必须先通过
shuffle\u order=np.radndom.permutation(len(inputs))inputs\u shuffle=inputs[shuffle\u order]target\u shuffle=targets[shuffle\u order]
对数据进行洗牌,然后您可以像以前那样获取索引,但如果索引应该是
index=np.arange((len(inputs)+批大小)//bath\u size)
然后,对于您没有有效数据量的最后一批,您只需获取该批大小的所有末尾以及剩余部分的一点随机数据。
the result is `17.763950379588405` not same as `1.5335`
def minibatches(inputs=None, targets=None, batch_size=None):
   np.random.seed(5)  
   while 1: 
      assert len(inputs) == len(targets)
      indices = np.arange(len(inputs))
      np.random.shuffle(indices)

      for start_idx in range( 0,len(inputs) - batch_size, batch_size ):
         excerpt = indices[start_idx:start_idx + batch_size]
         yield inputs[excerpt], targets[excerpt]