logits = tf.concat(logits,0)

本文详细解析了TensorFlow中tf.concat函数的使用方法,包括如何通过设置axis参数实现不同维度的数据拼接,提供了具体的代码示例和运行结果,帮助读者深入理解tf.concat函数的功能及其应用场景。
部署运行你感兴趣的模型镜像

logits = tf.concat(logits,0)

logits = tf.concat(logits,0)
tf.concat([tensor1,tensor2,tensor3,…],axis)
axis=0 低维度拼接,去掉外面的括号
axis=1 高维度拼接,去掉里面的括号

eg:
t1=[[1,2,3],[4,5,6]]
t2=[[7,8,9],[10,11,12]]
tf.concat([t1,t2],0) #[[1,2,3],[4,5,6],[7.8.9],[10.11.12]]
tf.concat([t1,t2],1) #[[1,2,3,7,8,9],[4,5,6,10,11,12]]

tf.expand_dims(input,axis=None,name=None,dim=None)
表示在第axis位置增加一个维度

列表[] ----里面的元素可以是任意类型
元组() ----包起来的不可更改的有序数列,元组的元素不可变
字典{} ----无序的序列,每一项都是键值对(key,value)

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

import torch from torchvision import transforms from torchvision import datasets from torch.utils.data import DataLoader import torch.nn.functional as F import torch.optim as optim from Logist import optimizer, criterion from duofenlei import test_loader in_channels, out_channels = 5, 10#输入图片通道5,输出图片通道10 width, height = 100, 100#输入图片宽和高为100 kernel_size = 3#卷积层宽和高是3 batch_size = 1#分批次处理,一次处理一个通道的图像 input = torch.randn(batch_size,in_channels,width,height) conv_layer = torch.nn.Conv2d(in_channels,out_channels,kernel_size = kernel_size) output = conv_layer(input) train_dataset = input train_loader = DataLoader(train_dataset,shuffle=True,batch_size=batch_size) print(input.shape) print(output.shape) print(conv_layer.weight.shape) class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = torch.nn.Conv2d(1,10,kernel_size=5) self.conv2 = torch.nn.Conv2d(10,20,kernel_size=5) self.pooling = torch.nn.MaxPool2d(2)#上采样 self.fc = torch.nn.Linear(320,10) def forward(self,x): batch_size = x.size(0) x = F.relu(self.pooling(self.conl1(x))) x = F.relu(self.pooling(self.conl2(x))) x = x.view(batch_size,-1) x = self.fc(x) return x model = Net() device = torch.device('cuda:0' if torch.cuda.is_available() else "cpu") model.to(device) def train(epoch): running_loss = 0.0 for batch_idx, data in enumerate(train_loader, 0): inputs,target = data inputs,target = inputs.to(device), target.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, target) loss.backward() optimizer.step() running_loss += loss.item() if batch_idx % 300 == 299: print('[%d , %5d] loss: %.3f' %(epoch+1,batch_idx+1,running_loss/2000)) running_loss = 0.0 def test(): correct = 0 total = 0 with torch.no_grad(): for data in test_loader: inputs, target = data inputs,target = inputs.to(device), target.to(device) outputs = model(inputs) _,predicted = torch.max(outputs.data, dim = 1) total += target.size(0) correct += (predicted == target).sum().item() print('Accuracy on test set: %d %% [%d %d]' % (100*correct/total, correct, total))帮我运行一段这个代码
最新发布
09-26
import json import gzip # 打印并观察数据集分布情况 train_set, dev_set, test_set = json.load(gzip.open('./mnist.json.gz')) train_images, train_labels = train_set[0][:1000], train_set[1][:1000] dev_images, dev_labels = dev_set[0][:200], dev_set[1][:200] test_images, test_labels = test_set[0][:200], test_set[1][:200] train_set, dev_set, test_set = [train_images, train_labels], [dev_images, dev_labels], [test_images, test_labels] print('Length of train/dev/test set:{}/{}/{}'.format(len(train_set[0]), len(dev_set[0]), len(test_set[0]))) image, label = train_set[0][0], train_set[1][0] image, label = np.array(image).astype('float32'), int(label) # 原始图像数据为长度784的行向量,需要调整为[28,28]大小的图像 image = np.reshape(image, [28,28]) image = Image.fromarray(image.astype('uint8'), mode='L') print("The number in the picture is {}".format(label)) plt.figure(figsize=(5, 5)) plt.imshow(image) plt.savefig('conv-number5.pdf') from paddle.vision.transforms import Compose, Resize, Normalize # 数据预处理 transforms = Compose([Resize(32), Normalize(mean=[127.5], std=[127.5], data_format='CHW')]) import random import paddle.io as io class MNIST_dataset(io.Dataset): def __init__(self, dataset, transforms, mode='train'): self.mode = mode self.transforms =transforms self.dataset = dataset def __getitem__(self, idx): # 获取图像和标签 image, label = self.dataset[0][idx], self.dataset[1][idx] image, label = np.array(image).astype('float32'), int(label) image = np.reshape(image, [28,28]) image = Image.fromarray(image.astype('uint8'), mode='L') image = self.transforms(image) return image, label def __len__(self): return len(self.dataset[0]) # 固定随机种子 random.seed(0) # 加载 mnist 数据集 train_dataset = MNIST_dataset(dataset=train_set, transforms=transforms, mode='train') test_dataset = MNIST_dataset(dataset=test_set, transforms=transforms, mode='test') dev_dataset = MNIST_dataset(dataset=dev_set, transforms=transforms, mode='dev') import paddle.nn.functional as F class Model_LeNet(nn.Layer): def __init__(self, in_channels, num_classes=10): super(Model_LeNet, self).__init__() # 卷积层:输出通道数为6,卷积核大小为5×5 self.conv1 = Conv2D(in_channels=in_channels, out_channels=6, kernel_size=5, weight_attr=paddle.ParamAttr()) # 汇聚层:汇聚窗口为2×2,步长为2 self.pool2 = Pool2D(size=(2,2), mode='max', stride=2) # 卷积层:输入通道数为6,输出通道数为16,卷积核大小为5×5,步长为1 self.conv3 = Conv2D(in_channels=6, out_channels=16, kernel_size=5, stride=1, weight_attr=paddle.ParamAttr()) # 汇聚层:汇聚窗口为2×2,步长为2 self.pool4 = Pool2D(size=(2,2), mode='avg', stride=2) # 卷积层:输入通道数为16,输出通道数为120,卷积核大小为5×5 self.conv5 = Conv2D(in_channels=16, out_channels=120, kernel_size=5, stride=1, weight_attr=paddle.ParamAttr()) # 全连接层:输入神经元为120,输出神经元为84 self.linear6 = nn.Linear(120, 84) # 全连接层:输入神经元为84,输出神经元为类别数 self.linear7 = nn.Linear(84, num_classes) def forward(self, x): # C1:卷积层+激活函数 output = F.relu(self.conv1(x)) # S2:汇聚层 output = self.pool2(output) # C3:卷积层+激活函数 output = F.relu(self.conv3(output)) # S4:汇聚层 output = self.pool4(output) # C5:卷积层+激活函数 output = F.relu(self.conv5(output)) # 输入层将数据拉平[B,C,H,W] -> [B,CxHxW] output = paddle.squeeze(output, axis=[2,3]) # F6:全连接层 output = F.relu(self.linear6(output)) # F7:全连接层 output = self.linear7(output) return output # 这里用np.random创建一个随机数组作为输入数据 inputs = np.random.randn(*[1,1,32,32]) inputs = inputs.astype('float32') # 创建Model_LeNet类的实例,指定模型名称和分类的类别数目 model = Model_LeNet(in_channels=1, num_classes=10) # 通过调用LeNet从基类继承的sublayers()函数,查看LeNet中所包含的子层 print(model.sublayers()) x = paddle.to_tensor(inputs) for item in model.sublayers(): # item是LeNet类中的一个子层 # 查看经过子层之后的输出数据形状 try: x = item(x) except: # 如果是最后一个卷积层输出,需要展平后才可以送入全连接层 x = paddle.reshape(x, [x.shape[0], -1]) x = item(x) if len(item.parameters())==2: # 查看卷积和全连接层的数据和参数的形状, # 其中item.parameters()[0]是权重参数w,item.parameters()[1]是偏置参数b print(item.full_name(), x.shape, item.parameters()[0].shape, item.parameters()[1].shape) else: # 汇聚层没有参数 print(item.full_name(), x.shape) class Paddle_LeNet(nn.Layer): def __init__(self, in_channels, num_classes=10): super(Paddle_LeNet, self).__init__() # 卷积层:输出通道数为6,卷积核大小为5*5 self.conv1 = nn.Conv2D(in_channels=in_channels, out_channels=6, kernel_size=5) # 汇聚层:汇聚窗口为2*2,步长为2 self.pool2 = nn.MaxPool2D(kernel_size=2, stride=2) # 卷积层:输入通道数为6,输出通道数为16,卷积核大小为5*5 self.conv3 = nn.Conv2D(in_channels=6, out_channels=16, kernel_size=5) # 汇聚层:汇聚窗口为2*2,步长为2 self.pool4 = nn.AvgPool2D(kernel_size=2, stride=2) # 卷积层:输入通道数为16,输出通道数为120,卷积核大小为5*5 self.conv5 = nn.Conv2D(in_channels=16, out_channels=120, kernel_size=5) # 全连接层:输入神经元为120,输出神经元为84 self.linear6 = nn.Linear(in_features=120, out_features=84) # 全连接层:输入神经元为84,输出神经元为类别数 self.linear7 = nn.Linear(in_features=84, out_features=num_classes) def forward(self, x): # C1:卷积层+激活函数 output = F.relu(self.conv1(x)) # S2:汇聚层 output = self.pool2(output) # C3:卷积层+激活函数 output = F.relu(self.conv3(output)) # S4:汇聚层 output = self.pool4(output) # C5:卷积层+激活函数 output = F.relu(self.conv5(output)) # 输入层将数据拉平[B,C,H,W] -> [B,CxHxW] output = paddle.squeeze(output, axis=[2,3]) # F6:全连接层 output = F.relu(self.linear6(output)) # F7:全连接层 output = self.linear7(output) return output import time # 这里用np.random创建一个随机数组作为测试数据 inputs = np.random.randn(*[1,1,32,32]) inputs = inputs.astype('float32') x = paddle.to_tensor(inputs) # 创建Model_LeNet类的实例,指定模型名称和分类的类别数目 model = Model_LeNet(in_channels=1, num_classes=10) # 创建Paddle_LeNet类的实例,指定模型名称和分类的类别数目 paddle_model = Paddle_LeNet(in_channels=1, num_classes=10) # 计算Model_LeNet类的运算速度 model_time = 0 for i in range(60): strat_time = time.time() out = model(x) end_time = time.time() # 预热10次运算,不计入最终速度统计 if i < 10: continue model_time += (end_time - strat_time) avg_model_time = model_time / 50 print('Model_LeNet speed:', avg_model_time, 's') # 计算Paddle_LeNet类的运算速度 paddle_model_time = 0 for i in range(60): strat_time = time.time() paddle_out = paddle_model(x) end_time = time.time() # 预热10次运算,不计入最终速度统计 if i < 10: continue paddle_model_time += (end_time - strat_time) avg_paddle_model_time = paddle_model_time / 50 print('Paddle_LeNet speed:', avg_paddle_model_time, 's') # 这里用np.random创建一个随机数组作为测试数据 inputs = np.random.randn(*[1,1,32,32]) inputs = inputs.astype('float32') x = paddle.to_tensor(inputs) # 创建Model_LeNet类的实例,指定模型名称和分类的类别数目 model = Model_LeNet(in_channels=1, num_classes=10) # 获取网络的权重 params = model.state_dict() # 自定义Conv2D算子的bias参数形状为[out_channels, 1] # paddle API中Conv2D算子的bias参数形状为[out_channels] # 需要进行调整后才可以赋值 for key in params: if 'bias' in key: params[key] = params[key].squeeze() # 创建Paddle_LeNet类的实例,指定模型名称和分类的类别数目 paddle_model = Paddle_LeNet(in_channels=1, num_classes=10) # 将Model_LeNet的权重参数赋予给Paddle_LeNet模型,保持两者一致 paddle_model.set_state_dict(params) # 打印结果保留小数点后6位 paddle.set_printoptions(6) # 计算Model_LeNet的结果 output = model(x) print('Model_LeNet output: ', output) # 计算Paddle_LeNet的结果 paddle_output = paddle_model(x) print('Paddle_LeNet output: ', paddle_output) model = Paddle_LeNet(in_channels=1, num_classes=10) params_info = paddle.summary(model, (1, 1, 32, 32)) print(params_info) FLOPs = paddle.flops(model, (1, 1, 32, 32), print_detail=True) print(FLOPs) import paddle.optimizer as opt from nndl import RunnerV3, metric paddle.seed(100) # 学习率大小 lr = 0.1 # 批次大小 batch_size = 64 # 加载数据 train_loader = io.DataLoader(train_dataset, batch_size=batch_size, shuffle=True) dev_loader = io.DataLoader(dev_dataset, batch_size=batch_size) test_loader = io.DataLoader(test_dataset, batch_size=batch_size) # 定义LeNet网络 # 自定义算子实现的LeNet-5 model = Model_LeNet(in_channels=1, num_classes=10) # 飞桨API实现的LeNet-5 # model = Paddle_LeNet(in_channels=1, num_classes=10) # 定义优化器 optimizer = opt.SGD(learning_rate=lr, parameters=model.parameters()) # 定义损失函数 loss_fn = F.cross_entropy # 定义评价指标 metric = metric.Accuracy(is_logist=True) # 实例化 RunnerV3 类,并传入训练配置。 runner = RunnerV3(model, optimizer, loss_fn, metric) # 启动训练 log_steps = 15 eval_steps = 15 runner.train(train_loader, dev_loader, num_epochs=5, log_steps=log_steps, eval_steps=eval_steps, save_path="best_model.pdparams") from nndl import plot_training_loss_acc plot_training_loss_acc(runner, 'cnn-loss1.pdf') # 加载最优模型 runner.load_model('best_model.pdparams') # 模型评价 score, loss = runner.evaluate(test_loader) print("[Test] accuracy/loss: {:.4f}/{:.4f}".format(score, loss)) # 获取测试集中第一条数据 X, label = next(test_loader()) logits = runner.predict(X) # 多分类,使用softmax计算预测概率 pred = F.softmax(logits) # 获取概率最大的类别 pred_class = paddle.argmax(pred[1]).numpy() label = label[1][0].numpy() # 输出真实类别与预测类别 print("The true category is {} and the predicted category is {}".format(label[0], pred_class[0])) # 可视化图片 plt.figure(figsize=(2, 2)) image, label = test_set[0][1], test_set[1][1] image= np.array(image).astype('float32') image = np.reshape(image, [28,28]) image = Image.fromarray(image.astype('uint8'), mode='L') plt.imshow(image) plt.savefig('cnn-number2.pdf')生成该实验思维导图方案设计 1. 数据准备:加载MNIST数据集,并进行预处理(调整大小、归一化)。 2. 构建LeNet-5模型:使用PaddlePaddle的nn.Layer构建模型。 3. 模型训练:使用训练集训练模型,使用验证集选择最佳模型。 4. 模型评估:在测试集上评估模型性能。 5. 可视化:展示训练过程中的损失和准确率变化,并可视化测试结果 关键步骤: 1. 数据预处理: 加载压缩的MNIST数据集(mnist.json.gz) 调整图像尺寸至32×32,归一化像素值到[-1, 1]范围 划分训练集(1000样本)、验证集(200样本)、测试集(200样本) 2. 模型构建: 自定义LeNet-5(Model_LeNet): 2个卷积层(5×5核)+ 2个池化层(MaxPool/AvgPool) 2个全连接层(120→84→10输出) Paddle官方LeNet-5(Paddle_LeNet): 使用paddle.nn内置API实现相同结构 3. 模型验证: 对比自定义与官方模型的运行速度(Model_LeNet更快) 检查权重一致性(调整bias维度后输出一致) 4. 模型训练: 优化器:SGD(学习率0.1) 损失函数:交叉熵损失(F.cross_entropy) 批次大小:64,训练轮次:5 评估指标:准确率(Accuracy) 5. 测试与可视化: 加载最优模型(best_model.pdparams) 测试集评估准确率/损失 可视化预测结果(如数字“2”的识别)
06-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值