tensorflow入門

In [1]:
from __future__ import absolute_import, division, print_function, unicode_literals

# 導入TensorFlow和tf.keras
import tensorflow as tf
from tensorflow import keras

# 導入輔助庫
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
 
1.14.0
In [2]:
fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
In [3]:
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
 

能夠看出一共有10種labeljavascript

In [4]:
train_images.shape#打印訓練集規模:6w張圖片,每張都規模是28*28
Out[4]:
(60000, 28, 28)
In [ ]:
len(train_labels)#每一個圖片一個label,一共有6w個label
 

能夠大概看看這些個label的具體內容css

In [5]:
train_labels
Out[5]:
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)
In [6]:
test_images.shape
Out[6]:
(10000, 28, 28)
In [18]:
import random
for i in range(10):
    plt.figure()
    n=random.randint(0,60000)
    plt.imshow(train_images[n])
    plt.colorbar()
    plt.grid(False)
    print("showing train_images:",i+1,";",n)
    plt.show()
 
showing train_images: 1 ; 2747
 
 
showing train_images: 2 ; 25125
 
 
showing train_images: 3 ; 16938
 
 
showing train_images: 4 ; 36159
 
 
showing train_images: 5 ; 36001
 
 
showing train_images: 6 ; 33341
 
 
showing train_images: 7 ; 28017
 
 
showing train_images: 8 ; 21344
 
 
showing train_images: 9 ; 45415
 
 
showing train_images: 10 ; 48276
 
In [19]:
train_images = train_images / 255.0

test_images = test_images / 255.0
In [36]:
plt.figure(figsize=(10,10))
for i in range(25):
    n=random.randint(0,60000)
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[n], cmap=plt.cm.binary)
    txt=str(i+1)+","+str(n)+","+str(class_names[train_labels[n]])
    plt.xlabel(txt)
    '''
    txt=str(i)+","+str(n)+","+str(class_names[train_labels[n]])
    plt.text(txt)
    '''
plt.show()
 
 

網絡中的第一層, tf.keras.layers.Flatten, 將圖像格式從一個二維數組(包含着28x28個像素)轉換成爲一個包含着28 * 28 = 784個像素的一維數組。能夠將這個網絡層視爲它將圖像中未堆疊的像素排列在一塊兒。這個網絡層沒有須要學習的參數;它僅僅對數據進行格式化。html

在像素被展平以後,網絡由一個包含有兩個tf.keras.layers.Dense網絡層的序列組成。他們被稱做稠密連接層或全鏈接層。 第一個Dense網絡層包含有128個節點(或被稱爲神經元)。第二個(也是最後一個)網絡層是一個包含10個節點的softmax層—它將返回包含10個機率分數的數組,總和爲1。每一個節點包含一個分數,表示當前圖像屬於10個類別之一的機率。html5

keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)java

In [55]:
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    
    #keras.layers.Conv2D(128, 4),
    
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

'''
model = keras.Sequential()

model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
                        border_mode='same',
                        input_shape=input_shape))

model.add(keras.layers.Conv2D(32, (kernel_size[0], kernel_size[1]),
                        padding='same',
                        input_shape=input_shape)) # 卷積層1
model.add(Activation('relu')) #激活層
model.add(keras.layers.Conv2D(32, (kernel_size[0], kernel_size[1]))) #卷積層2
model.add(Activation('relu')) #激活層
model.add(MaxPooling2D(pool_size=pool_size)) #池化層
model.add(Dropout(0.25)) #神經元隨機失活
model.add(Flatten()) #拉成一維數據
model.add(Dense(128)) #全鏈接層1
model.add(Activation('relu')) #激活層
model.add(Dropout(0.5)) #隨機失活
model.add(Dense(nb_classes)) #全鏈接層2
model.add(Activation('softmax')) #Softmax評分
'''
Out[55]:
"\nmodel = keras.Sequential()\n\nmodel.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],\n                        border_mode='same',\n                        input_shape=input_shape))\n\nmodel.add(keras.layers.Conv2D(32, (kernel_size[0], kernel_size[1]),\n                        padding='same',\n                        input_shape=input_shape)) # 卷積層1\nmodel.add(Activation('relu')) #激活層\nmodel.add(keras.layers.Conv2D(32, (kernel_size[0], kernel_size[1]))) #卷積層2\nmodel.add(Activation('relu')) #激活層\nmodel.add(MaxPooling2D(pool_size=pool_size)) #池化層\nmodel.add(Dropout(0.25)) #神經元隨機失活\nmodel.add(Flatten()) #拉成一維數據\nmodel.add(Dense(128)) #全鏈接層1\nmodel.add(Activation('relu')) #激活層\nmodel.add(Dropout(0.5)) #隨機失活\nmodel.add(Dense(nb_classes)) #全鏈接層2\nmodel.add(Activation('softmax')) #Softmax評分\n"
 

編譯模型 在模型準備好進行訓練以前,它還須要一些配置。這些是在模型的編譯(compile)步驟中添加的:node

損失函數 —這能夠衡量模型在培訓過程當中的準確程度。 咱們但願將此函數最小化以"驅使"模型朝正確的方向擬合。 優化器 —這就是模型根據它看到的數據及其損失函數進行更新的方式。 評價方式 —用於監控訓練和測試步驟。如下示例使用準確率(accuracy),即正確分類的圖像的百分數。python

In [38]:
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
 

訓練模型 訓練神經網絡模型須要如下步驟:jquery

將訓練數據提供給模型 - 在本案例中,他們是train_images和train_labels數組。 模型學習如何將圖像與其標籤關聯 咱們使用模型對測試集進行預測, 在本案例中爲test_images數組。咱們驗證預測結果是否匹配test_labels數組中保存的標籤。 經過調用model.fit方法來訓練模型 — 模型對訓練數據進行"擬合"。linux

In [39]:
model.fit(train_images, train_labels, epochs=5)
 
Epoch 1/5
60000/60000 [==============================] - 6s 98us/sample - loss: 0.4978 - acc: 0.8256
Epoch 2/5
60000/60000 [==============================] - 5s 85us/sample - loss: 0.3750 - acc: 0.8626
Epoch 3/5
60000/60000 [==============================] - 5s 86us/sample - loss: 0.3387 - acc: 0.8764
Epoch 4/5
60000/60000 [==============================] - 5s 91us/sample - loss: 0.3123 - acc: 0.8855
Epoch 5/5
60000/60000 [==============================] - 6s 94us/sample - loss: 0.2966 - acc: 0.8906
Out[39]:
<tensorflow.python.keras.callbacks.History at 0x7f2d51bf3f98>
In [ ]:
使用測試集進行模型評估
In [42]:
test_loss, test_acc = model.evaluate(test_images, test_labels)

print('Test accuracy:', test_acc)
 
10000/10000 [==============================] - 1s 69us/sample - loss: 0.3783 - acc: 0.8653
Test accuracy: 0.8653
In [64]:
predictions = model.predict(test_images)
In [65]:
predictions[0]
Out[65]:
array([0.13217203, 0.13783592, 0.13145836, 0.06069435, 0.06875829,
       0.21532884, 0.09096649, 0.03824735, 0.05894256, 0.06559582],
      dtype=float32)
In [66]:
np.argmax(predictions[0])
Out[66]:
9
In [67]:
test_labels[0]
Out[67]:
9
 

將結論可視化android

In [69]:
def plot_image(i, predictions_array, true_label, img):
  predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  
  plt.imshow(img, cmap=plt.cm.binary)
  
  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'
  
  plt.xlabel("{}{:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  predictions_array, true_label = predictions_array[i], true_label[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)
  
  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')
 

選取可視化測試樣例爲0號樣本

In [75]:
for i in range(100,120):
    plt.figure(figsize=(6,3))
    plt.subplot(1,2,1)
    plot_image(i, predictions, test_labels, test_images)
    plt.subplot(1,2,2)
    plot_value_array(i, predictions, test_labels)
    plt.show()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
In [76]:
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions, test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions, test_labels)
plt.show()
 

 

tz@croplab,hzau

2019/9/19

相關文章
相關標籤/搜索