keras匯入weights方式
阿新 • • 發佈:2020-06-14
keras原始碼engine中toplogy.py定義了載入權重的函式:
load_weights(self,filepath,by_name=False)
其中預設by_name為False,這時候載入權重按照網路拓撲結構載入,適合直接使用keras中自帶的網路模型,如VGG16
VGG19/resnet50等,原始碼描述如下:
If `by_name` is False (default) weights are loaded
based on the network's topology,meaning the architecture
should be the same as when the weights were saved.Note that layers that don't have weights are not taken
into account in the topological ordering,so adding or
removing layers is fine as long as they don't have weights.
若將by_name改為True則載入權重按照layer的name進行,layer的name相同時載入權重,適合用於改變了
模型的相關結構或增加了節點但利用了原網路的主體結構情況下使用,原始碼描述如下:
If `by_name` is True,weights are loaded into layers
only if they share the same name. This is useful
for fine-tuning or transfer-learning models where
some of the layers have changed.
在進行邊緣檢測時,利用VGG網路的主體結構,網路中增加反捲積層,這時載入權重應該使用
model.load_weights(filepath,by_name=True)
補充知識:Keras下實現mnist手寫數字
之前一直在用tensorflow,被同學推薦來用keras了,把之前文件中的mnist手寫數字資料集拿來練手,
程式碼如下。
import struct import numpy as np import os import keras from keras.models import Sequential from keras.layers import Dense from keras.optimizers import SGD def load_mnist(path,kind): labels_path = os.path.join(path,'%s-labels.idx1-ubyte' % kind) images_path = os.path.join(path,'%s-images.idx3-ubyte' % kind) with open(labels_path,'rb') as lbpath: magic,n = struct.unpack('>II',lbpath.read(8)) labels = np.fromfile(lbpath,dtype=np.uint8) with open(images_path,'rb') as imgpath: magic,num,rows,cols = struct.unpack(">IIII",imgpath.read(16)) images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels),784) #28*28=784 return images,labels #loading train and test data X_train,Y_train = load_mnist('.\\data',kind='train') X_test,Y_test = load_mnist('.\\data',kind='t10k') #turn labels to one_hot code Y_train_ohe = keras.utils.to_categorical(Y_train,num_classes=10) #define models model = Sequential() model.add(Dense(input_dim=X_train.shape[1],output_dim=50,init='uniform',activation='tanh')) model.add(Dense(input_dim=50,output_dim=Y_train_ohe.shape[1],activation='softmax')) sgd = SGD(lr=0.001,decay=1e-7,momentum=0.9,nesterov=True) model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=["accuracy"]) #start training model.fit(X_train,Y_train_ohe,epochs=50,batch_size=300,shuffle=True,verbose=1,validation_split=0.3) #count accuracy y_train_pred = model.predict_classes(X_train,verbose=0) train_acc = np.sum(Y_train == y_train_pred,axis=0) / X_train.shape[0] print('Training accuracy: %.2f%%' % (train_acc * 100)) y_test_pred = model.predict_classes(X_test,verbose=0) test_acc = np.sum(Y_test == y_test_pred,axis=0) / X_test.shape[0] print('Test accuracy: %.2f%%' % (test_acc * 100))
訓練結果如下:
Epoch 45/50 42000/42000 [==============================] - 1s 17us/step - loss: 0.2174 - acc: 0.9380 - val_loss: 0.2341 - val_acc: 0.9323 Epoch 46/50 42000/42000 [==============================] - 1s 17us/step - loss: 0.2061 - acc: 0.9404 - val_loss: 0.2244 - val_acc: 0.9358 Epoch 47/50 42000/42000 [==============================] - 1s 17us/step - loss: 0.1994 - acc: 0.9413 - val_loss: 0.2295 - val_acc: 0.9347 Epoch 48/50 42000/42000 [==============================] - 1s 17us/step - loss: 0.2003 - acc: 0.9413 - val_loss: 0.2224 - val_acc: 0.9350 Epoch 49/50 42000/42000 [==============================] - 1s 18us/step - loss: 0.2013 - acc: 0.9417 - val_loss: 0.2248 - val_acc: 0.9359 Epoch 50/50 42000/42000 [==============================] - 1s 17us/step - loss: 0.1960 - acc: 0.9433 - val_loss: 0.2300 - val_acc: 0.9346 Training accuracy: 94.11% Test accuracy: 93.61%
以上這篇keras匯入weights方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。