Đào tạo theo đợt trong Tensorflow


11

Tôi hiện đang cố gắng đào tạo một mô hình trên tệp csv lớn (> 70GB với hơn 60 triệu hàng). Để làm như vậy tôi đang sử dụng tf.contrib.learn.read_batch_examples. Tôi đang vật lộn để hiểu làm thế nào chức năng này thực sự đọc dữ liệu. Nếu tôi đang sử dụng kích thước lô ví dụ 50.000, thì nó có đọc 50.000 dòng đầu tiên của tệp không? Nếu tôi muốn lặp lại toàn bộ tập tin (1 epoch), tôi có phải sử dụng num_rows / batch_size = 1.200 số bước cho phương thức ước tính.fit không?

Đây là chức năng đầu vào tôi đang sử dụng:

def input_fn(file_names, batch_size):
    # Read csv files and create examples dict
    examples_dict = read_csv_examples(file_names, batch_size)

    # Continuous features
    feature_cols = {k: tf.string_to_number(examples_dict[k],
                                           out_type=tf.float32) for k in CONTINUOUS_COLUMNS}

    # Categorical features
    feature_cols.update({
                            k: tf.SparseTensor(
                                indices=[[i, 0] for i in range(examples_dict[k].get_shape()[0])],
                                values=examples_dict[k],
                                shape=[int(examples_dict[k].get_shape()[0]), 1])
                            for k in CATEGORICAL_COLUMNS})

    label = tf.string_to_number(examples_dict[LABEL_COLUMN], out_type=tf.int32)

    return feature_cols, label


def read_csv_examples(file_names, batch_size):
    def parse_fn(record):
        record_defaults = [tf.constant([''], dtype=tf.string)] * len(COLUMNS)

        return tf.decode_csv(record, record_defaults)

    examples_op = tf.contrib.learn.read_batch_examples(
        file_names,
        batch_size=batch_size,
        queue_capacity=batch_size*2.5,
        reader=tf.TextLineReader,
        parse_fn=parse_fn,
        #read_batch_size= batch_size,
        #randomize_input=True,
        num_threads=8
    )

    # Important: convert examples to dict for ease of use in `input_fn`
    # Map each header to its respective column (COLUMNS order
    # matters!
    examples_dict_op = {}
    for i, header in enumerate(COLUMNS):
        examples_dict_op[header] = examples_op[:, i]

    return examples_dict_op

Đây là mã tôi đang sử dụng để đào tạo mô hình:

def train_and_eval():
"""Train and evaluate the model."""

m = build_estimator(model_dir)
m.fit(input_fn=lambda: input_fn(train_file_name, batch_size), steps=steps)

Điều gì sẽ xảy ra nếu tôi gọi lại hàm fit với cùng input_fn. Nó có bắt đầu ở đầu tập tin một lần nữa không, hay nó sẽ nhớ dòng nơi nó đã dừng lần trước?


Tôi thấy medium.com/@ilblackdragon/... hữu ích về Trạm trộn trong tensorflow input_fn
fistynuts

Bạn đã kiểm tra cái đó chưa? stackoverflow.com/questions/37091899/ móc
Frankstr 17/03/18

Câu trả lời:


1

Vì chưa có câu trả lời nào, tôi muốn cố gắng đưa ra một câu trả lời ít nhất là hữu ích. Bao gồm các định nghĩa hằng sẽ giúp một chút để hiểu mã được cung cấp.

Nói chung, một lô sử dụng n lần một bản ghi hoặc mục. Làm thế nào bạn xác định một mục phụ thuộc vào vấn đề của bạn. Trong tenorflow, lô được mã hóa theo chiều thứ nhất của một tenxơ. Trong trường hợp của bạn với tệp csv, nó có thể là từng dòng ( reader=tf.TextLineReader). Nó có thể học theo cột nhưng tôi không nghĩ rằng điều này xảy ra trong mã của bạn. Nếu bạn muốn đào tạo với toàn bộ dữ liệu của mình (= một epoch ), bạn có thể làm như vậy bằng cách sử dụng numBatches=numItems/batchSize.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.