Deve ser suficiente embaralhar os elementos no início do treinamento e depois lê-los sequencialmente. Isso realmente atinge o mesmo objetivo de obter elementos aleatórios todas as vezes, o que é quebrar qualquer tipo de estrutura predefinida que possa existir no seu conjunto de dados original (por exemplo, todos os aspectos positivos no início, imagens seqüenciais etc.).
Embora funcionasse para buscar elementos aleatórios toda vez, essa operação normalmente não é ideal em termos de desempenho. Os conjuntos de dados geralmente são grandes e não são salvos na memória com acesso aleatório rápido, mas no disco rígido lento. Isso significa que as leituras sequenciais são praticamente a única opção que você tem para obter um bom desempenho.
A Caffe, por exemplo, usa o LevelDB, que não suporta busca aleatória eficiente. Consulte https://github.com/BVLC/caffe/issues/1087 , que confirma que o conjunto de dados é treinado com imagens sempre na mesma ordem.