TensorFlow Specialization Course 1学习笔记 Week 2

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/

猜你喜欢

转载自blog.csdn.net/JSerenity/article/details/89330545
今日推荐