李宏毅2020作业3---CNN
其他作業(yè)指路:?李宏毅機器學習2020作業(yè)匯總
1.配置環(huán)境
第三方庫:
cv2
pytorch
torchvision
理論:
keras常用函數(shù):
pytorch常用函數(shù):
程序:
函數(shù):
1.sorted():
當sorted()函數(shù)被調(diào)用時,它會提供一個有序的列表作為返回值。
2.os.listdir(path):
返回指定路徑下的文件和文件夾列表。
3.np.zeros():
在opencv-python中,若想為圖像創(chuàng)建一個容器,需要指定dtype=np.uint8,否則雖然你的容器矩陣中是有值的,但是無法正常imshow,另數(shù)據(jù)類型為 np.uint8,也就是0~255,所以若計算過程中數(shù)據(jù)超出了這個范圍,就會造成溢出。
4.enumerate():
用于將一個可遍歷的數(shù)據(jù)對象(如列表、元組或字符串)組合為一個索引序列,同時列出數(shù)據(jù)和數(shù)據(jù)下標,一般用在 for 循環(huán)當中。如:?for i, file in enumerate(image_dir)
5.cv2.resize():
裁剪后的圖片還是以numpy array的方式保存的, 數(shù)值的取值范圍是(0~255)
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)參數(shù):
-
scr:原圖(cv2.imread()中讀取出來的)
-
dsize:輸出圖像尺寸
-
fx:沿水平軸的比例因子
-
fy:沿垂直軸的比例因子
-
interpolation:插值方法
6.dense():
keras.layers.Dense(units,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)-
units:該層有幾個神經(jīng)元
-
activation:該層使用的激活函數(shù)
-
use_bias:是否添加偏置項
-
kernel_initializer:權重初始化方法
-
bias_initializer:偏置值初始化方法
-
kernel_regularizer:權重規(guī)范化函數(shù)
-
bias_regularizer:偏置值規(guī)范化方法
-
activity_regularizer:輸出的規(guī)范化方法
-
kernel_constraint:權重變化限制函數(shù)
-
bias_constraint:偏置值變化限制函數(shù)
7.keras.callbacks.TensorBoard()的參數(shù):
keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)- log_dir:保存TensorBoard要解析的日志文件的目錄路徑。
- histogram_freq:默認為0。計算模型各層的激活值和權重直方圖的頻率(以epoch計)。如果設置為0,將不會計算直方圖。若想直方圖可視化,必須指定驗證數(shù)據(jù)(或分割驗證集)。
- write_graph:默認為True。是否在TensorBoard中可視化圖形。當設置為True時,日志文件會變得非常大。
- write_images:默認為False。是否寫入模型權重,在TensorBoard中將權重可視化為圖像。
- update_freq:默認為"epoch"。可以是"epoch","batch" 或者整數(shù)。當使用"batch"時,在每個batch后將loss,metrics寫入TensorBoard。"epoch"同理。如果使用整數(shù),比如1000,則每經(jīng)過1000個batch將loss,metrics寫入到TensorBoard。過于頻繁會減慢訓練速度。
- profile_batch:默認為2。每過多少個batch分析一次Profile。profile_batch必須是非負整數(shù)或整數(shù)的元組。一對正整數(shù)表示要進入Profile的batch的范圍。設置profile_batch=0會禁用Profile分析。
- embeddings_freq:默認為0。embedding在epochs中被可視化的頻率。如果設置為0,embedding將無法可視化。
- embeddings_metadata:默認為None。沒看懂。a dictionary which maps layer name to a file name in which metadata for this embedding layer is saved. See the details about metadata files format. In case if the same metadata file is used for all embedding layers, string can be passed.
8.keras.callbacks.ModelCheckpoint():
keras.callbacks.ModelCheckpoint(filepath,monitor='val_loss',verbose=0,save_best_only=False, save_weights_only=False, mode='auto', period=1)- filename:字符串,保存模型的路徑
- monitor:需要監(jiān)視的值
- verbose:信息展示模式,0或1(checkpoint的保存信息,類似Epoch 00001: saving model to ...)
- save_best_only:當設置為True時,監(jiān)測值有改進時才會保存當前的模型(?the latest best model according to the quantity monitored will not be overwritten)
- mode:‘a(chǎn)uto’,‘min’,‘max’之一,在save_best_only=True時決定性能最佳模型的評判準則,例如,當監(jiān)測值為val_acc時,模式應為max,當監(jiān)測值為val_loss時,模式應為min。在auto模式下,評價準則由被監(jiān)測值的名字自動推斷。
- save_weights_only:若設置為True,則只保存模型權重,否則將保存整個模型(包括模型結構,配置信息等)
- period:CheckPoint之間的間隔的epoch數(shù)
9.CNN的計算:
視頻講解
1. 通道數(shù)和卷積核數(shù)
卷積核的通道數(shù)與輸入的通道數(shù)相同(輸出是這個卷積核對應所有通道的輸出的和),如圖所示,上圖中我們設置的卷積核數(shù)是2,卷積核1的輸出是下圖三個的和
卷積核數(shù)與輸出通道數(shù)相同(如下圖設置兩個卷積核所以feature map也會是兩個)
2. 輸出feature map的尺寸的計算
N=(W-F+2P)/S+1
其中N:輸出大小
W:輸入大小
F:卷積核大小
P:填充值的大小
S:步長大小
3. 整體表示
nn.Conv2d(in_channels=輸入通道數(shù),out_channels=輸出通道數(shù),kernel_size=卷積核大小,stride=步長,padding=填充)
卷積層輸入特征圖的尺寸為:
Hinput×Winput×Cinput
- Hinput表示輸入特征圖的高
- Winput表示輸入特征圖的寬
- CinputCinput表示輸入特征圖的通道數(shù)(如果是第一個卷積層則是輸入圖像的通道數(shù),如果是中間的卷積層則是上一層的輸出通道數(shù))
卷積層的參數(shù)有如下幾個:
- 輸出通道數(shù)為K
- 正方形卷積核的邊長為F
- 步幅(stride)為S
- 補零的行數(shù)和列數(shù)(padding)為P
輸出特征圖(output feature map)的尺寸為Houtput×Woutput×Coutput,其中每一個變量的計算方式如下:
- Houtput=(Hintput?F+2P)/S+1
- Woutput=(Winput?F+2P)/S+1
- Coutput=K
參數(shù)量大小的計算,分為weights和biases:
- weights的參數(shù)量:F×F×Cinput×K
- biases的參數(shù)量:K
- 總參數(shù)量:F×F×Cinput×K+K
10.modle.fit():
fit( x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)- x:輸入數(shù)據(jù)。如果模型只有一個輸入,那么x的類型是numpy
array,如果模型有多個輸入,那么x的類型應當為list,list的元素是對應于各個輸入的numpy array - y:標簽,numpy array
- batch_size:整數(shù),指定進行梯度下降時每個batch包含的樣本數(shù)。訓練時一個batch的樣本會被計算一次梯度下降,使目標函數(shù)優(yōu)化一步。
- epochs:整數(shù),訓練終止時的epoch值,訓練將在達到該epoch值時停止,當沒有設置initial_epoch時,它就是訓練的總輪數(shù),否則訓練的總輪數(shù)為epochs - inital_epoch
- verbose:日志顯示,0為不在標準輸出流輸出日志信息,1為輸出進度條記錄,2為每個epoch輸出一行記錄
- callbacks:list,其中的元素是keras.callbacks.Callback的對象。這個list中的回調(diào)函數(shù)將會在訓練過程中的適當時機被調(diào)用,參考回調(diào)函數(shù)
- validation_split:0~1之間的浮點數(shù),用來指定訓練集的一定比例數(shù)據(jù)作為驗證集。驗證集將不參與訓練,并在每個epoch結束后測試的模型的指標,如損失函數(shù)、精確度等。注意,validation_split的劃分在shuffle之前,因此如果你的數(shù)據(jù)本身是有序的,需要先手工打亂再指定validation_split,否則可能會出現(xiàn)驗證集樣本不均勻。
- validation_data:形式為(X,y)的tuple,是指定的驗證集。此參數(shù)將覆蓋validation_spilt。
- shuffle:布爾值或字符串,一般為布爾值,表示是否在訓練過程中隨機打亂輸入樣本的順序。若為字符串“batch”,則是用來處理HDF5數(shù)據(jù)的特殊情況,它將在batch內(nèi)部將數(shù)據(jù)打亂。
-
class_weight:字典,將不同的類別映射為不同的權值,該參數(shù)用來在訓練過程中調(diào)整損失函數(shù)(只能用于訓練)
-
sample_weight:權值的numpy
array,用于在訓練時調(diào)整損失函數(shù)(僅用于訓練)。可以傳遞一個1D的與樣本等長的向量用于對樣本進行1對1的加權,或者在面對時序數(shù)據(jù)時,傳遞一個的形式為(samples,sequence_length)的矩陣來為每個時間步上的樣本賦不同的權。這種情況下請確定在編譯模型時添加了sample_weight_mode=’temporal’。 - initial_epoch: 從該參數(shù)指定的epoch開始訓練,在繼續(xù)之前的訓練時有用。
import os
import numpy as np
import cv2
import keras
import pandas as pd
import time
def readfile(path,lable):
? ? image = sorted(os.listdir(path))#讀取標簽
? ? #x用來存儲圖片
? ? x = np.zeros((len(image),128,128,3),dtype=np.uint8)?
? ? #y用來存儲標簽
? ? y = np.zeros((len(image)),dtype=np.uint8)
? ? for i,file in enumerate(image):
? ? ? ? img = cv2.imread(os.path.join(path,file))
? ? ? ? #將多個路徑組合后返回(加上這個訓練測試集都可以調(diào)用)
? ? ? ? x[i,:,:] = cv2.resize(img,(128,128))
? ? ? ? if lable:
? ? ? ? ? ? y[i]=int(file.split("_")[0])
? ? if lable:
? ? ? ? return x,y
? ? else:
? ? ? ? return x
data_dress="./food-11"
train_x,train_y = readfile(os.path.join(data_dress,"training"),True)
val_x,val_y=readfile(os.path.join(data_dress,"validation"),True)
test_x = readfile(os.path.join(data_dress,"testing"),False)
#設計CNN
modle = keras.models.Sequential()
#輸入尺寸(128,128,3)
# padding: same:對邊緣補0 valid:對邊緣不補0
modle.add(keras.layers.Conv2D(32,(3,3),strides = (1,1),padding = "same",activation="relu",input_shape=(128,128,3)))
modle.add(keras.layers.MaxPooling2D(pool_size = (2,2),strides = (2,2)))
modle.add(keras.layers.Conv2D(64,(3,3),strides = (1,1),padding = "same",activation="relu"))
modle.add(keras.layers.MaxPooling2D(pool_size = (2,2),strides = (2,2)))
modle.add(keras.layers.Flatten())#128個filter??
modle.add(Dropout(0.5))
for i in range(20):
? ? modle.add(keras.layers.Dense(100,activation="selu"))
modle.add(keras.layers.Dense(11,activation="softmax"))
modle.compile(loss = "sparse_categorical_crossentropy",optimizer = "adam",metrics = ["accuracy"])
#激活函數(shù)
#網(wǎng)絡一共20個layer,每個layer有100個Node。Activation Function選擇selu是為了自動批歸一化,提高準確率。
dress = "./H5"
epoch=20
if not os.path.exists(dress):
? ? os.mkdir(dress)
#如果地址不存在就創(chuàng)建地址
output_modle = os.path.join(dress,"cnn_classification.h5")
history = modle.fit(train_x,train_y,epochs=epoch)
#計算測試集準確率
modle.evaluate(val_x,val_y)
訓練集準確率達到87.5%
測試集準確率卻只有29%,使用三種方法:早停,正則化,droupout
參考內(nèi)容:
1.demo中程序:點擊跳轉
2.demo中程序:點此跳轉
3.使用keras的作業(yè):點擊跳轉
4.keras常用函數(shù):點擊跳轉
5.pytorch常用函數(shù):點擊跳轉
總結
以上是生活随笔為你收集整理的李宏毅2020作业3---CNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言----逻辑回归各统计量解读
- 下一篇: 计算机任意符号,如何打特殊符号,勾勾叉叉