文章目錄
- 1、環境安裝搭建
- 2、神經網絡
- 2.1、解決線性問題
- 2.2、FAshion MNIST數據集使用
- 3、卷積神經網絡
- 3.1、卷積神經網絡使用
- 3.2、ImageDataGenerator使用
- 3.3、貓狗識別案例
- 3.4、參數優化
1、環境安裝搭建
鏈接: Windows 安裝Tensorflow2.1、Pycharm開發環境
2、神經網絡
1、傳統方式解決問題
2、機器學習解決方式
2.1、解決線性問題
下面通過兩組數據推導出公式:
-1.0, 0.0, 1.0, 2.0, 3.0, 4.0
-3.0, -1.0, 1.0, 3.0, 5.0, 7.0
很明顯是一個線性問題,y=2x-1,下面我們通過tensorflow來解決這個問題,輸入當x=10的時候求y的值?
import tensorflow as tf
from tensorflow import keras
import numpy as npdef tensor_test1():# layers表示的是一層神經元,units表示這一層里面只有一個。input_shape輸入值model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])# 指定優化和損失函數model.compile(optimizer='sgd', loss='mean_squared_error')xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)# epochs 表示訓練次數model.fit(xs, ys, epochs=500)# y = 2x-1# 通過模型去檢測x=10的時候,y等于多少print(model.predict([10.0]))if __name__ == '__main__':tensor_test1()
通過結果可以看出,是一個很接近的值
2.2、FAshion MNIST數據集使用
700000張圖片
10個類別
28*28
訓練神經元網絡
通過tensorflow進行模型構建,通過構建出來的模型對圖片進行識別
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt# 使用fashion數據集
# 自動終止
# 深度學習是不是訓練的次數越多越好呢,不是次數太多會出現一些過擬合問題,就是做的題目都認識,但是新題目不會
# 所以我們需要通過callback來對他進行終止
class myCallbcak(tf.keras.callbacks.Callback):def on_epoch_end(self, epoch, logs={}):if (logs.get('loss') < 0.4):print("\nloss is low so cancelling training!")self.model.stop_training = Truedef tensor_Fashion():callbacks = myCallbcak()fashion_mnist = keras.datasets.fashion_mnist# 訓練數據集,每張圖片對應的標簽 測試用的圖片 測試用的標簽(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()# print(train_images.shape)# plt.imshow(train_images[0])# 構造模型# 構造一個三層結構,第一層用來接收輸入,中間層有512個神經元,這個是任意的,最后層,我們要分的類別有10model = keras.Sequential([keras.layers.Flatten(input_shape=(28, 28)),keras.layers.Dense(512, activation=tf.nn.relu),keras.layers.Dense(10, activation=tf.nn.softmax)])model.summary()# 歸一化,更準確train_images_scaled = train_images / 255.0# 指定優化model.compile(optimizer='adam', loss=tf.losses.sparse_categorical_crossentropy, metrics=['accuracy'])model.fit(train_images_scaled, train_labels, epochs=100, callbacks=[callbacks])test_images_scaled = test_images / 255.0model.evaluate(test_images_scaled, test_labels)# 判斷單張圖片的屬于哪個類別print(model.predict([[test_images[0] / 255]]))# 打印出標簽print(np.argmax(model.predict([[test_images[0] / 255]])))print(test_labels[0])
3、卷積神經網絡
3.1、卷積神經網絡使用
通過卷積神經網絡對FAshion MNIST數據集進行訓練,得出的準確率比神經網絡的更準確,當時也更耗時
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as pltdef convolution_nerve():fashion_mnist = keras.datasets.fashion_mnist(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()# 構造模型model = keras.Sequential([keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)),keras.layers.MaxPooling2D(2, 2),keras.layers.Conv2D(64, (3, 3), activation='relu'),keras.layers.MaxPooling2D(2, 2),keras.layers.Flatten(),keras.layers.Dense(128, activation='relu'),keras.layers.Dense(10, activation='softmax')])model.summary()# 歸一化train_images_scaled = train_images / 255.0# 指定優化model.compile(optimizer='adam', loss=tf.losses.sparse_categorical_crossentropy, metrics=['accuracy'])model.fit(train_images_scaled.reshape(-1, 28, 28, 1), train_labels, epochs=5)if __name__ == '__main__':convolution_nerve()
模型結構
1層卷積層
輸入是2828,過濾器是33,最后會去掉兩個像素,所以是2626,64是過濾器,經過第一次卷積就變成64張圖片了,(33+1)64=640
2池化層
尺寸減少原來的1/4,長寬各自減去一半
2層卷積層
(33*64+1)*64=36928
第一層卷積層
max pooling
3.2、ImageDataGenerator使用
1、 真實數據做處理
2、圖片尺寸大小不一,需要裁成一樣大小
3、數據量比較大,不能一下載裝入內容
4、經常需要修改參數,列入尺寸
使用ImageDataGenerator對圖片做處理
from tensorflow.keras.preprocessing.image import ImageDataGenerator# 創建兩個數據生成器,指定scaling否為0-1
train_datagen = ImageDataGenerator(rescale=1 / 255)
validation_datagen = ImageDataGenerator(rescale=1 / 255)# 指向訓練數據文件夾
train_genrator = train_datagen.flow_from_directory('/', # 訓練數據所在文件夾target_size=(300, 300), # 指定輸出尺寸batch_size=32, # 每次提取多少class_mode='binary' # 指定二分類
)validation_genrator = validation_datagen.flow_from_directory('/', # 訓練數據所在文件夾target_size=(300, 300), # 指定輸出尺寸batch_size=32, # 每次提取多少class_mode='binary' # 指定二分類
)
3.3、貓狗識別案例
圖片資源下載:https://download.csdn.net/download/weixin_45715405/88226536
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import RMSprop
import os
import tensorflow as tf
from tensorflow import keras
import numpy as np
def dogs_cats():base_dir = 'E:\\BaiduNetdiskDownload\\06.TensorFlow框架課件資料\\Tensorflow課件資料\\貓狗識別項目實戰\\貓狗識別\\貓狗識別\data\\cats_and_dogs'train_dir = os.path.join(base_dir, 'train')validation_dir = os.path.join(base_dir, 'validation')# 訓練集train_cats_dir = os.path.join(train_dir, 'cats')train_dogs_dir = os.path.join(train_dir, 'dogs')# 驗證集validation_cats_dir = os.path.join(validation_dir, 'cats')validation_dogs_dir = os.path.join(validation_dir, 'dogs')model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(16, (3, 3), activation='relu', input_shape=(64, 64, 3)),tf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),tf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),tf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(512, activation='relu'),tf.keras.layers.Dense(1, activation='sigmoid') # 如果是多分類用softmax,2分類用sigmoid就可以了])# 設置損失函數,優化函數model.compile(loss='binary_crossentropy', optimizer=RMSprop(0.001), metrics=['acc'])# 數據預處理# 都進來的數據會被自動轉換成tensor(float32)格式,分別準備訓練和驗證# 圖像數據歸一化(0-1)區間train_datagen = ImageDataGenerator(rescale=1. / 255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')test_datagen = ImageDataGenerator(rescale=1. / 255)train_generator = train_datagen.flow_from_directory(train_dir, # 文件夾路徑target_size=(64, 64), # 指定resize的大小batch_size=20,# 如果one-hot就是categorical,二分類用binary就可以class_mode='binary')validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(64, 64),batch_size=20,class_mode='binary')# 訓練網絡模型# 直接fit也可以,但是通常不能把所有數據全部放入內存,fit_generator相當于一個生成器,動態產生所需的batch數據# steps_per_epoch相當給定一個停止條件,因為生成器會不斷產生batch數據,說白了就是它不知道一個epoch里需要執行多少個stephistory = model.fit_generator(train_generator,steps_per_epoch=100,epochs=5,validation_data=validation_generator,validation_steps=50,verbose=2)
3.4、參數優化
安裝
pip3 install keras-tuner
優化之后的參數版本
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import RMSprop
import os
from kerastuner.tuners import Hyperband
from kerastuner.engine.hyperparameters import HyperParameters# 創建兩個數據生成器,指定scaling否為0-1
# train_datagen = ImageDataGenerator(rescale=1 / 255)
# validation_datagen = ImageDataGenerator(rescale=1 / 255)
#
# # 指向訓練數據文件夾
# train_genrator = train_datagen.flow_from_directory(
# 'E:\\BaiduNetdiskDownload\\06.TensorFlow框架課件資料\\Tensorflow課件資料\\貓狗識別項目實戰\\貓狗識別\\貓狗識別\data\\cats_and_dogs\\train', # 訓練數據所在文件夾
# target_size=(300, 300), # 指定輸出尺寸
# batch_size=32, # 每次提取多少
# class_mode='binary' # 指定二分類
# )
#
# validation_genrator = validation_datagen.flow_from_directory(
# 'E:\\BaiduNetdiskDownload\\06.TensorFlow框架課件資料\\Tensorflow課件資料\\貓狗識別項目實戰\\貓狗識別\\貓狗識別\data\\cats_and_dogs\\validation', # 訓練數據所在文件夾
# target_size=(300, 300), # 指定輸出尺寸
# batch_size=32, # 每次提取多少
# class_mode='binary' # 指定二分類
# )hp = HyperParameters()def dogs_cats(hp):model = tf.keras.models.Sequential()# values 指定范圍model.add(tf.keras.layers.Conv2D(hp.Choice('num_filters_layer0', values=[16, 64], default=16),(3, 3), activation='relu',input_shape=(64, 64, 3)))model.add(tf.keras.layers.MaxPooling2D(2, 2))for i in range(hp.Int('num_conv_layers', 1, 3)):model.add(tf.keras.layers.Conv2D(hp.Choice(f'num_filters_layer{i}', values=[16, 64], default=16), (3, 3),activation='relu'))model.add(tf.keras.layers.MaxPooling2D(2, 2))model.add(tf.keras.layers.Flatten())model.add(tf.keras.layers.Dense(hp.Int('hidde_units', 128, 512, step=32), activation='relu'))model.add(tf.keras.layers.Dense(1, activation='sigmoid')) # 如果是多分類用softmax,2分類用sigmoid就可以了# 設置損失函數,優化函數model.compile(loss='binary_crossentropy', optimizer=RMSprop(0.001), metrics=['acc'])return modelbase_dir = 'E:\\BaiduNetdiskDownload\\06.TensorFlow框架課件資料\\Tensorflow課件資料\\貓狗識別項目實戰\\貓狗識別\\貓狗識別\data\\cats_and_dogs'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')# 訓練集
train_cats_dir = os.path.join(train_dir, 'cats')
train_dogs_dir = os.path.join(train_dir, 'dogs')# 驗證集
validation_cats_dir = os.path.join(validation_dir, 'cats')
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
# 數據預處理
# 都進來的數據會被自動轉換成tensor(float32)格式,分別準備訓練和驗證
# 圖像數據歸一化(0-1)區間
train_datagen = ImageDataGenerator(rescale=1. / 255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest'
)
test_datagen = ImageDataGenerator(rescale=1. / 255)train_generator = train_datagen.flow_from_directory(train_dir, # 文件夾路徑target_size=(64, 64), # 指定resize的大小batch_size=20,# 如果one-hot就是categorical,二分類用binary就可以class_mode='binary'
)
validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(64, 64),batch_size=20,class_mode='binary'
)# 訓練網絡模型
# 直接fit也可以,但是通常不能把所有數據全部放入內存,fit_generator相當于一個生成器,動態產生所需的batch數據
# steps_per_epoch相當給定一個停止條件,因為生成器會不斷產生batch數據,說白了就是它不知道一個epoch里需要執行多少個step
# history = model.fit_generator(
# train_generator,
# steps_per_epoch=100,
# epochs=5,
# validation_data=validation_generator,
# validation_steps=50,
# verbose=2)tuner = Hyperband(dogs_cats,objective='val_acc',max_epochs=15,directory='dog_cats_params',hyperparameters=hp,project_name='my_dog_cat_project'
)
tuner.search(train_generator, epochs=10, validation_data=validation_generator)# 查看參數情況
best_hps = tuner.get_best_hyperparameters(1)[0]
print(best_hps.values)
# 通過參數將模型構建出來
model = tuner.hypermodel.build(best_hps)
model.summary()