代码之家  ›  专栏  ›  技术社区  ›  ScottishTapWater

将XY坐标加载到基本Tensorflow线性回归中

  •  0
  • ScottishTapWater  · 技术社区  · 2 年前

    我正在学习Tensorflow的基础知识。所以我认为一个好的第一步是尝试做一个简单的线性回归,从有噪声的数据中确定一条线的方程。

    所以,我的第一步是生成数据:

    import random;
    import matplotlib.pyplot as pyplot
    
    RAND_RANGE = range(-100,100);
    X_RANGE = range(-10,10);
    
    NOISINESS = 0.5;
    NOISE_RANGE = range(int(RAND_RANGE.start * NOISINESS), int(RAND_RANGE.stop * NOISINESS));
    
    m = random.randrange(RAND_RANGE.start, RAND_RANGE.stop); # Python devs... Why doesn't a function that gets something IN A RANGE have an overload that takes a range... Huh?!
    c = random.randrange(RAND_RANGE.start, RAND_RANGE.stop);
    
    n = [random.randrange(NOISE_RANGE.start, NOISE_RANGE.stop) for _ in X_RANGE];
    
    real_x = [x for x in X_RANGE];
    real_y = [m * x + c for x in real_x];
    noisy_y = [m * x + c + n for x, n in zip(real_x, n)];
    

    这似乎工作得很好(为简洁起见,不包括绘图代码):

    Plot of results

    因此,我试图将其加载到一个基本的张量流模型中,如下所示:

    import tensorflow as tf;
    import numpy as np;
    from tensorflow import keras;
    from tensorflow.keras import layers;
    
    features = np.array(real_x);
    labels = np.array(real_y);
    
    line_model = tf.keras.Sequential(
        [
            layers.Dense(units=1)
        ]
    )
    
    line_model.build(input_shape=[len(real_y)]);
    
    line_model.summary();
    
    line_model.compile(
        optimizer = tf.keras.optimizers.Adam(learning_rate=0.1), loss='mean_absolute_error'
    )
    
    
    history = line_model.fit(
        features,
        labels,
        epochs=100,
        verbose=0
    )
    

    然而,正是在这里,我遇到了问题。 Every tutorial 我发现它似乎只是使用numpy从CSV文件中加载数据,然后盲目地将其扔给Tensorflow,而没有真正解释它期望数据的形式。

    我很可能误解了什么,但据我所知,我的 real_x 价值观是我的特征和 real_y 值就是标签。

    所以我尝试了以下方法:

    • 将XY值放入单独的numpy数组中
    • 将XY值放入单个二维numpy数组中
    • 各种值 input_shape (我认为它应该只是一个包含项目数量的单一值,但这给了我一个错误,即密集需要至少2个维度)

    在尝试这些不同的事情时,我犯了各种不同的错误。

    我觉得我在这里错过了一些基本的东西,这不应该太复杂,但我不愿意从我不理解的教程中批量复制代码(因此,我为什么要尝试做自己的练习,这与他们正在做的练习相邻,但不同)。

    我在这里做错了什么,我应该如何以一种让我预测的方式将这些数据加载到模型中 m c (或一系列去噪 y 然后我可以计算出的值 m c 作为额外步骤) realx noisy_y ?

    0 回复  |  直到 2 年前
        1
  •  1
  •   Frightera    2 年前

    在为模型指定输入形状时,您需要考虑每个目标的特征数量,因此这是 对的:

    line_model.build(input_shape=[len(real_y)]);
    
    1. 使用 input_shape 参数在 tf.keras.layers.Layer 例子

      line_model = tf.keras.Sequential(
       [layers.Dense(units=1, input_shape=(1, ))]
       )
      
    2. 使用 input_dim :

       line_model = tf.keras.Sequential(
       [layers.Dense(units=1, input_dim=1)]
       )
      

    input_shape = (1, ) 因为每个目标都有一个特征, input_dim 也遵循同样的逻辑。

    1. 使用 delayed-build 模式/方法略有不同:

      line_model.build(input_shape=[None, 1])
      

    使用时 .build() 方法,您需要在此处为模型提供批量大小 None 表示模型接受任何批量大小。这叫做 batch_input_shape .

    假设你有100个样本,并将40作为批量大小。最后一批将有20个元素(40-40-20),因此如果通过,模型可以接受最后20个元素 没有 ,否则会导致错误。

    如果你使用 input_shape input_dim 在第一层中,您不需要担心指定 batch_size .