【问题标题】:Issue with TF2.0 Custom GeneratorTF2.0 自定义生成器的问题
【发布时间】:2020-01-09 02:12:00
【问题描述】:

我正在尝试学习如何使用 tf.data.Dataset 方法并使用 CSV 文件的自定义生成器。 CSV 包含三个数据点。 1 图像的路径,2 标签,3 图像名称(未使用)。我想要做的是在熊猫中读取 CSV,然后遍历每个卷,从而在图像(Keras load_image)和使用熊猫编码的标签中产生读取。它给了我这个错误,这让我认为这是生成器问题,因为它没有做它应该做的事情。

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

【问题讨论】:

    标签: python pandas tensorflow keras deep-learning


    【解决方案1】:

    您应该为tf.data.Dataset.from_generator 调用定义output_shapes。您可以在Tensorflow page 找到文档。

    【讨论】:

    • 我在这里做了 return tf.data.Dataset.from_generator(generator=generator, output_types= (tf.float32, tf.int32))
    • def generate_dataset(dataframe):在这个方法中。如果生成器不是在 main 方法中而是在函数中定义的,这有关系吗?
    • @MNM 你定义了output types 而不是output shapes
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多