一、pytorch环境配置及安装
Anaconda中文大蟒蛇,是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。
Windows安装Anaconda
选择python3.8,进入Anaconda Installers and Packages
选择Anaconda3-5.2.0-windows-x86.64.exe(可下最新版),跳过安装vscode,
在开始菜单打开Anaconda Prompt,如果出现(base)则安装成功
Linux安装Anaconda
apt-get install -y wget(Debian/Ubuntu系统)
yum install wget -y(CentOS系统)
wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
chmod +x Anaconda3-2024.02-1-Linux-x86_64.sh
./Anaconda3-2024.02-1-Linux-x86_64.sh
然后敲击ENTER,输入yes,敲击ENTER,输入yes,conda -V
检查是否安装成功
WIndows任务管理器检查显卡驱动,以下是常用命令:
conda create -n pytorch python=3.8(正常创建,已经有了同名的可以直接覆盖)
conda env create -f environment.yml(根据配置文件创建)
pip install -r requirements.txt(根据文本文件下载包)
conda info -e/conda env list(显示环境信息)
conda activate pytorch(激活环境)
conda list/pip list(不会显示关联环境的包)
pip freeze > requirements.txt(导出当前环境的包)
conda deactivate
conda remove -n pytorch --all/conda env remove -n pytorch(删除环境)
安装pytorch,进入首页https://pytorch.org/,推荐稳定版(Stable),
因为1.1以上加入了tensorboad,windows下选择conda,linux下选择pip,语言选择python3.8(视频当时的选择,现在更新了)
系统信息看不到gpu型号,控制面板->设备管理器->显示适配器查看,有英伟达显卡选择cuda11.8,集显选择none,复制安装命令
(视频当时版本)conda install pytorch torchvision cudatoolkit=9.2 -c pytorch -c defaults -c numba/label/dev
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
注意:cuda版本要和pytorch版本对应,否则torch.cuda.is_available()会False
进入https://www.geforce.com/hardware/technology/cuda/supported-gpu查看你的英伟达显卡是否支持cuda
输入nvidia-smi
,cuda9.2以上需要驱动版本大于396.26,可以电脑管家或英伟达官网下载驱动
如果下载慢,把pytorch和cuda的包复制到conda的安装目录下的pkgs再输入命令
终端输入python进入python环境,
import torch
torch.cuda.is_available()
二、python编辑器选择、安装及配置
两种编辑器:pycharm下载社区版,jupyter可以交互
pycharm安装:选择不导入设置,跳过插件,创建新项目,编译器选择已存在,左边选择conda环境,右边选择pytorch路径下的python.exe
python console也可以输入指令检测是否成功导入conda的环境:
import torch
torch.cuda.is_available()
安装anaconda同时已经安装jupyter了,但是默认只安装在base环境,但是base环境没有安装pytorch,没有办法使用pytorch
两种解决方式,第一种base环境安装pytorch,另一种方式pytorch环境安装jupyter,我们选择第二种
jupyter需要ipykernel包,开始菜单点击jupyter notebook,base环境里conda list中有ipykernel
进入pytorch环境,conda install nb_conda,装不上换成conda install nb_conda_kernels
安装完成后在pytorch环境输入jupyter notebook,点击new,选择conda环境的pytorch,用命令torch.cuda.is_available()
验证,shift+enter跳转到下一个代码块并且运行
三、FAQ
任务管理器或显示适配器查看gpu型号,进入https://www.geforce.com/hardware/technology/cuda/supported-gpu,查看是否支持cuda
输入nvidia-smi查看驱动版本是否大于396.26,软件管家升级或官网下载驱动
下载太慢,复制两个包,还是太慢需要特定指令让cuda使用本地文件安装,conda install --use-local 那两个包,输入两次,可以试着早上下载安装更快
四、python学习中两大法宝函数
两个函数大法宝,dir()打开,help()说明,是官方解释文档
打开pycharm选择项目文件夹,右下角有标记的是被用作pycharm的项目地址,选择的编译器python.exe现在变成.bat了
输入dir(torch.cuda)
,前后出现__表示它是函数,用help(torch.cuda.available)了解其含义
五、pycharm与jupyter使用和对比
设置>项目>项目解释器可以看到我们的python和pytorch版本,
添加配置,选择python,选择脚本位置,确定,或者右键运行会弹出要求配置
python文件≠python控制台≠jupyter,shift enter可以切换行块
python文件,优:通用,传播方便,适用于大型项目;缺:需要从头运行
python控制台,优:显示每个变量属性;缺:不利于代码阅读及修改
jupyter,优:利于代码阅读及修改;缺:环境需要配置
六、pytorch加载数据初识
Dataset:提供一种方式去获取数据及其标签label
dataloader:为后面的网络提供不同的数据形式
imageFolder放入Dataset(可选,好处是可以调用self.images = root.imgs),dataset放入DataLoader,dataLoader放入data_prefetcher(可选,实际上self.path[index % self.size] # make sure index is within then range)
七、Dataset类实战
Pycharm中terminal报错时,设置>工具>终端里改成cmd
pip install opencv-python下载cv2
继承Dataset类重写的__len__可以相加
八九、TensorBoard的使用
pytorch1.1加入Tensorboard,重名tag可以删除logs下文件重新在终端运行tensorboard
pip install tensorboard
terminal或anaconda Prompt输入
tensorboard --logdir=logs(事件文件所在文件名) --port=6007
tensorboard的add_image()参数为torch.tensor或numpy.array
np.array(img_PIL),PIL类型转换为numpy类型
十十一、Transforms的使用
transforms.ToTensor()可以将PIL.Image或numpy.ndarray转化为tensor类型
为什么需要tensor类型?tensor数据类型包装了反向神经网络所需要的一些参数
pip install opencv-python下载cv2
PIL.Image | numpy.ndarray | torch.Tensor | |
---|---|---|---|
读取图片 | Image.open() | cv2.imread() | / |
显示图片 | img.show() | cv2.imshow() | tensorboard的add_image() |
保存图片 | img.save() | cv2.imwrite() | torchvision.utils.save_image() |
获取尺寸 | 未知 | numpy.shape | tensor.size() / tensor.shape |
转换 | transform = transforms.ToPILImage() img_pil = transform(numpy/tensor) | tensor.numpy() | transform = transforms.ToTensor() img_tensor = transform(PIL/numpy) |
axis | 未知 | (高,宽,通道) | (通道,高,宽) |
取值 | [0, 255] | 读取时[0, 255]可变 | [0, 1] |
十二十三、常见的transforms
transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
归一化:给每个通道平均值和标准差
compose,totensor,Normalize,Resize,RandomCrop,也可以放进自己定义的类哦!
transforms.Resize(),一般是元组,也可以是一个数,进行等比缩放,不改变高和宽的比例
transforms.RandomCrop(),两个数是高和宽,一个数裁剪的是正方形
不知道返回类型的时候print(type(x))
十四、torchvision
pytorch官网pytorch.org中,Docs下有核心、语音、文本、图像
torchvision中,有dataset,models(可以指定预训练的权重),transforms,utils(内有tensorboard)
Dataset模块:CocoDetection用于目标检测,CocoCaptions用于语义分割,MINST手写数字,CIFAR10/100物体识别
推荐download=True,已经下载了也不会重复下载
下载比较慢,将下载链接放在迅雷中,下载完复制到dataset文件夹当中,运行时会使用已下载的
若运行时未显示下载链接,ctrl点进源码,复制url即可
十五、Dataloader
num_workers加载数据进程数,=0为一个主进程,windows下>0可能会有问题
torchvision.datasets.ImageFolder
可以处理包含子目录下图片的根目录。它会自动识别根目录下的子目录,并将每个子目录视为一个类别,其中的图片文件作为该类别的样本。
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 定义数据变换
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor()
])
# 创建 ImageFolder 数据集
dataset = datasets.ImageFolder(root='root', transform=transform)
# 创建 DataLoader
dataloader = DataLoader(dataset, batch_size=1, shuffle=False)
# 遍历所有图片路径和对应的类别
for img_path, label in dataloader.dataset.imgs:
print(img_path, label)
十六、神经网络的基本骨架nn.Module的使用
container中torch.nn.Module是所有神经网络基本骨架,需要重写__init__
和forward(前向传播)函数
因为继承的nn.Module中forword方法是__call__()
方法的实现,调用对象会调用__call__()
方法
调试时:单步执行自己代码会在自己写的代码中跳转而不会进入源码
十七、土堆说卷积操作
convolution卷积,conv2d表示二维
torch.nn是torch.nn.functional的封装
weight卷积核,bias偏置,stride步长,padding填充,group是分组卷积,对不同的通道使用不同的卷积核,言外之意一般是对每个通道使用相同卷积核
ctrl+p快速查看函数所需参数
十八、神经网络-卷积层
除了conv2d外,其他很少使用
dilation空洞卷积(指卷积核是空洞的),padding_mode填充方式
卷积核不用指定,随机初始化,训练时更新,卷积核的数值是从分布当中进行采样得到的
out_channel等于in_channel两倍时初始化两个卷积核,比如rgb是三个通道
output = torch.reshape(output, (-1, 3, 30, 30))中-1的值为总元素个数除以其他维度值相乘
ILSVRC比赛,2012年AlexNet,2014年GoogLeNet,VGG(常用vgg16),2015年ResNet
padding,stride参数可以根据官网的Hout,Wout公式推算
十九、神经网络-最大池化的使用
nn.MaxPool2d最大池化(下采样,最常用),nn.MaxUnpool2d(上采样),平均池化,nn.AdaptiveMaxPool2d(自适应最大池化)
ceil_mode=True表示进位,默认False,写论文会用到公式可以在官网查阅
若报错RuntimeError:“max_pool2d_with_indices_cpu” not implemented for Long,在tensor中加dtype=torch.float32
最大池化的作用:保留输入的特征,同时把数据量减少,比如视频变720P
卷积-池化-非线性激活
二十、神经网络-非线性激活
Padding Layers这一类几乎用不到,比如nn.ZeroPad2d在周围用0来填充,nn.ConstantPad2d用常数来填充
非线性激活的作用:神经网络中引入非线性的特质,才能训练出符合各种特征的模型
nn.ReLU()小于0进行截断,大于0不变,nn.Sigmoid非线性缩放到[0,1],1/1+exp-x,官网有图像
inplace=True表示把原来的值也改变(本来是通过返回值获取值)
二十一、神经网络-线性层及其他层介绍
Normalization Layers正则化层:加快神经网络的训练速度
nn.BatchNorm2d,num_feature即channel,其他默认即可
Recurrent Layers用于文字识别,特定的网络结构,用的不多
Transformer Layers特定的网络结构,用的不多,后面讲解
Linear Layers线性层:用的较多即全连接层,g=Σk*x+b,in_feature是x的个数,out_feature是g的个数,k是weight,b是bias
Dropout Layers随机将一些数设为0,防止过拟合
Sparse Layers特定的网络结构,用的不多,其中的Embedding用于自然语言处理
Distance Functions计算两个值之间的误差,常用余弦相似度,官网有公式
Loss Functions损失函数,常用值nn.MSELoss,nn.CrossEntropyLoss,nn.BCELoss,分布nn.NLLLoss,nn.KLDivLoss
torch.flatten()把输入展成一行,与reshape不同
container.sequential之后讲,torchvision.models提供了很多网络结构,有分类、语义分割、目标检测、实例分割、人体结构检测,文字和语音也有
二十二、神经网络-搭建小实战和Sequential的使用
torch.ones((64, 3, 32, 32))表示全1张量,可以对网络结构进行检验
writer.add_gragh()查看计算图,tensorboard --logdir=logs_seq,没必要使用graphviz+torchviz太麻烦
二十三、损失函数与反向传播
1.计算实际输出和目标之间的差距
2.为我们更新输出提供一定的依据(反向传播)
torch.nn.L1Loss(),绝对值∣x**n−y**n∣,if reduction=‘mean’;if reduction=‘sum’.
torch.nn.MSELoss(),均方差(x**n−y**n)2,if reduction=‘mean’;if reduction=‘sum’.
torch.nn.CrossEntropyLoss(),交叉熵(可能公式有变化),官网都有介绍,It is useful when training a classification problem with C classes.ouput是每个分类的概率
如果你看过一点机器学习的推导的话,优化器会有一个优化函数,那个函数你可以定性的理解为最小二乘,不同的优化函数对应不同的损失函数,mse是比较经典用于回归的损失函数,交叉熵常用于分类的损失函数
gradient descent梯度下降,没有result_loss.backward()的话查看梯度是None
二十四、优化器
optim.SGD()是pytorch中的随机梯度下降优化器
optim.zero_grad()把上一步的梯度清零,否则会累加
lr学习率,太大不稳定,太小收敛慢
optimizer.step()会对weight参数进行更新
二十五、现有网络模型的使用及修改
torchvision.models有分类、语义分割、目标检测,这节课讲分类模型
最常用vgg16,vgg19,pretrained表示训练好了,数据集用ImageNet,scipy一般都安装好了,pip install scipy
RuntimeError: The dataset is no longer publicly accessible. You need to download the archives externally and place them in the root directory.百度数据集链接复制到迅雷,ImageNet训练集150G太大了放弃了
print打印发现ImageNet线性层最后1000个,查了www.image-net.org官网确实是1000个类别,一般用ILSVRC2012,要学校邮箱注册
对vgg16现有网络进行修改迁移学习,比如再添加(1000,10)的线性层
.classifier.add_module(sequential/一个层),=直接修改
二十六、网络模型的保存与读取
保存了网络模型的结构和参数
import torch
import torch.nn as nn
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 5)
def forward(self, x):
return self.fc(x)
# 创建模型实例
model = SimpleModel()
# 保存整个模型
torch.save(model, 'full_model.pth')
# 加载整个模型
loaded_model = torch.load('full_model.pth')
# 可以继续使用加载的模型进行预测等操作
vgg16.state_dict()保存了网络模型的参数,字典形式,相比全部略小,因为大的就是参数
加载时候要把模型定义给复制过来,否则会报错,也可以from %定义模型的文件% import *
import torch
import torch.nn as nn
# 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 5)
def forward(self, x):
return self.fc(x)
# 创建模型实例
model = SimpleModel()
# 保存模型权重
torch.save(model.state_dict(), 'model_weights.pth')
# 加载模型权重
loaded_model = SimpleModel()
loaded_model.load_state_dict(torch.load('model_weights.pth'))
# 确保模型和加载的权重一致
loaded_model.eval()
# 可以继续使用加载的模型进行预测等操作
注意:直接loaded_model = torch.load(‘full_model.pth’)不行,出现No module named ‘model’,改用第二种方式
二十七二十八二十九、完整的模型训练套路
loss.item()加item()没差别,tensor加item()有差别打印可以输出数值
with torch.no_grad()里的代码梯度没有了,因为只需要测试,不需要反传梯度
训练完每一轮查看验证集的所有损失,下面是CPU运行输出结果:
D:\ProgramData\anaconda3\envs\pytorch\python.exe D:\University\nbuProject\exercise\pytorch_exercise\src\train.py
Files already downloaded and verified
Files already downloaded and verified
训练数据集的长度为:50000
测试数据集的长度为:10000
-------第 1 轮训练开始-------
训练次数:100, Loss: 2.2815933227539062
训练次数:200, Loss: 2.271535873413086
训练次数:300, Loss: 2.212886095046997
训练次数:400, Loss: 2.1286516189575195
训练次数:500, Loss: 2.0074424743652344
训练次数:600, Loss: 1.9723464250564575
训练次数:700, Loss: 1.9965126514434814
整体测试集上的Loss: 310.2758778333664
整体测试集上的正确率: 0.2930999994277954
-------第 10 轮训练开始-------
训练次数:7100, Loss: 1.2701085805892944
训练次数:7200, Loss: 1.0269969701766968
训练次数:7300, Loss: 1.1585915088653564
训练次数:7400, Loss: 0.8122000098228455
训练次数:7500, Loss: 1.2483134269714355
训练次数:7600, Loss: 1.2678707838058472
训练次数:7700, Loss: 0.8957886099815369
训练次数:7800, Loss: 1.241050362586975
整体测试集上的Loss: 199.04056721925735
整体测试集上的正确率: 0.5478000044822693
进程已结束,退出代码0
正确率是分类问题比较特有的指标,tensorboard --logdir=logs_train
.argmax(1)表示横向,.argmax(0)表示纵向,输出:tensor([1,1, …])
(outputs.argmax(1) == targets)输出:tensor([False, True, …])
tudui.train()设置成训练模式(可选)
tudui.eval()设置成测试模式(可选)仅对一部分网络层有作用, 如Dropout、BatchNorm层
三十、利用GPU训练
可以.cuda()的部分:网络模型不需要赋值,损失函数不需要赋值,训练数据和测试数据imgs和target需要赋值
最好加上if torch.cuda.is_available():
可以使用如下代码对比CPU和GPU花费时间
start_time = time.time()
end_time = time.time()
print(end_time - start_time)
可以上https://colab.research.google.com使用谷歌的GPU,新建笔记本,输入以下内容:
import torch
print(torch._version__)
1.8.1+cu101
print(torch.cuda.is_available( ) )
False
发现不能使用GPU,点击修改>笔记本设置,硬件加速器选择GPU,每周可以免费使用30个小时,把训练代码复制过去
在python控制台或jupyter,运行在terminal需要加感叹号!nvidia-smi
第二种方式更常用,调用.to(device)
device = torch.device("cpu”)
Torch.device("cuda”)
Torch.device(“cuda:0”)(第一张显卡)
Torch.device(“cuda:1”)(第二张显卡)
可以使用语法糖device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
我的3070Ti laptop运行结果:
D:\ProgramData\anaconda3\envs\pytorch\python.exe D:\University\nbuProject\exercise\pytorch_exercise\src\train.py
Files already downloaded and verified
Files already downloaded and verified
训练数据集的长度为:50000
测试数据集的长度为:10000
-------第 1 轮训练开始-------
训练次数:100, Loss: 2.289776563644409
训练次数:200, Loss: 2.2781457901000977
训练次数:300, Loss: 2.254847288131714
训练次数:400, Loss: 2.165113925933838
训练次数:500, Loss: 2.0603878498077393
训练次数:600, Loss: 2.035789966583252
训练次数:700, Loss: 2.0222959518432617
整体测试集上的Loss: 313.6828167438507
整体测试集上的正确率: 0.2806999981403351
-------第 10 轮训练开始-------
训练次数:7100, Loss: 1.2535332441329956
训练次数:7200, Loss: 0.9512690901756287
训练次数:7300, Loss: 1.1327733993530273
训练次数:7400, Loss: 0.8513917326927185
训练次数:7500, Loss: 1.2785077095031738
训练次数:7600, Loss: 1.183182954788208
训练次数:7700, Loss: 0.8764308094978333
训练次数:7800, Loss: 1.2747230529785156
整体测试集上的Loss: 194.28636491298676
整体测试集上的正确率: 0.5598999857902527
进程已结束,退出代码0
三十二、完整的模型验证套路
因为png格式是四个通道,处理RGB三通道外,还有一个透明度通道,所以需要调用image = image.convert(‘RGB’),保留其颜色通道,因为模型输入是三个通道,当然如果图片本来就是三个颜色通道,经过此操作不变,加上这一步后,可以适应png jpg各种格式图片,小土堆可以运行是因为不同截图软件保留的通道数是不一样的。
image = torch.reshape(image, (1, 3, 32, 32))网络输入需要batch_size需要reshape或者unsqeeze(0)
如果model.eval()有dropout或者batchnorm不加会出问题
with torch.no_grad():可以节约一些内存和性能,使用 with 语句可以确保在代码块执行完毕后,上下文管理器会被正确地清理掉
model = torch.load(model_path, map_location=torch.device('cpu'))
表示在GPU上保存的模型加载到CPU
print(output.argmax(1))将输出转化成利于解决的方式
三十三、看看开源项目
github搜索pytorch,筛选star最多的
看一个CycleGAN项目,代码后面都有注释
运行python指令!./ scripts/train_cyclegan.sh
python train.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan
参数可以在参数列表找到,或在父类中寻找
参考:https://www.bilibili.com/video/BV1hE411t7RN
无废话解决实战中报错
提示:github拉下来的项目报错,在issue中搜索关键词
1. 所有conda环境都使用一个地方的包
Conda的虚拟环境应该使用对应虚拟环境中的包,通过which pip
发现其位置在~/.local/bin/pip
而非/usr/anaconda3/bin/pip
解决方案:在~/.profile
或/etc/profile
中,在~/.local/bin
后面设置PATH="/usr/anaconda3/bin:$PATH"
2.tensorboard运行后报错:Failed to fetch runs
搜了网上包括CSDN很多解决方案都没有用,要注意:
日志报错:TypeError: MessageToJson() got an unexpected keyword argument ‘including_default_value_fields’
解决方案是在对应环境下pip install protobuf==4.25.3
3.torch.cuda.OutOfMemoryError: CUDA out of memory.
一般情况就是爆显存了,通过减小batch_size或输入图片尺寸来减小计算图。
还有一种情况就是ctrl+z关闭的程序其实进程没有结束,应当ctrl+c。操作如下关闭进程:
nvidia-smi
- 在看板的下方你会看到正在GPU上通过python指令运行的进程
- 查看它们的PID
- 删除这些进程
kill -9 %PID_number%
4.vscode终端显示两个环境名
vscode python插件自动激活环境和服务器终端初始化自动激活base环境之间的不兼容导致的问题,解决方法是关闭conda的自动激活环境:
conda config --set auto_activate_base False
5.vscode远程plt.show()无法显示
右键>在交互窗口中运行
6.NVIDIA GeForce RTX 4090 with CUDA capability sm_89 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_61 sm_70 sm_75 compute_37.
If you want to use the NVIDIA GeForce RTX 4090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
显卡架构(sm_89)较新,旧版pytorch库不支持。
解决办法:conda remove pytorch
,再输入上方链接的命令。
提示:环境的pytorch版本不影响代码和程序。
7.visdom遇到问题ERROR:tornado.access:500 GET / (::1) 2.10ms
pip uninstall visdom
并用conda下载包
https://anaconda.org/conda-forge/visdom
8.wandb无法在Media输出键带’id’的图片
应该是出于安全原因,替换掉id即可
9.ImportError: DLL load failed while importing _imaging: 找不到指定的模块。
不建议使用windows,建议使用linux跑程序,windows经常会出现此类错误,linux不会出现此类错误,想在windows解决这个很麻烦
10.conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia运行后报错Collecting package metadata (current_repodata.json): | WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.7.1., but conda is ignoring the . and treating it as 1.7.1
done
Solving environment: unsuccessful initial attempt using frozen solve. Retrying with flexible solve.
Solving environment: unsuccessful attempt using repodata from current_repodata.json, retrying with next repodata source.
Collecting package metadata (repodata.json): | WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.9.0., but conda is ignoring the . and treating it as 1.9.0
WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.8.0., but conda is ignoring the . and treating it as 1.8.0
WARNING conda.models.version:get_matcher(556): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda. Your spec was 1.6.0., but conda is ignoring the . and treating it as 1.6.0
conda config --remove-key channels
11.ERROR: Could not find a version that satisfies the requirement tensorflow==1.13.1
(from versions: 2.2.0, 2.2.1, 2.2.2, 2.2.3, 2.3.0, 2.3.1, 2.3.2, 2.3.3, 2.3.4, 2.4.0, 2.4.1, 2.4.2, 2.4.3, 2.4.4, 2.5.0, 2.5.1, 2.5.2, 2.5.3, 2.6.0rc0, 2.6.0rc1, 2.6.0rc2, 2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.7.0rc0, 2.7.0rc1, 2.7.0, 2.7.1, 2.7.2, 2.7.3, 2.7.4, 2.8.0rc0, 2.8.0rc1, 2.8.0, 2.8.1, 2.8.2, 2.8.3, 2.8.4, 2.9.0rc0, 2.9.0rc1, 2.9.0rc2, 2.9.0, 2.9.1, 2.9.2, 2.9.3, 2.10.0rc0, 2.10.0rc1, 2.10.0rc2, 2.10.0rc3, 2.10.0, 2.10.1, 2.11.0rc0, 2.11.0rc1, 2.11.0rc2, 2.11.0, 2.11.1, 2.12.0rc0, 2.12.0rc1, 2.12.0, 2.12.1, 2.13.0rc0, 2.13.0rc1, 2.13.0rc2, 2.13.0, 2.13.1)
ERROR: No matching distribution found for tensorflow==1.13.1
使用python3.8创建conda环境没有1.13.1版本的tensorflow,降低python版本即可:
conda create -n tf37 python=3.7