使用PlotNeuralNet绘制深度学习网络图的基本操作(二)

news2024/11/19 12:53:37

使用PlotNeuralNet绘制深度学习网络图的基本操作(二)

接下来我们利用pycharm来绘制当中我们的神经网络模型架构,目标是直接将.tex文件生成为pdf和png。我在学习的过程中参考了一些学习视频,觉得这个up主讲的还不错:
1.PlotNeuralNet_1_环境搭建与演示
2.PlotNeuralNet_2_概览与优化
3.PlotNeuralNet_3_分析与自定义绘图(完结)
视频会教你如何使用和修改当中的很多函数,并且直接将模型生成.pdf文件,我这里还进行了一些配置可以用代码将.pdf文件直接转化成为.png,希望能给大家提供一些帮助。
要想将pdf转换成png,需要你到官网下载这个文件:Ghostscript releases,配置完成后,我们就可以进行绘图啦。
代码中都有注释,大家可以仔细看看。

1.cnn网络框架

import sys
import os
import subprocess
sys.path.append('../')
from pycore.tikzeng import *


# 定义神经网络架构
arch = [
    to_head('..'),
    to_cor(),
    to_begin(),
    # 输入图像的名字
    to_input("1.jpeg", to='(-5,0,0)', width=6, height=6, name="temp"),
    to_input("2.jpeg", to='(-4,0,0)', width=6, height=6, name="temp"),
    to_input("3.jpeg", to='(-3,0,0)', width=6, height=6, name="temp"),
    to_input("4.jpeg", to='(-2,0,0)', width=6, height=6, name="temp"),
    to_input("5.jpeg", to='(-1,0,0)', width=6, height=6, name="temp"),

    # 调用当中的函数绘画模型的内容
    to_Conv("conv1", s_filer=256, n_filer=3, offset="(0,0,0)", to="(0,0,0)", height=50, depth=50, width=3, caption='CONV1'),
    to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)", height=32, depth=32, width=3, caption="MaxPool1"),

    to_Conv("conv2", s_filer=63, n_filer=16, offset="(3,0,0)", to="(pool1-east)", height=32, depth=32, width=3, caption='CONV2'),
    to_connection("pool1", "conv2"),
    to_Pool("pool2", offset="(0,0,0)", to="(conv2-east)", height=16, depth=16, width=3, caption="MaxPool2"),

    to_Conv("conv3", s_filer=15, n_filer=64, offset="(3,0,0)", to="(pool2-east)", height=16, depth=16, width=3, caption='CONV3'),
    to_connection("pool2", "conv3"),
    to_Pool("pool3", offset="(0,0,0)", to="(conv3-east)", height=10, depth=10, width=3, caption="MaxPool3"),

    to_SoftMax(name='fc1', s_filer=64, offset="(4,0,0)", to="(pool3-east)", width=1.5, height=1.5, depth=100,
               opacity=0.8, caption='FC1'),
    to_connection("pool3", "fc1"),

    to_SoftMax(name='fc2', s_filer=10, offset="(2,0,0)", to="(fc1-east)", width=1.5, height=1.5, depth=50,
               opacity=0.8, caption='FC2'),
    to_connection("fc1", "fc2"),

    to_SoftMax(name='fc3', s_filer=5, offset="(2,0,0)", to="(fc2-east)", width=1.5, height=1.5, depth=5,
               opacity=0.8, caption='FC3'),
    to_connection("fc2", "fc3"),

    to_end()
]


def main():
    # 获取文件名
    namefile = str(sys.argv[0]).split('.')[0]

    # 转换成为.tex文件
    to_generate(arch, namefile + '.tex')

    # 使用 LaTeX 编译器将 .tex 文件转换为 .pdf 文件
    subprocess.call([r'D:\MiKTeX\install\miktex\bin\x64\pdflatex.exe', namefile + '.tex'])

    # 生成pdf
    pdf_file = namefile + '.pdf'
    # 生成png
    image_file = namefile + '.png'

    # 将pdf转化成为png
    subprocess.call([r'D:\ghostscript\gs10.01.1\bin\gswin64c.exe', '-sDEVICE=pngalpha', '-o', image_file, '-r300', pdf_file])

    # 删除中间生成的文件
    cleanup(namefile)


# 删除中间生成的文件
def cleanup(namefile):
    extensions = ['.aux', '.log', '.tex']
    for ext in extensions:
        filename = namefile + ext
        if os.path.exists(filename):
            os.remove(filename)


if __name__ == '__main__':
    main()

在这里插入图片描述

AlexNet网络框架

import sys
import os
import subprocess
sys.path.append('../')
from pycore.tikzeng import *


# 定义神经网络架构
arch = [
    to_head('..'),
    to_cor(),
    to_begin(),
    to_input("1.jpeg", to='(-5,0,0)', width=6, height=6, name="temp"),
    to_input("2.jpeg", to='(-4,0,0)', width=6, height=6, name="temp"),
    to_input("3.jpeg", to='(-3,0,0)', width=6, height=6, name="temp"),
    to_input("4.jpeg", to='(-2,0,0)', width=6, height=6, name="temp"),
    to_input("5.jpeg", to='(-1,0,0)', width=6, height=6, name="temp"),

    # s_filer表示该层的图像大小 (需要自己计算),n_filer表示输入通道和输出通道大小 (自己设定)
    to_Conv("conv1", s_filer=256, n_filer=3, offset="(0,0,0)", to="(0,0,0)", height=50, depth=50, width=3, caption='CONV1'),
    to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)", height=32, depth=32, width=3, caption="MaxPool1"),

    to_Conv("conv2", s_filer=63, n_filer=64, offset="(3,0,0)", to="(pool1-east)", height=32, depth=32, width=3, caption='CONV2'),
    to_connection("pool1", "conv2"),
    to_Pool("pool2", offset="(0,0,0)", to="(conv2-east)", height=16, depth=16, width=3, caption="MaxPool2"),

    to_Conv("conv3", s_filer=31, n_filer=192, offset="(3,0,0)", to="(pool2-east)", height=16, depth=16, width=3, caption='CONV3'),
    to_connection("pool2", "conv3"),

    to_Conv("conv4", s_filer=15, n_filer=384, offset="(3,0,0)", to="(conv3-east)", height=16, depth=16, width=3,caption='CONV4'),
    to_connection("conv3", "conv4"),

    to_Conv("conv5", s_filer=15, n_filer=256, offset="(3,0,0)", to="(conv4-east)", height=16, depth=16, width=3,caption='CONV5'),
    to_connection("conv4", "conv5"),
    to_Pool("pool3", offset="(0,0,0)", to="(conv5-east)", height=8, depth=8, width=3, caption="MaxPool3"),

    to_Pool("pool4", offset="(3,0,0)", to="(pool3-east)", height=6, depth=6, width=3, caption="AdaptiveAvgPool"),
    to_connection("pool3", "pool4"),

    to_SoftMax(name='fc1', s_filer=4096, offset="(3,0,0)", to="(pool4-east)", width=1.5, height=1.5, depth=100,
               opacity=0.8, caption='FC1'),
    to_connection("pool4", "fc1"),

    to_SoftMax(name='fc2', s_filer=4096, offset="(2,0,0)", to="(fc1-east)", width=1.5, height=1.5, depth=50,
               opacity=0.8, caption='FC2'),
    to_connection("fc1", "fc2"),

    to_SoftMax(name='fc3', s_filer=5, offset="(2,0,0)", to="(fc2-east)", width=1.5, height=1.5, depth=5,
               opacity=0.8, caption='FC3'),
    to_connection("fc2", "fc3"),

    to_end()
]


def main():
    namefile = str(sys.argv[0]).split('.')[0]
    to_generate(arch, namefile + '.tex')

    # 使用 LaTeX 编译器将 .tex 文件转换为 .pdf 文件
    subprocess.call([r'D:\MiKTeX\install\miktex\bin\x64\pdflatex.exe', namefile + '.tex'])

    pdf_file = namefile + '.pdf'
    image_file = namefile + '.png'

    subprocess.call([r'D:\ghostscript\gs10.01.1\bin\gswin64c.exe', '-sDEVICE=pngalpha', '-o', image_file, '-r300', pdf_file])

    # 删除中间生成的文件
    cleanup(namefile)


def cleanup(namefile):
    # 删除中间生成的文件
    extensions = ['.aux', '.log', '.tex']
    for ext in extensions:
        filename = namefile + ext
        if os.path.exists(filename):
            os.remove(filename)


if __name__ == '__main__':
    main()

在这里插入图片描述

3.VGG16网络框架

import sys
import os
import subprocess
sys.path.append('../')
from pycore.tikzeng import *


# 定义神经网络架构
arch = [
    to_head('..'),
    to_cor(),
    to_begin(),
    to_input("1.jpeg", to='(-5,0,0)', width=6, height=6, name="temp"),
    to_input("2.jpeg", to='(-4,0,0)', width=6, height=6, name="temp"),
    to_input("3.jpeg", to='(-3,0,0)', width=6, height=6, name="temp"),
    to_input("4.jpeg", to='(-2,0,0)', width=6, height=6, name="temp"),
    to_input("5.jpeg", to='(-1,0,0)', width=6, height=6, name="temp"),

    # s_filer表示该层的图像大小 (需要自己计算),n_filer表示输入通道和输出通道大小 (自己设定)
    to_Conv("conv1", s_filer=256, n_filer=3, offset="(0,0,0)", to="(0,0,0)", height=50, depth=50, width=3, caption='CONV1'),
    to_Conv("conv2", s_filer=256, n_filer=64, offset="(0,0,0)", to="(conv1-east)", height=50, depth=50, width=3, caption=''),
    to_Pool("pool1", offset="(0,0,0)", to="(conv2-east)", height=30, depth=30, width=3, caption=""),

    to_Conv("conv3", s_filer=128, n_filer=64, offset="(3,0,0)", to="(pool1-east)", height=30, depth=30, width=3,caption='CONV2'),
    to_connection("pool1", "conv3"),
    to_Conv("conv4", s_filer=128, n_filer=128, offset="(0,0,0)", to="(conv3-east)", height=30, depth=30, width=3,caption=''),
    to_Pool("pool2", offset="(0,0,0)", to="(conv4-east)", height=18, depth=18, width=3, caption=""),

    to_Conv("conv5", s_filer=64, n_filer=128, offset="(3,0,0)", to="(pool2-east)", height=30, depth=30, width=3,caption=''),
    to_connection("pool2", "conv5"),
    to_Conv("conv6", s_filer=64, n_filer=256, offset="(0,0,0)", to="(conv5-east)", height=30, depth=30, width=3,caption='CONV3'),
    to_Conv("conv7", s_filer=64, n_filer=256, offset="(0,0,0)", to="(conv6-east)", height=30, depth=30, width=3,caption=''),
    to_Pool("pool3", offset="(0,0,0)", to="(conv7-east)", height=16, depth=16, width=3, caption=""),

    to_Conv("conv8", s_filer=32, n_filer=256, offset="(3,0,0)", to="(pool3-east)", height=16, depth=16, width=3,caption=''),
    to_connection("pool3", "conv8"),
    to_Conv("conv9", s_filer=32, n_filer=512, offset="(0,0,0)", to="(conv8-east)", height=16, depth=16, width=3,caption='CONV4'),
    to_Conv("conv10", s_filer=32, n_filer=512, offset="(0,0,0)", to="(conv9-east)", height=16, depth=16, width=3,caption=''),
    to_Pool("pool4", offset="(0,0,0)", to="(conv10-east)", height=8, depth=8, width=3, caption=""),

    to_Conv("conv11", s_filer=16, n_filer=512, offset="(3,0,0)", to="(pool4-east)", height=8, depth=8, width=3,caption=''),
    to_connection("pool4", "conv11"),
    to_Conv("conv12", s_filer=16, n_filer=512, offset="(0,0,0)", to="(conv11-east)", height=8, depth=8, width=3, caption='CONV5'),
    to_Conv("conv13", s_filer=16, n_filer=512, offset="(0,0,0)", to="(conv12-east)", height=8, depth=8, width=3, caption=''),
    to_Pool("pool5", offset="(0,0,0)", to="(conv13-east)", height=6, depth=6, width=3, caption=""),

    to_Pool("pool6", offset="(2,0,0)", to="(pool5-east)", height=6, depth=6, width=3, caption="AdaptiveAvgPool"),
    to_connection("pool5", "pool6"),

    to_SoftMax(name='fc1', s_filer=4096, offset="(4,0,0)", to="(pool6-east)", width=1.5, height=1.5, depth=100,
               opacity=0.8, caption='FC1'),
    to_connection("pool6", "fc1"),

    to_SoftMax(name='fc2', s_filer=4096, offset="(2,0,0)", to="(fc1-east)", width=1.5, height=1.5, depth=50,
               opacity=0.8, caption='FC2'),
    to_connection("fc1", "fc2"),

    to_SoftMax(name='fc3', s_filer=5, offset="(2,0,0)", to="(fc2-east)", width=1.5, height=1.5, depth=5,
               opacity=0.8, caption='FC3'),
    to_connection("fc2", "fc3"),

    to_end()
]


def main():
    namefile = str(sys.argv[0]).split('.')[0]
    to_generate(arch, namefile + '.tex')

    # 使用 LaTeX 编译器将 .tex 文件转换为 .pdf 文件
    subprocess.call([r'D:\MiKTeX\install\miktex\bin\x64\pdflatex.exe', namefile + '.tex'])

    pdf_file = namefile + '.pdf'
    image_file = namefile + '.png'

    subprocess.call([r'D:\ghostscript\gs10.01.1\bin\gswin64c.exe', '-sDEVICE=pngalpha', '-o', image_file, '-r300', pdf_file])

    # 删除中间生成的文件
    cleanup(namefile)


def cleanup(namefile):
    # 删除中间生成的文件
    extensions = ['.aux', '.log', '.tex']
    for ext in extensions:
        filename = namefile + ext
        if os.path.exists(filename):
            os.remove(filename)


if __name__ == '__main__':
    main()

在这里插入图片描述

4.ResNet网络框架

import sys
import os
import subprocess
sys.path.append('../')
from pycore.tikzeng import *


def main():
    namefile = str(sys.argv[0]).split('.')[0]  # 获取当前文件名

    # 使用 LaTeX 编译器将 .tex 文件转换为 .pdf 文件
    subprocess.call([r'D:\MiKTeX\install\miktex\bin\x64\pdflatex.exe', namefile + '.tex'])

    pdf_file = namefile + '.pdf'
    image_file = namefile + '.png'

    subprocess.call([r'D:\ghostscript\gs10.01.1\bin\gswin64c.exe', '-sDEVICE=pngalpha', '-o', image_file, '-r300', pdf_file])

    # 删除中间生成的文件
    cleanup(namefile)


def cleanup(namefile):
    # 删除中间生成的文件
    # extensions = ['.aux', '.log', '.tex']
    extensions = ['.aux', '.log']
    for ext in extensions:
        filename = namefile + ext
        if os.path.exists(filename):
            os.remove(filename)


if __name__ == '__main__':
    main()

在这里插入图片描述

5.DenseNet网络框架

import sys
import os
import subprocess
sys.path.append('../')
from pycore.tikzeng import *


def main():
    namefile = str(sys.argv[0]).split('.')[0]  # 获取当前文件名

    # 使用 LaTeX 编译器将 .tex 文件转换为 .pdf 文件
    subprocess.call([r'D:\MiKTeX\install\miktex\bin\x64\pdflatex.exe', namefile + '.tex'])

    pdf_file = namefile + '.pdf'
    image_file = namefile + '.png'

    subprocess.call([r'D:\ghostscript\gs10.01.1\bin\gswin64c.exe', '-sDEVICE=pngalpha', '-o', image_file, '-r300', pdf_file])

    # 删除中间生成的文件
    cleanup(namefile)


def cleanup(namefile):
    # 删除中间生成的文件
    # extensions = ['.aux', '.log', '.tex']
    extensions = ['.aux', '.log']
    for ext in extensions:
        filename = namefile + ext
        if os.path.exists(filename):
            os.remove(filename)


if __name__ == '__main__':
    main()

在这里插入图片描述
注意:ResNet和DenseNet中一些划线的操作,需要你在.tex文件中进行修改和定义,这需要自行去学习latex的一些操作。

%定位
\pic[shift={(0,-5,0)}] at (sum1-west) 
{
	Box={
		name=score1,%
		fill=\PoolColor,%
		opacity=0,height=0.01,width=0.01,depth=0.01
	}
};


% 划线
\path (conv2-east) -- (sum1-south) coordinate[pos=-0.5] (between4_5) ;
\draw [connection]  (between4_5)    -- node {\midarrow} (score1-west-|between4_5) -- node {\midarrow} (score1-west);
\draw [connection]  (score1-east) -- node {\midarrow} (score1-east -| sum1-south) -- node {\midarrow} (sum1-south);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CH583,CH582,CH581 国产蓝牙芯片RISC-V内核BLE 5.3无线MCU

概述 CH583是集成BLE无线通讯的32位RISC微控制器。片上集成2Mbps低功耗蓝牙BLE 通讯模块、2个全速USB主机和设备控制器及收发器、2个SPI、4个串口、ADC、触摸按键检测模块、RTC等丰富的外设资源。 CH583相比CH582多了SP11主机,支持最低1. 7V电源电压。CH581 基于CH…

Java实现动态生成word报告

Java实现动态生成word报告 1.准备好docx文件模板 举例&#xff1a;动态生成表格数据&#xff0c;以下是list数组类型的freemarker语法 将写好的word模板加入到templates目录下 2.在pom.xml中导入相关依赖 <dependency><groupId>fr.opensagres.xdocreport</g…

react antd checkbox实现全选,多选

背景 目前好像只有table组件有实现表格数据的全选功能&#xff0c;如果说对于list&#xff0c;card&#xff0c;collapse等其他组件来说&#xff0c;需要自己结合checkbox来手动实现全选功能。 Checkbox.Group有实现全选功能&#xff0c;但是对于需要遍历出来的数据&#xff…

人民大学与加拿大女王大学金融硕士——原来“鱼和熊掌”可以兼得

“鱼和熊掌”不可兼得&#xff0c;我们从小就听到过这句话。随着长大&#xff0c;随着能力增强&#xff0c;两者我们都想要。就像在中国人民大学与加拿大女王大学金融硕士项目读研&#xff0c;我们不只要获得毕业证书&#xff0c;我们还要学到真本领。你的愿望在人大女王金融硕…

Ubuntu18.04离线安装Nginx

因需要安装nginx的服务器无法连接互联网&#xff0c;所以需要离线安装。首先需要下载nginx的安装包&#xff0c;之后进行安装&#xff0c;在安装之前需要保证gcc&#xff0c;g&#xff0c;make等依赖包已经安装。 因为是需要离线安装&#xff0c;所以在之前是用的一台互联网下载…

Java选择题刷题记录1

LinkedList类继承自AbstractSequentialList ArrayList listnew ArrayList(); 这种是默认创建大小为10的数组&#xff0c;每次扩容大小为1.5倍&#xff1b;ArrayList listnew ArrayList(20);这种是指定数组大小的创建&#xff0c;创建时直接分配其大小&#xff0c;扩充0次 Ite…

naive-ui NPopconfirm怎么用vue3的h()渲染

先看效果 然后我先贴代码&#xff0c; 你们看懂的先运行下&#xff0c; 文章后面我教你怎么 添加这种有template&#xff0c;有slot插槽的组件 h(NPopconfirm,{positiveButtonProps: {size: tiny,color: #007293,bordered: true,},negativeButtonProps: {size: tiny,color: #…

解决添加上@RequiresPermissions权限注解后无法访问接口,swagger读取不到的问题

目录 一、先搭建 Swagger 1、添加依赖库 2、创建Swagger配置类 3、配置yml 4、编写测试Web接口 5、测试Web接口 二、解决问题 1、出现的问题 2、解决问题 一、先搭建 Swagger 开发前后端分离架构的项目&#xff0c;往往调试后端Web接口需要用到POSTMAN工具。虽然POSTM…

智安网络|人工智能蔓延,网络安全所面临的威胁和应对之道

随着人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;技术的快速发展和广泛应用&#xff0c;我们进入了一个智能时代&#xff0c;人工智能已经蔓延到我们生活的方方面面。然而&#xff0c;与其带来的方便和创新相伴随的是网络安全所面临的新威胁。 【威…

记录一下RocketMQ中遇见的 连环大坑!!!差点没把我摔死

目录 环境&#xff1a;Win10 &#xff0c; 不是 linux 首先我遇见的第一个问题是&#xff1a; No route info of this topic 问题原因&#xff1a; PS&#xff1a; 64位系统环境下&#xff0c;如果软件在安装时安装路径默认c:\progarmfiles即为64位&#xff0c;默认c:\pr…

Sharding-JDBC之PreciseShardingAlgorithm(精确分片算法)

目录 一、简介二、maven依赖三、数据库3.1、创建数据库3.2、创建表 四、配置&#xff08;二选一&#xff09;4.1、properties配置4.2、yml配置 五、精确分片算法5.1、精确分库算法5.2、精确分表算法 六、实现6.1、实体层6.2、持久层6.3、服务层6.4、测试类6.4.1、保存订单数据6…

ai画图怎么弄?简单几步教会你如何用ai绘画

艺术创作一直是人类文明发展的重要组成部分&#xff0c;在当今数字化时代&#xff0c;ai技术的不断进步也为我们带来了全新的创作方式。在这其中&#xff0c;ai绘画软件因其独特的创作方式和优秀的绘画效果受到了广泛关注和喜爱。使用ai绘画软件可以让我们轻松地创作出各种风格…

关于数据仓库那点事,一文捋清

借助海量的数据&#xff0c;企业进行了深层次的数字化改革&#xff0c;把数据当成了企业发展的核心&#xff0c;但无效的数据即使规模再大&#xff0c;也对企业没有意义&#xff0c;所以数据质量也就愈发重要。 数据仓库 事实上&#xff0c;很多人在看到数据仓库的第一眼&…

【夜深人静学数据结构与算法 | 第四篇】手撕二叉树遍历

目录 前言&#xff1a; 二叉树遍历方式&#xff1a; 手撕前中后序遍历&#xff08;递归&#xff09;的三大准备 深度优先搜索&#xff1a; 手撕前中后遍历&#xff08;递归&#xff09;&#xff1a; 手撕前中后序遍历&#xff08;迭代&#xff09;&#xff1a; 深度优先…

经典Java面试题收集

1、面向对象的特征有哪些方面&#xff1f; 答&#xff1a;面向对象的特征主要有以下几个方面&#xff1a; 抽象&#xff1a;抽象是将一类对象的共同特征总结出来构造类的过程&#xff0c;包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为&#xff0c;并不关注这…

EHCI接口概述(三)

EHCI主机接口寄存器在BAR0所示的PCI MEM地址空间中&#xff0c;主要包括两部分&#xff1a; 1&#xff09;能力寄存器组 2&#xff09;操作寄存器组 下面先介绍能力寄存器组 CAPLENGTH寄存器&#xff0c;8位只读寄存器&#xff0c;给出了控制寄存器组的偏移量。 HCIVERSION…

springboot+vue项目之CSGO赛事管理系统(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的CSGO赛事管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

C语言:求两个数二进制中不同位的个数

题目&#xff1a; 编程实现&#xff1a;两个int&#xff08;32位&#xff09;整数 m 和 n 的二进制表达中&#xff0c;有多少个位(bit)不同&#xff1f; 输入例子 : 1999 2299 输出例子 : 7 思路&#xff1a; 总体思路&#xff1a; 把 m 异或 n 后&#xff0c;有几个相异就有几…

抢占父亲节市场:2023年出海品牌的海外网红营销策略揭秘

随着社交媒体的迅猛发展和全球化的趋势&#xff0c;网红营销已经成为品牌推广的一种重要方式。在父亲节这个特殊的节日里&#xff0c;出海品牌可以通过巧妙利用网红的影响力来推动产品销售和品牌知名度的提升。本文Nox聚星将详细介绍如何通过海外网红营销来提升品牌知名度和销售…