Набор данных TFrecord не используется полностью, использует только все, когда batchsize = размер набора данных - PullRequest
0 голосов
/ 23 марта 2020

Мне интересно, как решить эту проблему у меня.

Итак, у меня есть файл TFrecord, который содержит значения типа A, typeB и типа C. Все значения упорядочены таким образом, чтобы показать их отношение к другим. Таким образом, первое значение typeA принадлежит первому значению typeB и типу C.

Я сейчас пытаюсь ввести свои значения typeA в модель keras, а затем потерю, которую keras сводит к минимуму, находясь между моей моделью вывод и и мои значения типа B

До сих пор я сделал следующее

featureDescription = {
        'typeA' : tf.io.FixedLenFeature([], tf.string),
        'typeB'   : tf.io.FixedLenFeature([], tf.string),
        'typeC': tf.io.FixedLenFeature([], tf.string),
}

def parseFunction(proto):
        feature = tf.io.parse_single_example(proto, featureDescription)
        typeA  = tf.io.decode_raw(feature['typeA' ], tf.uint16)
        typeB    = tf.io.decode_raw(feature['typeB'   ], tf.uint16)
        typeC = tf.io.decode_raw(feature['typeC'], tf.uint16)

        o  = tf.constant(32768, shape=(64,),dtype=tf.float32)
        a  = tf.dtypes.cast(typeA, tf.float32)
        b  = tf.dtypes.cast(typeB, tf.float32)
        c = tf.dtypes.cast(typeC, tf.float32)

        a  = tf.subtract(a ,o)
        b  = tf.subtract(b ,o)
        c = tf.subtract(c,o)

        return a,b,c

def create_dataset(filepath):
        dataset = tf.data.TFRecordDataset(filepath)
        dataset = dataset.map(parseFunction, num_parallel_calls=tf.data.experimental.AUTOTUNE)
        dataset.batch(40000)
        iterator = iter(dataset)
        typeA, typeB, typeC = iterator.get_next()

        return typeA, typeB, typeC


typeA, typeB, typeC = create_dataset('filename_here')

model_input = keras.Input(shape=(64,), name='typeA_input')
model_output = someLayerStuff(64)(model_input)

model = keras.Model(inputs=model_input, outputs=model_output, name='Model')
model.compile(optimizer=tf.keras.optimizers.Adam(
        learning_rate=2e-5,
        beta_1=0.9,
        beta_2=0.999,
        epsilon=1e-6,), loss='mse')

model.fit(typeA, typeB, epochs=10000)

Однако, когда я изменяю размер пакета в этом коде на что-то, что не является количеством записей, которые у меня есть в моем наборе данных моя модель больше не проходит через все мои записи набора данных? Почему это происходит и как я могу изменить его, чтобы он использовал весь мой набор данных?

...