- Python版本: Python3.x
- 运行平台: Windows
- 参考资料:吴恩达
- IDE: jupyter
- 转载请标明出处:https://blog.csdn.net/tian121381/category_9748511.html
- 资料下载,提取码:nw0v
一、前言
机器学习中的SVM其实是鸽了,(●’◡’●)。因为公式太难打了,有时间再补上吧(如需要SVM的相关代码,可以评论发邮箱)。现在开新坑,tensorflow2.0的使用。主要是以实例来讲解。这部分需要深度学习/机器学习的基础。
主要的讲解方法是写一个例子,详细讲解。然后给出一个练习,你们自写后再看我给的参考代码。(ง •_•)ง
二、相当于Hello World的神经网络
我们开始先来一个简单的网络,自己写一个线性的数据,看看我们在输入数据时,能不能给出我们正确的结果呢?
首先导入相关包。
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])])
优化器和代价函数定义
现在,我们编译神经网络。这样做时,我们必须指定两个函数,一个损失和一个优化器。 如果已经看过很多用于机器学习的数学,这就是通常使用的地方,但是在这种情况下,它可以很好地封装在您的函数中。但是这里发生了什么?让我们解释一下… 我们知道在函数中,数字之间的关系为y = 2x-1。 当计算机尝试“学习”时,会做出猜测…也许y = 10x + 10。损失功能根据已知的正确答案来衡量猜测的答案,并衡量其执行的好坏程度。 然后,它使用OPTIMIZER函数进行另一个猜测。基于损失函数的运行方式,它将尝试使损失最小化。到那时,也许会得出类似y = 5x + 5的结果,虽然仍然很糟糕,但更接近正确的结果(即损失更低) 它将重复此操作,您将很快看到epochs的数量。但首先,这是我们告诉它的方法,即对损失使用“均方误差”,对优化器使用“随机梯度下降”。不需要了解它们的数学原理,但是可以看到它们起作用了! 如果有时间,多了解以下针对不同情况的不同且适当的损失和优化器功能。 下面为随机梯度下降,均值方差。
model.compile(optimizer="sgd",loss="mean_squared_error")
提供数据
接下来,输入一些数据。在这种情况下,我们取6个xs和6个ys。 您会看到它们之间的关系是y = 2x-1,因此x = -1,y = -3等。 一个名为“ Numpy”的python库提供了许多数组类型的数据结构,这是事实上的标准方法。 我们通过将值指定为np.array[]来声明要使用它们。
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)
它们的关系是y = 2x-1
训练神经网络
训练神经网络的过程是在model.fit调用中“学习” xs和ys之间的关系。这就是我们上面讨论过的循环的地方,进行猜测,测量其好坏(也称为损失),使用优化器进行另一次猜测等。它将针对您所经历的时期数进行处理,指定。运行此代码时,您会在看到损失。
model.fit(xs,ys, epochs = 500) #拟合
结果:
可以看到损失值很低了。
然后我们自己输入一个值,看看效果如何呀?
print(model.predict([10.0]))
结果:
[[18.999987]]
结果正确,约19。
课后小练习
问题描述:
尝试建立一个神经网络,根据一个简单的公式预测房屋价格。 因此,想象一下,如果房屋价格像房屋每间卧室50k + 50k一样容易,那么一间卧室的房子要100k,两间卧室的房子要150k,依此类推。 将如何创建一个学习此关系的神经网络,以便预测7卧室房屋的成本接近40万,等等。 提示:如果降低房价,网络可能会工作得更好。 您不必给出答案400 …最好创建可以预测数字4的内容,然后答案是“数十万”等。这里需要你们结合上面自写,写完后看看我的参考代码(。^▽^)。
import numpy as np
import tensorflow as tf
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,2,3,4,5,6,7],dtype=float)
ys = np.array([100,150,200,250,300,350,400],dtype=float)
model.fit(xs,ys,epochs=500)
print(model.predict([8.0]))
结果:
三、 较复杂的神经网络
在上一个例子中,看到了如何创建一个神经网络,以解决要解决的问题。这给出了学习行为的明确示例。当然,在那种情况下,有点过分了,因为直接编写函数Y = 2x-1会更容易,而不是麻烦使用机器学习来学习一组固定的X和Y之间的关系。并将其扩展为所有值。 但是,编写这样的规则要困难得多的情况(例如计算机视觉问题)怎么办? 让我们看一个场景,在该场景中,我们可以识别出不同的衣服,这些衣服是从包含10种不同类型的数据集中训练出来的。
首先导入相关包
import tensorflow as tf
数据处理
Fashion MNIST数据可直接从tf.keras数据集API中获得。keras自带的数据集,如果网络问题下载不下来,可以下载我的数据(置顶资料下载),放入C:\用户\你的电脑名\.keras\datasets\
mnist = tf.keras.datasets.fashion_mnist #下载并加载数据,如有数据将只加载
在此对象上调用load_data将为您提供两组两个列表,这两个列表将是包含服装项目及其标签的图形的训练和测试值。
(training_images,training_labels),(test_images,test_labels) = mnist.load_data()
这些值是什么样的? 让我们打印一个训练图像和一个训练标签以查看…具有数组中不同索引的实验。 例如,还要看一下索引42 …那是与索引0的引导不同的引导。
import matplotlib.pyplot as plt
plt.imshow(training_images[0])
plt.show()
print(training_labels[0])
print(training_images[0])
结果:
可以注意到,数字中的所有值都在0到255之间。如果我们在训练神经网络,出于各种原因,将所有值都视为0到1之间的过程会更容易,这一过程称为“规范化”。 幸运的是,在Python中,无需循环就可以很容易地标准化这样的列表。 可以这样操作:
training_images = training_images/255
test_images = test_images/255
模型构建
开始构建模型·
model = tf.keras.Sequential([tf.keras.layers.Flatten(), #扁平化,
tf.keras.layers.Dense(128,activation=tf.nn.relu),
tf.keras.layers.Dense(10,activation = tf.nn.softmax)
])
Sequential:定义了神经网络中各层的顺序 Flatten:还记得以前打印出的图像是正方形的地方吗?展平只是获取该正方形并将其变成一维集。 Dense:增加一层神经元,每层神经元都需要激活功能来告诉他们该做什么。有很多选择,但是现在就使用。 Relu实际上表示“如果X>0返回X,否则返回0”-------因此它所做的只是将值0或更大的值传递给网络的下一层。 Softmax采用一组值,并有效地选择最大的值,因此,例如,如果最后一层的输出看起来像[0.1、0.1、0.05、0.1、9.5、0.1、0.05、0.05、0.05],则可以节省您从钓鱼中寻找最大的价值,然后将其变成[0,0,0,0,1,0,0,0,0,0]目标是节省大量编码!
现在定义模型的下一步是实际构建模型。您可以像以前一样使用优化器和损失函数对其进行编译—然后通过调用model.fit对其进行训练,要求它将训练数据与训练标签相匹配-即让其确定训练数据之间的关系及其实际标签,因此在将来,如果您拥有看起来像训练数据的数据,那么它可以对这些数据的外观做出预测。
model.compile(optimizer="adam", #optimizer = tf.train.AdamOptimizer(),2.0以下
loss = "sparse_categorical_crossentropy",
metrics=['accuracy'])
#开始拟合
model.fit(training_images,training_labels,epochs=10)
结果:
可以看到在训练集,它的准确率到达了91.12%,那么模型具体怎么样的,有没有过拟合呢?用测试集来看一下。
预测
model.evaluate(test_images,test_labels)
结果:
看似精度并不是很高,但想想,就10个周