1. 程式人生 > 程式設計 >keras匯入weights方式

keras匯入weights方式

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方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。