python怎么导入keras_keras导入weights方式

本文介绍了在Keras中如何使用load_weights函数加载模型权重,详细解析了by_name参数为False和True时的区别。通过实例展示了在模型结构有所改变时,如何正确加载预训练权重。同时,还提供了使用Keras实现MNIST手写数字识别的代码示例。
摘要由CSDN通过智能技术生成

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=50,init='uniform',activation='tanh'))

model.add(Dense(input_dim=50,output_dim=Y_train_ohe.shape[1],init='uniform',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方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: keras导入weights方式

本文地址: http://www.cppcns.com/jiaoben/python/319120.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`load_weights()`函数是Keras中用于加载预训练模型权重的函数。它可以将已经训练好的模型权重加载到新的模型中,以实现迁移学习或继续训练的目的。下面是`load_weights()`函数的详细解释: 函数原型: ```python load_weights(filepath, by_name=False, skip_mismatch=False) ``` 参数说明: - `filepath`:权重文件的路径。可以是一个HDF5格式的文件,也可以是一个包含权重的numpy数组。 - `by_name`:布尔值,如果为True,则按照层的名字来加载权重。如果为False,则按照层的顺序来加载权重。默认为False。 - `skip_mismatch`:布尔值,如果为True,则如果模型中的层与权重文件中的层不匹配,则跳过这些层。如果为False,则会抛出一个异常。默认为False。 返回值: 该函数没有返回值,它只是将权重加载到模型中。 使用示例: 假设我们已经训练好了一个模型`model`,并将其保存为了一个HDF5文件`weights.h5`。现在我们想要将这些权重加载到一个新的模型`new_model`中,可以使用如下代码: ```python from keras.models import load_model new_model = load_model('new_model.h5') # 加载新模型 new_model.load_weights('weights.h5') # 加载权重 ``` 注意:如果新模型与原模型的结构不同,需要在加载权重时设置`by_name=True`,并将原模型中层的名字与新模型中相应层的名字对应起来。例如,如果原模型中有一个名为`conv2d_1`的卷积层,而新模型中对应的卷积层的名字为`conv1`,则可以使用如下代码: ```python new_model.load_weights('weights.h5', by_name=True, skip_mismatch=True) ``` 在该代码中,`skip_mismatch=True`表示如果层的名字不匹配,则跳过这个层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值