在mnist数据集上实现卷积神经网络

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("./datasets",one_hot = True,reshape = False)

# 参数
learning_rate = 0.00001
epochs = 10
batch_size = 128

# 用来验证和计算准确率的样本数
test_valid_size = 128
# 神经网络参数
n_classes = 10
dropout = 0.75

weights = {
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
    'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])),
    'out': tf.Variable(tf.random_normal([1024, n_classes]))}

biases = {
    'bc1': tf.Variable(tf.random_normal([32])),
    'bc2': tf.Variable(tf.random_normal([64])),
    'bd1': tf.Variable(tf.random_normal([1024])),
    'out': tf.Variable(tf.random_normal([n_classes]))}
def conv2d(x,W,b,strides=1):
	x = tf.nn.conv2d(x,W,strides=[1,strides,strides,1],padding="SAME")
	x = tf.nn.bias_add(x,b)
	return tf.nn.relu(x)
def maxpool2d(x,k=2):
	return tf.nn.max_pool(x,ksize=[1,k,k,1],strides = [1,k,k,1],padding="SAME")
def conv_net(x,weights,biases,dropout):
	conv1 = conv2d(x,weights["wc1"],biases["bc1"])
	conv1 = maxpool2d(conv1,k=2)
	conv2 = conv2d(conv2,weights["wc"],biases["bc2"])
	conv2 = maxpool2d(conv2,k=2)
	fc1 = tf.reshape(conv2,[-1,weights["wd1"].get_shape().as_list()[0]])
	fc1 = tf.add(tf.matmul(fc1,weights["wd1"]),biases["bd1"])
	fc1 = tf.nn.relu(fc1)
	fc1 = tf.nn.dropout(fc1,dropout)
	
	out = tf.add(tf.matmul(fc1,weights["out"],biases["out"]))
	return out 
Session
x = tf.placeholder(tf.float32,[None,28,28,1])
y = tf.placeholder(tf.float32,[None,n_classes])
keep_prob = tf.placeholder(tf.float32)

logits = conv_net(x,weights,biases,keep_prob)

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=y))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)

correct_pred = tf.equal(tf.argmax(logits,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))

init = tf.global_variables_initializer()

with tf.Session() as sess:
	sess.run(init)
	for epoch in range(epochs):
		for batch in range(mnist.train.num_examples//batch_size):
			batch_x,batch_y = mnsit.train.next_batch(batch_size)
			sess.run(optimizer,feed_dict={x:batch_x,y:batch_y,keep_prob:dropout})
			loss = sess.run(cost,feed_dict = {x:batch_x,y:batch_y,keep_prob:1.})
			valid_acc = sess.run(accuracy,feed_dict={x:mnist.validation.images[:test_valid_size],y:mnist.validation.images[:test_valid_size],keep_prob:1.})
			print('Epoch {:>2}, Batch {:>3} -'
                  'Loss: {:>10.4f} Validation Accuracy: {:.6f}'.format(
                epoch + 1,
                batch + 1,
                loss,
                valid_acc))
	test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images[:test_valid_size],y:mnist.test.labels[:test_valid_size],keep_prob:1.})
	print('Testing Accuracy: {}'.format(test_acc))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用tensorflow实现卷积神经网络来进行MNIST手写数字图像的分类。 #导入numpy模块 import numpy as np #导入tensorflow模块,程序使用tensorflow实现卷积神经网络 import tensorflow as tf #下载mnist数据集,并从mnist_data目录中读取数据 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('mnist_data',one_hot=True) #(1)这里的“mnist_data” 是和当前文件相同目录下的一个文件夹。自己先手工建立这个文件夹,然后从https://yann.lecun.com/exdb/mnist/ 下载所需的4个文件(即该网址中第三段“Four files are available on this site:”后面的四个文件),并放到目录MNIST_data下即可。 #(2)MNIST数据集是手写数字字符的数据集。每个样本都是一张28*28像素的灰度手写数字图片。 #(3)one_hot表示独热编码,其值被设为true。在分类问题的数据集标注时,如何不采用独热编码的方式, 类别通常就是一个符号而已,比如说是9。但如果采用独热编码的方式,则每个类表示为一个列表list,共计有10个数值,但只有一个为1,其余均为0。例如,“9”的独热编码可以为[00000 00001]. #定义输入数据x和输出y的形状。函数tf.placeholder的目的是定义输入,可以理解为采用占位符进行占位。 #None这个位置的参数在这里被用于表示样本的个数,而由于样本个数此时具体是多少还无法确定,所以这设为None。而每个输入样本的特征数目是确定的,即为28*28。 input_x = tf.placeholder(tf.float32,[None,28*28])/255 #因为每个像素的取值范围是 0~255 output_y = tf.placeholder(tf.int32,[None,10]) #10表示10个类别 #输入层的输入数据input_x被reshape成四维数据,其中第一维的数据代表了图片数量 input_x_images = tf.reshape(input_x,[-1,28,28,1]) test_x = mnist.test.images[:3000] #读取测试集图片的特征,读取3000个图片 test_y = mnist.test.labels[:3000] #读取测试集图片的标签。就是这3000个图片所对应的标签
使用PyTorch训练MNIST数据集上的卷积神经网络可以按照以下步骤进行: 1. 导入必要的库和数据集 ```python import torch import torch.nn as nn import torch.optim as optim import torchvision.datasets as datasets import torchvision.transforms as transforms # 加载MNIST数据集 train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True) # 定义批次大小 batch_size = 64 # 创建数据加载器 train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False) ``` 2. 定义卷积神经网络模型 ```python class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1) self.relu1 = nn.ReLU() self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) self.relu2 = nn.ReLU() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(64 * 7 * 7, 128) self.relu3 = nn.ReLU() self.fc2 = nn.Linear(128, 10) def forward(self, x): out = self.conv1(x) out = self.relu1(out) out = self.conv2(out) out = self.relu2(out) out = self.pool(out) out = out.view(out.size(), -1) out = self.fc1(out) out = self.relu3(out) out = self.fc2(out) return out # 创建模型实例 model = ConvNet() ``` 3. 定义损失函数和优化器 ```python # 定义损失函数 criterion = nn.CrossEntropyLoss() # 定义优化器 optimizer = optim.Adam(model.parameters(), lr=.001) ``` 4. 训练模型 ```python # 定义训练函数 def train(model, train_loader, criterion, optimizer, num_epochs): for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # 前向传播 outputs = model(images) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 每100个批次打印一次训练信息 if (i+1) % 100 == : print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_loader), loss.item())) # 开始训练 num_epochs = 5 train(model, train_loader, criterion, optimizer, num_epochs) ``` 5. 测试模型 ```python # 定义测试函数 def test(model, test_loader): # 测试模式 model.eval() # 定义变量 correct = total = # 不计算梯度 with torch.no_grad(): for images, labels in test_loader: # 前向传播 outputs = model(images) _, predicted = torch.max(outputs.data, 1) # 统计正确率 total += labels.size() correct += (predicted == labels).sum().item() # 输出测试结果 print('Accuracy of the model on the 10000 test images: {:.2f} %'.format(100 * correct / total)) # 测试模型 test(model, test_loader) ``` 以上就是使用PyTorch训练MNIST数据集上的卷积神经网络的完整代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值