为了账号安全,请及时绑定邮箱和手机立即绑定

Dataset.from_generator 无法复制 numpy 数组的功能作为 1D

Dataset.from_generator 无法复制 numpy 数组的功能作为 1D

泛舟湖上清波郎朗 2022-06-14 16:09:36
我将许多长度为 100 和 3 个特征的时间序列输入到 1D Convnet 中。我有太多这些无法使用 numpy 数组,因此我需要使用 Dataset.from_generator()。问题是当我在数据集上训练模型时,它给出了错误:expected conv1d_input to have 3 dimensions, but got array with shape (100, 3)下面的代码演示了这个问题。生成器将每个元素生成为预期的 (100,3) 数组。为什么模型无法将生成器输出识别为有效?非常感谢您的帮助。朱利安import numpy as npimport tensorflow as tfdef create_timeseries_element():    # returns a random time series of 100 intervals, each with 3 features,    # and a random one-hot array of 5 entries    data = np.random.rand(100,3)    label = np.eye(5, dtype='int')[np.random.choice(5)]    return data, labeldef data_generator():    d, l = create_timeseries_element()    yield (d, l)model = tf.keras.models.Sequential([    tf.keras.layers.Conv1D(128, 9, activation='relu', input_shape=(100, 3)),    tf.keras.layers.Conv1D(128, 9, activation='relu'),    tf.keras.layers.MaxPooling1D(2),    tf.keras.layers.Conv1D(256, 5, activation='relu'),    tf.keras.layers.Conv1D(256, 5, activation='relu'),    tf.keras.layers.GlobalAveragePooling1D(),    tf.keras.layers.Dropout(0.5),    tf.keras.layers.Dense(5, activation='softmax')])model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['accuracy'])x_train = []y_train = []for _ in range(1000):    d, l = create_timeseries_element()    x_train.append(d)    y_train.append(l)x_train = np.array(x_train)y_train = np.array(y_train)# train model with numpy arrays - this worksmodel.fit(x=x_train, y=y_train)ds = tf.data.Dataset.from_generator(data_generator, output_types=(tf.float32, tf.int32),                                      output_shapes=(tf.TensorShape([100, 3]), tf.TensorShape([5])))# train model with dataset - this failsmodel.fit(ds)
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

模型需要一批/样本列表。您可以通过在创建数据集时简单地设置批处理属性来做到这一点,如下所示:


ds = tf.data.Dataset.from_generator(data_generator, output_types=(tf.float32, tf.int32),

                                      output_shapes=(tf.TensorShape([100, 3]), tf.TensorShape([5])))

ds = ds.batch(16)

您也可以在准备样品时采用另一种方式。这样,您需要扩展样本维度,以便样本充当批次(您也可以传递样本列表)并且您必须在output_shapes数据集和create_timeseries_element函数中进行以下修改


def create_timeseries_element():

    # returns a random time series of 100 intervals, each with 3 features,

    # and a random one-hot array of 5 entries

    # Expand dimensions to create a batch of single sample

    data = np.expand_dims(np.random.rand(100, 3), axis=0)

    label = np.expand_dims(np.eye(5, dtype='int')[np.random.choice(5)], axis=0)

    return data, label


ds = tf.data.Dataset.from_generator(data_generator, output_types=(tf.float32, tf.int32), output_shapes=(tf.TensorShape([None, 100, 3]), tf.TensorShape([None, 5])))

上述更改将为数据集的每个时期仅提供一个批次(第一个解决方案的样本)。您可以通过在定义数据集时将参数传递给data_generator函数来生成所需的批次(第一个解决方案的样本)(例如 25 个),如下所示:


def data_generator(count=1):

    for _ in range(count):

        d, l = create_timeseries_element()

        yield (d, l)


ds = tf.data.Dataset.from_generator(data_generator, args=[25], output_types=(tf.float32, tf.int32), output_shapes=(tf.TensorShape([None, 100, 3]), tf.TensorShape([None, 5])))



查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号