美文网首页
神经元网络深度学习的起步程序 Hello World

神经元网络深度学习的起步程序 Hello World

作者: fdsun | 来源:发表于2020-11-21 00:38 被阅读0次

    (学习记录)
    学习路径: https://www.icourse163.org/course/youdao-1460578162


    第一个应用程序总是应该从超级简单的东西开始,这样可以看到代码如何产生和运作的整体框架。
    就创建神经网络而言,我喜欢使用的例子是一个能够学习两组数字之间函数关系的神经元。具体来说,如果你在写下面函数的代码,表明你已经知道了这个函数的"规则",即x和y的映射关系。

    float hw_function(float x){
        float y = (2 * x) - 1;
        return y;
    }
    

    那么,如何训练一个神经网络来完成同等的任务呢? 用数据!用数据来训练神经网络。通过给它输入一组X,和一组Y,它应该能够找出它们之间的关系。
    这显然和你习惯的范式很不一样,所以让我们一步步来了解它。

    导入tensorflow

    让我们从导入TensorFlow开始。为了方便后续使用,我们把它叫做tf。
    然后我们导入一个名为numpy的库,它可以帮助我们方便快捷地将数据表示为列表。
    定义神经网络的框架叫做keras,它将神经元网络模型定义为一组Sequential层。Keras库也需要导入。

    import tensorflow as tf
    import numpy as np
    from tensorflow import keras
    

    定义并编译神经元网络

    接下来我们将创建一个最简单的神经网络。它只有1层,且这层只有1个神经元,它的输入只是1个数值。

    model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
    

    在编译神经网络时,我们必须指定2个函数:一个损失函数和一个优化器。
    如果你读过很多有关机器学习的数学理论,这里通常是用到它们的地方。但Tensorflow将这些数学很好地封装在函数中供你使用。那么这个程序里到底发生了什么?我们来看一下:
    我们知道,在上面的函数中,两组数字之间的关系其实是y=2x-1。当计算机试图 "学习 "这个映射关系时,它猜测......也许y=10x+10。LOSS(损失)函数将猜测的答案与已知的正确答案进行比较,并衡量偏差程度。然后,计算机使用OPTIMIZER函数再做一次猜测,努力使损失最小化。这时,也许计算机会得出一些像y=5x+5这样的结果,虽然还是很糟糕,但更接近正确的结果(即损失更低)。训练的时候,将依据指定的EPOCHS次数,重复这样的猜测与优化过程。

    下面的程序中可以看到如何设置用 "平均平方误差 "来计算损失,并使用 "同步梯度下降 "来优化神经元网络。你并不需要理解背后的这些数学,但你可以看到它们的成效!
    随着经验的积累,你将了解如何选择相应的损失和优化函数,以适应不同的情况。

    model.compile(optimizer='sgd', loss='mean_squared_error')
    

    Providing the Data 提供训练数据

    接下来我们将提供一些数据。对于本案例,我们提供6个X和6个Y。可以看到它们之间的关系是y=2x-1,所以当X=-1,y=-3,以此类推。

    xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
    ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
    

    Training the Neural Network 训练神经元网络

    在调用model.fit函数时,神经网络“学习”X和Y之间的关系。在这个过程中,它将一次又一次地完成上面所说的循环,即做一个猜测,衡量它有多好或多坏(又名损失),使用Opimizer进行再一次猜测,如此往复。训练将根据指定的遍数(epochs)执行此操作。当运行此代码时,将在输出结果中看到损失(loss)。

    model.fit(xs, ys, epochs=500)
    

    到这里为止模型已经训练好了,它学习了X和Y之间的关系。现在,你可以使用model.predict方法来让它计算未知X对应的Y。例如,如果X=10,你认为Y会是什么?在运行下面代码之前,请猜一猜:

    print(model.predict([10.0]))
    

    你可能会想到19,对吧?但最后输出比19低了一丁点儿。这是为什么呢?因为神经网络处理的是概率,所以根据我们向神经元网络提供的数据,它计算出x和y之间的关系是y=2x-1的概率非常高。但由于只有6个数据点,无法完全确定x和y的函数关系。因此,10对应的y值非常接近19,但不一定正好是19。当使用神经网络时,会看到这种模式反复出现。你几乎总是在处理概率,而非确定的数值。并经常需要通过进一步编写程序,来找出概率所对应的结果,特别当处理分类问题时。

    练习

    在本练习中,您将尝试构建一个神经网络,让它根据一个简单的公式来预测房屋的价格。
    想象一下,如果房子的定价很简单,带一间卧室的房子价格是5万+5万,那么一间卧室的房子要花10万元;两间卧室的房子就要花15万元,如此类推。

    如何创建一个神经网络,来学习这种关系,让它会预测一个7间卧室的房子,价格接近40万。

    提示:如果将房价单位用10万表示(称为scale),网络判断准确性会更好。例如对于x=1,输出1,表示10万;x=2,输出1.5表示15万。神经元网络对大数值处理不是太好,一般训练数据都要经过scalling变小才行。

    import tensorflow as tf
    import numpy as np
    from tensorflow import keras
    model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
    model.compile(optimizer='sgd', loss='mean_squared_error')
    xs = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], dtype=float)
    ys = np.array([1.0, 1.5, 2.0, 2.5, 3.0, 3.5], dtype=float)
    model.fit(xs, ys, epochs=1000)
    print(model.predict([7.0]))
    

    相关文章

      网友评论

          本文标题:神经元网络深度学习的起步程序 Hello World

          本文链接:https://www.haomeiwen.com/subject/yzxsiktx.html