예제 #1
0
def test_mnist(dir_path, label_path, model_path):
    # 方式1:直接加载已经训练好的模型
    # model= keras.models.load_model(model_path)
    # 方式2:重新构造模型,并加载训练好的权重
    model = LeNet.build_lenet('subclass')
    model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    model.build((1,28,28,1))
    model.load_weights(model_path)

    # 验证准确率
    test_dataset = data_loader(dir_path, label_path)
    test_dataset = test_dataset.batch(10000)
    test_images, test_labels = next(iter(test_dataset))
    loss, acc = model.evaluate(test_images,  test_labels, verbose=2)
    print("Restored model, accuracy: {:5.2f}%".format(100*acc))
예제 #2
0
def train_mnist(dir_path, label_path, epochs, save_path):
    """模型训练"""
    train_dataset = data_loader(dir_path, label_path)
    train_dataset = train_dataset.batch(60000)
    train_dataset = train_dataset.shuffle(60000)
    train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
    train_images, train_labels = next(iter(train_dataset))
    # 定义模型——三种方式:1.sequential;2.functional API;3.自定义子类Model
    model = LeNet.build_lenet('sequential')
    # 2. functional API  model = LeNet.build_lenet('functional')
    # 3. 自定义子类Model   model = LeNet.build_lenet('subclass')

    # 定义优化器
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
    # 模型编译
    model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    # 训练
    model.fit(train_images, train_labels, epochs=epochs)
    # 模型保存——两种方式:1.只存权重 2、存包含优化器和损失函数在内的整个模型(仅支持functional和sequential类型的model)
    model.save(save_path)
예제 #3
0
파일: main.py 프로젝트: omarsemma/Lenet5
parser.add_argument('--nb_imgs',
                    help='Number of picture to use in db < 10000',
                    type=int,
                    default=10000)
args = parser.parse_args()

if args.debug:
    logging.basicConfig(filename='debug.log',
                        level=logging.INFO,
                        format='%(levelname)s %(asctime)s %(message)s',
                        filemode='w')

# dataset object creation
data = dataset(nb_imgs=args.nb_imgs)

net = LeNet()

# Dictionnary for network parameters
params = {
    "conv1_weight": np.load('params/conv1.weight.save'),
    "conv1_bias": np.load('params/conv1.bias.save'),
    "conv2_weight": np.load('params/conv2.weight.save'),
    "conv2_bias": np.load('params/conv2.bias.save'),
    "dense1_weight": np.load('params/fc1.weight.save'),
    "dense1_bias": np.load('params/fc1.bias.save'),
    "dense2_weight": np.load('params/fc2.weight.save'),
    "dense2_bias": np.load('params/fc2.bias.save'),
    "dense3_weight": np.load('params/fc3.weight.save'),
    "dense3_bias": np.load('params/fc3.bias.save')
}
예제 #4
0
# -*- coding:utf-8 -*-
"""
CNN手写数字识别的训练过程
训练结束后将参数保存在序列化文件中
"""
import mnist
import pickle
from network import LeNet

l = LeNet()
x_data, y_data = mnist.train_load()
x_data = x_data[:1000, :]
y_data = y_data[:1000]
learning_rate = 0.01
batch_size = 320  # 每批次的训练样本数
num_x_data = x_data.shape[0]  # 总训练样本数
num_batch = num_x_data // batch_size  # 每轮训练批数:1875

for t in range(1):
    loss = 0
    print("第%d轮训练" % (t + 1))
    for i in range(num_batch):
        x = x_data[i * batch_size:(i + 1) * batch_size, :]
        x = x.reshape(x.shape[0], 1, 28, 28)
        y = y_data[i * batch_size:(i + 1) * batch_size, :]
        l.forward(x)
        loss += l.backward(x, y)
        for weight in [
                "W1", "b1", "W2", "b2", "W3", "b3", "K1", "kb1", "K2", "kb2"
        ]:
            l.weights[weight] -= learning_rate * l.gradients[weight]
예제 #5
0
import numpy as np
import megengine as mge
from megengine.optimizer import SGD
from megengine.autodiff import GradManager
import megengine.functional as F
from loguru import logger

from network import LeNet
from data import train_dataloader

net = LeNet()

optimizer = SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)

gm = GradManager().attach(net.parameters())

net.train()
total_epochs = 5
for epoch in range(total_epochs):
    total_loss = 0
    for step, (batch_data, batch_label) in enumerate(train_dataloader):
        batch_data = mge.tensor(batch_data)
        batch_label = mge.tensor(batch_label).astype(np.int32)

        with gm:
            pred = net(batch_data)
            loss = F.loss.cross_entropy(pred, batch_label)
            gm.backward(loss)
        optimizer.step().clear_grad()

        total_loss += loss.numpy().item()
예제 #6
0
# -*- coding:utf-8 -*-
"""
CNN手写数字识别的测试过程
模型参数保存在序列化文件中,在此读取
"""
import numpy as np
import mnist
import pickle
from network import LeNet


def get_accuracy(self, test_data, y_true):
    y_pre = self.forward(test_data)
    acc = np.mean(np.argmax(y_pre, axis=1) == np.argmax(y_true, axis=1))
    return acc


lenet = LeNet()

x_test, y_test = mnist.test_load()

with open("model\\model_weights.pickle", "rb") as r:
    lenet.weights = pickle.load(r)

acc = get_accuracy(lenet, x_test, y_test)

print("准确率为:", acc)
예제 #7
0
                transforms.ToTensor(),
                transforms.Normalize(
                    (0.1307, ),
                    (0.3081, ))  # 数据集给出的均值和标准差系数,每个数据集都不同的,都数据集提供方给出的
            ])),
        batch_size=batch_size,
        shuffle=True)

    test_loader = torch.utils.data.DataLoader(  # 加载训练数据,详细用法参考我的Pytorch打怪路(一)系列-(1)
        datasets.MNIST(
            data_path,
            train=False,
            transform=transforms.Compose([
                transforms.ToTensor(),
                transforms.Normalize(
                    (0.1307, ),
                    (0.3081, ))  # 数据集给出的均值和标准差系数,每个数据集都不同的,都数据集提供方给出的
            ])),
        batch_size=test_batch_size,
        shuffle=True)

    model = LeNet()  # 实例化一个网络对象
    model = model.to(device)
    optimizer = optim.SGD(model.parameters(), lr=lr,
                          momentum=momentum)  # 初始化优化器

    for epoch in range(1, epochs + 1):  # 以epoch为单位进行循环
        train(epoch)
        test()

    torch.save(model, model_path)  # 保存模型
    labels.append(label)

# scale the raw pixel intensities to the range [0, 1]
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
# partition the data into training and testing splits using 75% of
# the data for training and the remaining 25% for testing
(trainX, testX, trainY, testY) = train_test_split(data,
                                                  labels,
                                                  test_size=0.20,
                                                  random_state=42)
# convert the labels from integers to vectors
trainY = to_categorical(trainY, num_classes=2)
testY = to_categorical(testY, num_classes=2)

model = LeNet.build(width=28, height=28, depth=3, classes=2)
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"])

aug = ImageDataGenerator(rotation_range=30,
                         width_shift_range=0.1,
                         height_shift_range=0.1,
                         shear_range=0.2,
                         zoom_range=0.2,
                         horizontal_flip=True,
                         fill_mode="nearest")

# train the network
print("[INFO] training network...")
H = model.fit_generator(aug.flow(trainX, trainY, batch_size=BS),
                        validation_data=(testX, testY),
예제 #9
0
import numpy as np
import megengine as mge
import megengine.functional as F

from data import test_dataloader
from network import LeNet

net = LeNet()
state_dict = mge.load('mnist_net.mge')
net.load_state_dict(state_dict)

net.eval()
correct = 0
total = 0
for idx, (batch_data, batch_label) in enumerate(test_dataloader):
    batch_data = mge.tensor(batch_data)
    batch_label = mge.tensor(batch_label).astype(np.int32)

    pred = net(batch_data)
    loss = F.loss.cross_entropy(pred, batch_label)
    predicted = pred.numpy().argmax(axis=1)
    correct += (predicted == batch_label.numpy()).sum().item()
    total += batch_label.shape[0]
print("correct: {}, total: {}, accuracy: {}".format(correct, total,
                                                    float(correct) / total))
예제 #10
0
(x_train, y_train), (x_test, y_test) = datasets.cifar10.load_data()

# this is the data pre-processing

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
x_train -= np.mean(x_train)
x_test -= np.mean(x_test)
x_train /= np.std(x_train, axis=0)
x_test /= np.std(x_test, axis=0)
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)

model = LeNet((x_train[0].shape), num_classes, 1e-3, 0.0002)

# uncomment the following for data-augmentation:
'''
aug = ImageDataGenerator(rotation_range=35, width_shift_range=0.1,
	          height_shift_range=0.1,zoom_range=0.3,shear_range=0.1, fill_mode="reflect")
              
        valaug = ImageDataGenerator()
        
        model = LeNet((xTrain[0].shape), num_classes,lr,reg)
        EPOCHS = 20
        H = model.fit_generator(aug.flow(xTrain, yTrain, batch_size = 8),
                	validation_data=valaug.flow(xTest, yTest),
                	epochs=EPOCHS, verbose=1)
	
'''