TensorFlow Specialization Course 1学习笔记 Week 2
上一个练习我们使用深度学习解决了一个一元一次方程,让机器自己学习X与Y之间的关系。这一次我们来看如何解决计算机视觉的问题。识别10种不同类别的服饰。
首先导入TensorFlow
import tensorflow as tf
print(tf.__version__)
我们使用Fashion MNIST数据集,它已经在 tf.keras 数据集API里了。
mnist = tf.keras.datasets.fashion_mnist
调用这个对象的load_data方法可以得到2组列表。分别为训练集和测试集。
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
我们可以看一下这些数据都长什么样子
import matplotlib.pyplot as plt
plt.imshow(training_images[0])
print(training_labels[0])
print(training_images[0])
从结果可以看出,training_images[0]是一个28x28的数字矩阵。training_labels[0]为一个0到9的数字,分别代表10种类别。图像为28x28分辨率的灰度图像。
因为每个图像的数字都在0到255之间。我们需要正则化它们。
training_images = training_images / 255.0
test_images = test_images / 255.0
下面来设计网络:
model = tf.keras.models.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:我们的图像是由28x28的数字矩阵表示的,Flatten将这些矩阵转换为一维的。
-
Dense:添加一层神经元。
每一层神经元都需要一个激活函数。这里使用了两个激活函数:
- Relu:如果x>0 返回x,否则返回0。他的作用是将网络中大于等于0的值传到下一层。
- Softmax:取一组数据,高效地选出最大的一个。例如输出为[0.05, 0.1, 9.5, 0.3, 0.5],返回为[0, 0, 1, 0, 0]。
现在,模型已经定义好了。下一步需要使用optimizer和loss function编译它。
model.compile(optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
你可以看到每一次迭代后的输出,包括loss值和accuracy值。下面使用测试集评估我们训练好的模型的效果。
model.evaluate(test_images, test_labels)
最后,使用训练好的模型做预测。
classification = model.predict(test_images)
print(classification[0])
print(test_labels[0])
如果我们想在模型已经达到我们想要的效果时停止训练,例如我们想要模型在loss低于0.4的情况下自动停止训练。可以使用callback方法来实现。logs.get(‘loss’) < 0.4也可以写为 logs.get(‘acc’) > 0.6
import tensorflow as tf
print(tf.__version__)
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('loss')<0.4):
print("\nReached 60% accuracy so cancelling training!")
self.model.stop_training = True
callbacks = myCallback()
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])
实验:
如果将隐藏层的128个神经元增加到1024个会怎么样?
会导致更大的计算量,同时准确率会提高。但考虑到收益递减律并不是越多神经元就越好。
如果增加一层神经元会怎么样?
效果并没有太大的提高,因为我们的数据比较简单。对于更复杂的数据来说,多个层是很有必要的。
多训练几次迭代会怎么样?
loss将停止下降,有时还会升高。这是过拟合的副作用。如果模型已经收敛,就没有必要继续训练。
问题:为什么需要非线性激活函数?
如果你使用 线性激活函数或者没有使用一个激活函数,那么无论你的神经网络有多少层一直在做的只是 计算线性函数 。模型复杂度和标准的logistic回归是一样的。非线性激活函数是深层的神经网络变得有意义,可以使模型更复杂。
详细内容请看:https://github.com/lmoroney/dlaicourse/blob/master/Course 1 - Part 4 - Lesson 2 - Notebook.ipynb
课程地址:https://www.coursera.org/learn/introduction-tensorflow/