参考:Ubuntu 16 安装TensorFlow及Jupyter notebook 安装TensorFlow。
本篇博客翻译来自 Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning
仅供学习、交流等非盈利性质使用!!!
其他相关文章
Coursera TensorFlow 基础课程-week4
Coursera TensorFlow 基础课程-week3
Coursera TensorFlow 基础课程-week2
Coursera TensorFlow 基础课程-week1
本次实例就是使用类似这样的图片数据来进行识别。
数据使用:fashion-mnist
使用TensorFlow加载数据:
fashion_mnist - keras.datasets.fashion_mnist
(train_images, train_labels), (test_images,test_labels) = fashion_mnist.load_data()
原始数据如下:
训练集大概有60k条记录、测试集有10k条记录。
每条记录是一个28*28的一个图形,像素点从0~255.
而这个图片其类别是9, 这里为什么用数字9,而不是类似一个字符串:“鞋子”、“Ankle boot”是因为,使用这样的数字,计算机更好识别。
数据加载完成后,就可以构建模型了。
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28,28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax),
])
上面代码包含下面信息:
中间层,也称为隐藏层,如下;
中间层的神经元会负载参数W,通过W的调整就可以得到所有数据都满足给定的,比如给定的数据是一个鞋子,那么要通过调整所有W参数,直到得到其值是9.
代码下载 link1 或 link2
import tensorflow as tf
print(tf.__version__)
由于Fashion Mnist数据已经在tf.keras中,所以可以直接加载:
mnist = tf.keras.datasets.fashion_mnist
调用load_data函数可以得到2份数据集,分别包含训练、测试集以及其对应的类别:
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
数据加载后,可以通过下面的代码来看一下:
# %matplotlib
import matplotlib.pyplot as plt
plt.imshow(training_images[0])
print(training_labels[0])
print(training_images[0])
其输出结果为:
从输出结果可以看出,测试数据其中的一个样本是一个28*28的矩阵,其数据从0~255,当然你也可以换个index,查看其它数据。
一般情况下,在神经网络中使用01的数据,更易于进行训练,所以这里需要把0255的数据进行归一化,使用如下代码:
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)])
接下来,定义优化器和损失函数,然后就可以训练模型了。
model.compile(optimizer = tf.train.AdamOptimizer(),
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
模型训练结果:
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
Epoch 1/5
60000/60000 [==============================] - 15s 248us/sample - loss: 0.4982 - acc: 0.8243
Epoch 2/5
60000/60000 [==============================] - 14s 232us/sample - loss: 0.3716 - acc: 0.8655
Epoch 3/5
60000/60000 [==============================] - 13s 209us/sample - loss: 0.3370 - acc: 0.8772
Epoch 4/5
60000/60000 [==============================] - 12s 198us/sample - loss: 0.3112 - acc: 0.8857
Epoch 5/5
60000/60000 [==============================] - 13s 212us/sample - loss: 0.2944 - acc: 0.8913
模型训练完成后,可以看到这个模型正确率大概是89%左右,当然这个数据是针对训练集的。
如果要针对测试集进行测试,那么使用如下代码:
model.evaluate(test_images, test_labels)
10000/10000 [==============================] - 1s 114us/sample - loss: 0.3627 - acc: 0.8668
从上面的结果可以看出,正确率大概是87%左右,这个是还是比较低的。
执行如下代码:
classifications = model.predict(test_images)
print(classifications[0])
classification 是一串代码,这串代码代表啥?
什么样的结果显示当前图片是一个ankle boot?
如下代码:
import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.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)
model.evaluate(test_images, test_labels)
classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])
把 Dense的神经元个数从512设置到1024有啥影响?
如果移除Flatten 神经层,会发生什么?
model = tf.keras.models.Sequential([#tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
出现错误:logits and labels must have the same first dimension
如果最后一层的神经元个数设置为5会怎么样?
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation=tf.nn.relu),
tf.keras.layers.Dense(5, activation=tf.nn.softmax)])
出现错误: Received a label value of 9 which is outside the valid range of [0, 5)
如果添加多一层隐含层会怎样?
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
添加多一层,并不会增加正确率,因为数据比较简单,后续如果使用复杂的数据,那么增加层数可以提高准确率。
改变训练步数(epochs)会有什么影响?
参考:过拟合、欠拟合。
去掉归一化过程,结果会怎样?
在前面的练习中,如果过拟合,可能会出现正确率上下波动的情况,直到到达训练步数。是否可以编写代码,使得当正确率满足一定情况时,直接退出,而不用等待运行步数?
可以使用CallBack 策略
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])
在模型训练时,有时模型到一定epoch后,其正确率就不会再提升,但是由于设置了epochs,那么程序还是会继续运行直到设置的epochs,是否有种策略可以在适当的时候终止训练?
可以使用CallBack策略,通过两种方式来进行中断:
class myCallback1(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
import tensorflow as tf
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('acc')>0.6):
print("\nReached 60% accuracy so cancelling training!")
self.model.stop_training = True
mnist = tf.keras.datasets.fashion_mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
callbacks = myCallback()
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
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',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, callbacks=[callbacks])
my guess:
1. b
2. a
3. d
4. a
5. d
6. a
7. b
8. c
要求: 编写一个Mnist 数据分类器,需要得到99%+的正确率,同时需要当模型得到99%+的正确率后停止训练。
注意:
以下是提示代码:
# YOUR CODE SHOULD START HERE
# YOUR CODE SHOULD END HERE
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
# YOUR CODE SHOULD START HERE
# YOUR CODE SHOULD END HERE
model = tf.keras.models.Sequential([
# YOUR CODE SHOULD START HERE
# YOUR CODE SHOULD END HERE
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# YOUR CODE SHOULD START HERE
# YOUR CODE SHOULD END HERE
答案: link