Проблема с TF2.0 Custom Generator - PullRequest
       2

Проблема с TF2.0 Custom Generator

0 голосов
/ 09 января 2020

Я пытаюсь научиться использовать методы tf.data.Dataset и работать над собственным генератором из файла CSV. CSV содержит три точки данных. 1 путь к изображению, 2 метка, 3 название изображения (не используется). То, что я пытаюсь сделать, это прочитать в CSV в pandas, а затем перебирать каждый бросок, получая чтение в изображении (Keras load_image) и метку, которая была закодирована с использованием Pandas. Это дает мне эту ошибку, которая заставляет меня думать, что это проблема генератора, поскольку он не делает то, что должен.

ValueError: as_list () не определен для неизвестного TensorShape.

Это мой код, с которым я работаю.

    csv_path = '../Dataset/ShowData.csv'
    df = pd.read_csv(csv_path)
    base_path = "../Dataset/"
    # Make one hot encoding for lables
    le = LabelEncoder()
    df['Label'] = le.fit_transform(df['Label'])
    print(df.head(1)['Label'])
    print(df.tail(1)['Label'])
    '''
    # View the labels (if you want)
    list(encoder.classes_)
    # Convert some integers into their category names
    list(encoder.inverse_transform([2, 2, 1]))
    '''

    def process_dataframe(dataframe):
        for index, row in dataframe.iterrows():
            # print(row['Path'], row['Label'])
            # Load image and get lable
            img_path = os.path.join(base_path, row['Path'])
            img = load_img(img_path, target_size=(200, 200))
            img = img_to_array(img)
            img = img/255  # normalize the image
            label = row['Label']
            #label = to_categorical(label, num_classes, dtype=tf.float32)
            yield img, label


    def generate_dataset(dataframe):
        generator = lambda: process_dataframe(dataframe)
        return tf.data.Dataset.from_generator(generator=generator,
                                          output_types= (tf.float32, tf.int32))


    dataset = generate_dataset(df)
    data_batch = dataset.shuffle(10000).batch(32)
    print(data_batch)

    model = Sequential([
        Flatten(input_shape=(200, 200, 3)),
        Dense(128, activation='relu'),
        Dense(10, activation='softmax')
    ])

    model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=[tf.keras.metrics.Accuracy()])

    model.fit(data_batch, epochs=10, verbose=1)

О, это то, что распечатывает data_batch

<DatasetV1Adapter shapes: (<unknown>, <unknown>), types: (tf.float32, tf.int32)>

И это тип метки

Name: Label, dtype: int32

1 Ответ

1 голос
/ 09 января 2020

Вы должны определить output_shapes для вызова tf.data.Dataset.from_generator. Вы можете найти документацию на странице Tensorflow .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...