tensorflow 2系列02 圖像分類(Image classification using TensorFlow 2.x)
本期文章是一個系列課程具练,本文是這個系列的第2篇復習筆記
(1)Build and train neural network models using TensorFlow 2.x
(2)Image classification
(3)Natural language processing(NLP)
(4)Time series, sequences and predictions
圖像分類
圖像分類在現有階段趁猴,幾乎全部是用神經網絡來弄了银室,傳統(tǒng)的線性分類模型已經沒有了市場酱鸭,特別是cnn的出現,真是大殺器一樣的存在瞧筛,使得圖像分類準確率提高了一個特別高的水平.
關于CNN(卷積神經)
cnn不是本文的重點侠碧,但稍微還是說一點硝枉,卷積主要是用來提提取特征的,池化主要降維和特征強化.具體可以參考文章 https://www.zhihu.com/question/49376084
tensorflow2中使用cnn
在tf2中使用cnn非常簡單倦微,主要是在神經網絡的輸入層構建時妻味,使用cnn和池化做幾層的網絡搭建,后面再使用傳統(tǒng)的Flatten層欣福,Dense層责球,配合激活函數,達到輸入一個概率值的目的.
代碼實戰(zhàn)
# 卷積神經網絡importmatplotlib.pyplotaspltimportnumpyasnpimporttensorflowastffromtensorflow.python.keras.backend_configimportepsilonif__name__ =="__main__": ?? (train_x,train_y),(test_x,test_y)=tf.keras.datasets.fashion_mnist.load_data() ? ? ? ?model=tf.keras.models.Sequential([ ? ? ? ?tf.keras.layers.Conv2D(64,(3,3),activation=tf.nn.relu,input_shape=(28,28,1)), ? ? ? ?tf.keras.layers.MaxPool2D(2,2), ? ? ? ?tf.keras.layers.Conv2D(64,(3,3),activation=tf.nn.relu), ? ? ? ?tf.keras.layers.MaxPool2D(2,2), ? ? ? ?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="adam",loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=["accuracy"]) ? ?model.fit((train_x/255).reshape(-1,28,28,1),train_y,epochs=2,) ? ?model.evaluate((test_x/255).reshape(-1,28,28,1),test_y)print(test_y[0])print(np.argmax(model.predict((test_x[0]/255).reshape(-1,28,28,1)))) ? ?plt.imshow(test_x[0])
輸出效果
總結
進行特征歸一化到0, 1之間拓劝,有利于加快訓練收斂速度和提高精度.上面的train_x/255就是為了歸一化
模型的第一層一定要指定input_shape雏逾,如果是用tensorflow原生api,還得指定參數的shape郑临,這里是用了keras栖博,幫我們自動推導了參數的shape
損失函數的選擇,如果train_label是具體的值厢洞,預測的是概率仇让,就選擇sparse這個開頭的損失函數.如果train label是one_hot值,就選擇不帶sparse的這個(categorical_crossentropy).這個keras的api中有詳細說明躺翻,具體后面會有再次關于損失函數的筆記丧叽,
還是關于shape,輸入的數據是什么shape公你,在預測階段也要保證相同的輸入shape踊淳,否則會報錯.具體的可以通過reshape來調整.
神經網絡主要數據和模型結構是關鍵.在數據(包含數據處理)相同的情況下,模型的結構決定了模型的精度.比如陕靠,一個簡單的二層(dense層嚣崭,一個輸出層)就比cnn效果差