keras与pytorch搭建神经网络

参考:刘志瑛《Tensorflow+Pytorch深度学习从算法到实战》

网络搭建的过程: 整体网络训练的过程:搭建框架——编译——训练——评估——预测/使用

使用keras搭建基本步骤核心代码实例

import keras
from keras.layers import Conv2D,MaxPooling2D,Flatten,Dense,Dropout
from keras.models import Sequential

# 网络模型构造方法1,过程化构造网络模型
model = Sequential()
model.add(
    Conv2D(32, kernel_size=(3, 3), activation='relu',
           input_shape=(28, 28, 1)))  # 32核卷积
model.add(MaxPooling2D(pool_size=(2, 2)))  # 2*2池化
model.add(Conv2D(64, (3, 3), activation='relu'))  # 64核卷积
model.add(MaxPooling2D(pool_size=(2, 2)))  # 2*2池化
model.add(Flatten())  # 连接层,卷积和全连接网络的中介
model.add(Dense(128, activation='relu'))  # 全连接层
model.add(Dropout(0.5))  # Dropout层
model.add(Dense(10, activation='softmax'))

# 网络模型构造方法2,函数式方法构造网络模型,
# 常用于网络结构中并联,复用的部分
# input_img = Input(shape=(256,256,3)) # 并不是真正的执行代码,只是表示输入的图像
# tower_1 = Conv2D(64,(1,1),padding='same',activation='relu')(input_img)
# tower_2 = Conv2D(64,(1,1),padding='same',activation='relu')(tower_1)

# 编译
model.compile( loss=keras.losses.categorical_crossentropy,
    optimizer=keras.optimizers.Adadelta(),
    metrics=['accuracy'])

# 训练
model.fit(
    X_train,  # 训练使用的输入和标签数据
    y_train,
    batch_size=128,  # 每次训练数据个数
    epochs=10,   # 整体训练10次
    verbose=1,  #verbose: 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行
    validation_data=(X_test, y_test)) #用来评估损失,以及在每轮结束时的任何模型度量指标

# 评估
score = model.evaluate(X_test, y_test, verbose=0)
print('损失数:', score[0])
print('准确率:', score[1])

# 预测
classes = model.predict(x_test,batch_size=128)

使用torch搭建基本步骤核心代码实例

import numpy as np
import torch as t

# 超参数
num_epochs = 30  # 训练轮数
learning_rate = 1e-3  # 学习率
batch_size = 100  # 批量大小

####### 训练部分

# 创建网络框架
class FirstCnnNet(t.nn.Module):  # CNN网络
    def __init__(self, num_classes):  # 初始化只需要输出这一个参数
        super(FirstCnnNet, self).__init__()  # 固定格式
        self.conv1 = t.nn.Sequential(
            t.nn.Conv2d(1, 16, kernel_size=5, stride=2, padding=2),
            t.nn.BatchNorm2d(16),
            t.nn.ReLU())  # 输入深度1,输出深度16。从1,28,28压缩为16,14,14
        self.conv2 = t.nn.Sequential(
            t.nn.Conv2d(16, 32, kernel_size=5, stride=2, padding=2),
            t.nn.BatchNorm2d(32), t.nn.ReLU(),
            t.nn.MaxPool2d(kernel_size=2,
                           stride=1))  # 输入深度16,输出深度32。16,14,14压缩到32,6,6
        self.dense1 = t.nn.Sequential(
            t.nn.Linear(6 * 6 * 32, 128), t.nn.ReLU(),
            t.nn.Dropout(p=0.25))  # 第1个全连接层,输入6*6*32,输出128
        self.dense2 = t.nn.Linear(128, num_classes)  # 第2个全连接层,输入128,输出10类

    def forward(self, x):  # 传入计算值的函数,真正的计算在这里
        x = self.conv1(x)  # 16,14,14
        x = self.conv2(x)  # 32,6,6
        x = x.view(x.size(0), -1)
        x = self.dense1(x)  # 32*6*6 -> 128
        x = self.dense2(x)  # 128 -> 10
        return x
 # 输入28*28,隐藏层128,输出10类,创建定义一个实例框架,执行__init__()
model = FirstCnnNet(10)  # 后面的model(),都是执行的 forward函数
optimizer = t.optim.Adam(model.parameters(), lr=learning_rate)  # 优化器仍然选随机梯度下降

X_train_size = len(X_train)

for epoch in range(num_epochs):
    print('Epoch:', epoch)  # 打印轮次:

    X = t.autograd.Variable(t.from_numpy(X_train))
    y = t.autograd.Variable(t.from_numpy(y_train))

    i = 0
    while i < X_train_size:
        X0 = X[i:i + batch_size]  #取一个新批次的数据
        X0 = X0.view(-1, 1, 28, 28)
        y0 = y[i:i + batch_size]
        i += batch_size

        # 正向传播
        out = model(X0)  # 用神经网络计算10类输出结果
        loss = t.nn.CrossEntropyLoss()(out, y0)  # 计算神经网络结果与实际标签结果的差值

        # 反向梯度下降
        optimizer.zero_grad()  # 清空梯度
        loss.backward()  # 根据误差函数求导
        optimizer.step()  # 进行一轮梯度下降计算

    print(loss.item())

############## 验证部分

model.eval()  ## 将模型设为验证模式

X_val = t.autograd.Variable(t.from_numpy(X_test))
y_val = t.autograd.Variable(t.from_numpy(y_test))

X_val = X_val.view(-1, 1, 28, 28)  # 整形成CNN需要的输入

out_val = model(X_val)  ## 用训练好的模型计算结果
loss_val = t.nn.CrossEntropyLoss()(out_val, y_val)

print(loss_val.item())

_, pred = t.max(out_val, 1)  # 求出最大的元素的位置
num_correct = (pred == y_val).sum()  # 将预测值与标注值进行对比

print(num_correct.data.numpy() / len(y_test))  # 显示正确率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值