""" 定义训练和测试流程,无需了解 """
import numpy as np
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
TRAIN_NUM = 55000 # Training
VAL_NUM = 5000 # Validation
TEST_NUM = 10000 # Test
def train(model, criterion, optimizer, dataset, max_epoch, batch_size, disp_freq):
avg_train_loss, avg_train_acc = [], []
avg_val_loss, avg_val_acc = [], []
get_next = dataset.batch(TRAIN_NUM).make_one_shot_iterator().get_next()
config = tf.ConfigProto()
config.gpu_options.allow_growth = True # 允许 GPU 内存动态增长
with tf.Session(config=config) as sess:
# split raw training data(60000) to train_set(55000) and val_set(5000)
tmp1, tmp2 = sess.run(get_next)
tmp1 = tf.data.Dataset.from_tensor_slices(tmp1)
tmp2 = tf.data.Dataset.from_tensor_slices(tmp2)
train_data = tf.data.Dataset.zip((tmp1, tmp2)).repeat(max_epoch).batch(batch_size)
# prepare training batch loader
train_get_next = train_data.make_one_shot_iterator().get_next()
tmp3, tmp4 = sess.run(get_next)
tmp3 = tf.data.Dataset.from_tensor_slices(tmp3)
tmp4 = tf.data.Dataset.from_tensor_slices(tmp4)
valid_data = tf.data.Dataset.zip((tmp3, tmp4)).repeat(max_epoch).batch(batch_size)
# prepare validate batch loader
valid_get_next = valid_data.make_one_shot_iterator().get_next()
# Training process
for epoch in range(max_epoch):
batch_train_loss, batch_train_acc = train_one_epoch(model, criterion, optimizer, train_get_next,
max_epoch, batch_size, disp_freq, epoch, sess)
batch_val_loss, batch_val_acc = validate(model, criterion, valid_get_next, batch_size, sess)
avg_train_acc.append(np.mean(batch_train_acc))
avg_train_loss.append(np.mean(batch_train_loss))
avg_val_acc.append(np.mean(batch_val_acc))
avg_val_loss.append(np.mean(batch_val_loss))
print()
print('Epoch [{}]\t Average training loss {:.4f}\t Average training accuracy {:.4f}'.format(
epoch, avg_train_loss[-1], avg_train_acc[-1]))
print('Epoch [{}]\t Average validation loss {:.4f}\t Average validation accuracy {:.4f}'.format(
epoch, avg_val_loss[-1], avg_val_acc[-1]))
print()
return model, avg_val_loss, avg_val_acc
def train_one_epoch(model, criterion, optimizer, data_get_next, max_epoch, batch_size, disp_freq, epoch, sess):
batch_train_loss, batch_train_acc = [], []
max_train_iteration = TRAIN_NUM // batch_size
for iteration in range(max_train_iteration):
# Get training data and label
train_x, train_y = sess.run(data_get_next)
# Forward pass
logit = model.forward(train_x)
criterion.forward(logit, train_y)
# Backward pass
delta = criterion.backward()
model.backward(delta)
# Update weights, see optimize.py
optimizer.step(model)
# Record loss and accuracy
batch_train_loss.append(criterion.loss)
batch_train_acc.append(criterion.acc)
if iteration % disp_freq == 0:
print("Epoch [{}][{}]\t Batch [{}][{}]\t Training Loss {:.4f}\t Accuracy {:.4f}".format(
epoch, max_epoch, iteration, max_train_iteration,
np.mean(batch_train_loss), np.mean(batch_train_acc)))
return batch_train_loss, batch_train_acc
def validate(model, criterion, data_get_next, batch_size, sess):
batch_val_acc, batch_val_loss = [], []
max_val_iteration = VAL_NUM // batch_size
for iteration in range(max_val_iteration):
# Get validating data and label
val_x, val_y = sess.run(data_get_next)
# Only forward pass
logit = model.forward(val_x)
loss = criterion.forward(logit, val_y)
# Record loss and accuracy
batch_val_loss.append(criterion.loss)
batch_val_acc.append(criterion.acc)
return batch_val_loss, batch_val_acc
def test(model, criterion, dataset, batch_size, disp_freq):
print('Testing...')
max_test_iteration = TEST_NUM // batch_size
batch_test_acc = []
test_iter = dataset.batch(batch_size).make_one_shot_iterator()
get_next = test_iter.get_next()
config = tf.ConfigProto(device_count={'GPU': 0})
with tf.Session(config=config) as sess:
for iteration in range(max_test_iteration):
test_x, test_y = sess.run(get_next)
# Only forward pass
logit = model.forward(test_x)
loss = criterion.forward(logit, test_y)
batch_test_acc.append(criterion.acc)
print("The test accuracy is {:.4f}.\n".format(np.mean(batch_test_acc)))
return np.mean(batch_test_acc)
没有合适的资源?快使用搜索试试~ 我知道了~
基于多层感知机的手写数字识别
共24个文件
pyc:11个
py:11个
md:1个
需积分: 5 2 下载量 32 浏览量
2024-05-14
10:25:22
上传
评论
收藏 491KB ZIP 举报
温馨提示
本次案例提供了若干初始代码,可基于初始代码完成案例,各文件简介如下: (运行初始代码之前请自行安装TensorFlow 2.0及以上版本,仅用于处理数据集,禁止直接调用TensorFlow函数) mlp.ipynb包含了本案例的主要内容,运行文件需安装Jupyter Noterbook. network.py定义了网络,包括其前向和后向计算。 optimizer.py定义了随机梯度下降(SGD),用于完成反向传播和参数更新。 solver.py定义了训练和测试过程需要用到的函数。 plot.py用来绘制损失函数和准确率的曲线图。
资源推荐
资源详情
资源评论
收起资源包目录
2 基于多层感知机的手写数字识别.zip (24个子文件)
2 基于多层感知机的手写数字识别
layers
fc_layer.py 1KB
__init__.py 152B
sigmoid_layer.py 460B
__pycache__
__init__.cpython-311.pyc 441B
fc_layer.cpython-311.pyc 3KB
sigmoid_layer.cpython-311.pyc 1KB
relu_layer.cpython-311.pyc 1KB
relu_layer.py 472B
plot.py 1KB
criterion
__init__.py 156B
softmax_cross_entropy.py 1KB
euclidean_loss.py 781B
__pycache__
__init__.cpython-311.pyc 422B
softmax_cross_entropy.cpython-311.pyc 2KB
euclidean_loss.cpython-311.pyc 2KB
network.py 481B
2 基于多层感知机的手写数字识别.md 32KB
solver.py 4KB
mlp.ipynb 899KB
__pycache__
network.cpython-311.pyc 2KB
solver.cpython-311.pyc 7KB
plot.cpython-311.pyc 4KB
optimizer.cpython-311.pyc 1KB
optimizer.py 597B
共 24 条
- 1
资源评论
住在天上的云
- 粉丝: 6516
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Screenshot_20240528_103010.jpg
- 基于Python的新能源承载力计算及界面设计源码 - HAINING-DG
- 基于Java的本科探索学习项目设计源码 - 本科探索
- 基于Javascript和Python的微商城项目设计源码 - MicroMall
- 基于Java的网上订餐系统设计源码 - online ordering system
- 基于Javascript的超级美眉网络资源管理应用模块设计源码
- 基于Typescript和PHP的编程知识储备库设计源码 - study-php
- Screenshot_2024-05-28-11-40-58-177_com.tencent.mm.jpg
- 基于Dart的Flutter小提琴调音器APP设计源码 - violinhelper
- 基于JavaScript和CSS的随寻订购网页设计源码 - web-order
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功