首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >谷歌开源的 GAN 库--TFGAN

谷歌开源的 GAN 库--TFGAN

作者头像
kbsc13
发布于 2019-08-16 03:47:33
发布于 2019-08-16 03:47:33
91900
代码可运行
举报
文章被收录于专栏:AI 算法笔记AI 算法笔记
运行总次数:0
代码可运行

本文大约 8000 字,阅读大约需要 12 分钟 第一次翻译,限于英语水平,可能不少地方翻译不准确,请见谅!

最近谷歌开源了一个基于 TensorFlow 的库--TFGAN,方便开发者快速上手 GAN 的训练,其 Github 地址如下:

https://github.com/tensorflow/models/tree/master/research/gan

原文网址:https://hub.packtpub.com/google-opensources-tensorflow-gan-tfgan-library-for-generative-adversarial-networks-neural-network-model/#


如果你玩过波斯王子,那你应该知道你需要保护自己不被”影子“所杀掉,但这也是一个矛盾:如果你杀死“影子”,那游戏就结束了;但你不做任何事情,那么游戏也会输掉。

尽管生成对抗网络(GAN)有不少优点,但它也面临着相似的区分问题。大部分支持 GAN 的深度学习专业也是非常谨慎的支持它,并指出它确实存在稳定性的问题。

GAN 的这个问题也可以称做整体收敛性问题。尽管判别器 D 和 生成器 D 相互竞争博弈,但同时也相互依赖对方来达到有效的训练。如果其中一方训练得很差,那整个系统也会很差(这也是之前提到的梯度消失或者模式奔溃问题)。并且你也需要确保他们不会训练太过度,造成另一方无法训练了。因此,波斯王子是一个很有趣的概念。

首先,神经网络的提出就是为了模仿人类的大脑(尽管是人为的)。它们也已经在物体识别和自然语言处理方面取得成功。但是,想要在思考和行为上与人类一致,这还有非常大的差距。

那么是什么让 GANs 成为机器学习领域一个热门话题呢?因为它不仅只是一个相对新的结构,它更加是一个比之前其他模型都能更加准确的对真实数据建模,可以说是深度学习的一个革命性的变化。

最后,它是一个同时训练两个独立的网络的新模型,这两个网络分别是判别器和生成器。这样一个非监督神经网络却能比其他传统网络得到更好性能的结果。

但目前事实是我们对 GANs 的研究还只是非常浅层,仍然有着很多挑战需要解决。GANs 目前也存在不少问题,比如无法区分在某个位置应该有多少特定的物体,不能应用到 3D 物体,以及也不能理解真实世界的整体结构。当然现在有大量研究正在研究如何解决上述问题,新的模型也取得更好的性能。

而最近谷歌为了让 GANs 更容易实现,设计开发并开源了一个基于 TensorFlow 的轻量级库--TFGAN

根据谷歌的介绍,TFGAN 提供了一个基础结构来减少训练一个 GAN 模型的难度,同时提供非常好测试的损失函数和评估标准,以及给出容易上手的例子[1],这些例子强调了 TFGAN 的灵活性和易于表现的优点。

此外,还提供了一个教程[2],包含一个高级的 API 可以快速使用自己的数据集训练一个模型。

上图是展示了对抗损失在图像压缩[3]方面的效果。最上方第一行图片是来自 ImageNet[4] 数据集的图片,也是原始输入图片,中间第二行展示了采用传统损失函数训练得到的图像压缩神经网络的压缩和解压缩效果,最底下一行则是结合传统损失函数和对抗损失函数训练的网络的结果,可以看到尽管基于对抗损失的图片并不像原始图片,但是它比第二行的网络得到更加清晰和细节更好的图片。

TFGAN 既提供了几行代码就可以实现的简答函数来调用大部分 GAN 的使用例子,也是建立在包含复杂 GAN 设计的模式化方式。这就是说,我们可以采用自己需要的模块,比如损失函数、评估策略、特征以及训练等等,这些都是独立的模块。TFGAN 这样的设计方式其实就满足了不同使用者的需求,对于入门新手可以快速训练一个模型来看看效果,对于需要修改其中任何一个模块的使用者也能修改对应模块,而不会牵一发而动全身。

最重要的是,谷歌也保证了这个代码是经过测试的,不需要担心一般的 GAN 库造成的数字或者统计失误。

开始使用

首先添加以下代码来导入 tensorflow 和 声明一个 TFGAN 的实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf
tfgan = tf.contrib.gan
为何使用 TFGAN
  • 采用良好测试并且很灵活的调用接口[5]实现快速训练生成器和判别器网络,此外,还可以混合 TFGAN、原生 TensorFlow以及其他自定义框架代码;
  • 使用实现好的 GAN 的损失函数和惩罚策略[6] (比如 Wasserstein loss、梯度惩罚等)
  • 训练阶段对 GAN 进行监控和可视化操作[7],以及评估生成结果[8]
  • 使用实现好的技巧来稳定和提高性能[9]
  • 基于常规的 GAN 训练例子来开发
  • 采用 GANEstimator[10] 接口里快速训练一个 GAN 模型
  • TFGAN 的结构改进也会自动提升你的 TFGAN 项目的性能
  • TFGAN 会不断添加最新研究的算法成果
TFGAN 的部件有哪些呢?

TFGAN 是由多个设计为独立的部件组成的,分别是:

  • core[5]:提供了一个主要的训练 GAN 模型的结构。训练过程分为四个阶段,每个阶段都可以采用自定义代码或者 调用 TFGAN 库接口来完成;
  • features[9]:包含许多常见的 GAN 运算和正则化技术,比如实例正则化(instance normalization)
  • losses[11]:包含常见的 GAN 的损失函数和惩罚机制,比如 Wasserstein loss、梯度惩罚、相互信息惩罚等
  • evaulation[12]:使用一个预训练好的 Inception 网络来利用Inception Score或者Frechet Distance评估标准来评估非条件生成模型。当然也支持利用自己训练的分类器或者其他方法对有条件生成模型的评估
  • examples[1] and tutorial[2]:使用 TFGAN 训练 GAN 模型的例子和教程。包含了使用非条件和条件式的 GANs 模型,比如 InfoGANs 等。
训练一个 GAN 模型

典型的 GAN 模型训练步骤如下:

  1. 为你的网络指定输入,比如随机噪声,或者是输入图片(一般是应用在图片转换的应用,比如 pix2pixGAN 模型)
  2. 采用GANModel接口定义生成器和判别器网络
  3. 采用GANLoss指定使用的损失函数
  4. 采用GANTrainOps设置训练运算操作,即优化器
  5. 开始训练

当然,GAN 的设置有多种形式。比如,你可以在非条件下训练生成器生成图片,或者可以给定一些条件,比如类别标签等输入到生成器中来训练。无论是哪种设置,TFGAN 都有相应的实现。下面将结合代码例子来进一步介绍。

实例
非条件 MNIST 图片生成

第一个例子是训练一个生成器来生成手写数字图片,即 MNIST 数据集。生成器的输入是从多变量均匀分布采样得到的随机噪声,目标输出是 MNIST 的数字图片。具体查看论文“Generative Adversarial Networks”[17]。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置输入
# 真实数据来自 MNIST 数据集
images = mnist_data_provider.provide_data(FLAGS.batch_size)
# 生成器的输入,从多变量均匀分布采样得到的随机噪声
noise = tf.random_normal([FLAGS.batch_size, FLAGS.noise_dims])

# 调用 tfgan.gan_model() 函数定义生成器和判别器网络模型
gan_model = tfgan.gan_model(
    generator_fn=mnist.unconditional_generator,  
    discriminator_fn=mnist.unconditional_discriminator,  
    real_data=images,
    generator_inputs=noise)

# 调用 tfgan.gan_loss() 定义损失函数
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.wasserstein_generator_loss,
    discriminator_loss_fn=tfgan_losses.wasserstein_discriminator_loss)

# 调用 tfgan.gan_train_ops() 指定生成器和判别器的优化器
train_ops = tfgan.gan_train_ops(
    gan_model,
    gan_loss,
    generator_optimizer=tf.train.AdamOptimizer(gen_lr, 0.5),
    discriminator_optimizer=tf.train.AdamOptimizer(dis_lr, 0.5))

# tfgan.gan_train() 开始训练,并指定训练迭代次数 num_steps
tfgan.gan_train(
    train_ops,
    hooks=[tf.train.StopAtStepHook(num_steps=FLAGS.max_number_of_steps)],
    logdir=FLAGS.train_log_dir)
条件式 MNIST 图片生成

第二个例子同样还是生成 MNIST 图片,但是这次输入到生成器的不仅仅是随机噪声,还会给类别标签,这种 GAN 模型也被称作条件 GAN,其目的也是为了让 GAN 训练不会太过自由。具体可以看论文“Conditional Generative Adversarial Nets”[13]。

代码方面,仅仅需要修改输入和建立生成器与判别器模型部分,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置输入
# 真实数据来自 MNIST 数据集,这里增加了类别标签--one_hot_labels
images, one_hot_labels = mnist_data_provider.provide_data(FLAGS.batch_size)
# 生成器的输入,从多变量均匀分布采样得到的随机噪声
noise = tf.random_normal([FLAGS.batch_size, FLAGS.noise_dims])

# 调用 tfgan.gan_model() 函数定义生成器和判别器网络模型
gan_model = tfgan.gan_model(
    generator_fn=mnist.conditional_generator,  
    discriminator_fn=mnist.conditional_discriminator,  
    real_data=images,
    generator_inputs=(noise, one_hot_labels)) # 生成器的输入增加了类别标签

# 剩余的代码保持一致
...
对抗损失

第三个例子结合了 L1 pixel loss 和对抗损失来学习自动编码图片。瓶颈层可以用来传输图片的压缩表示。如果仅仅使用 pixel-wise loss,网络只回倾向于生成模糊的图片,但 GAN 可以用来让这个图片重建过程更加逼真。具体可以看论文“Full Resolution Image Compression with Recurrent Neural Networks”[3]来了解如何用 GAN 来实现图像压缩,以及论文“Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network”[14]了解如何用 GANs 来增强生成的图片质量。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置输入
images = image_provider.provide_data(FLAGS.batch_size)

# 配置生成器和判别器网络
gan_model = tfgan.gan_model(
    generator_fn=nets.autoencoder,  # 自定义的 autoencoder
    discriminator_fn=nets.discriminator,  # 自定义的 discriminator
    real_data=images,
    generator_inputs=images)

# 建立 GAN loss 和 pixel loss
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.wasserstein_generator_loss,
    discriminator_loss_fn=tfgan_losses.wasserstein_discriminator_loss,
    gradient_penalty=1.0)
l1_pixel_loss = tf.norm(gan_model.real_data - gan_model.generated_data, ord=1)

# 结合两个 loss
gan_loss = tfgan.losses.combine_adversarial_loss(
    gan_loss, gan_model, l1_pixel_loss, weight_factor=FLAGS.weight_factor)

# 剩下代码保持一致
...
图像转换

第四个例子是图像转换,它是将一个领域的图片转变成另一个领域的同样大小的图片。比如将语义分割图变成街景图,或者是灰度图变成彩色图。具体细节看论文“Image-to-Image Translation with Conditional Adversarial Networks”[15]。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置输入,注意增加了 target_image
input_image, target_image = data_provider.provide_data(FLAGS.batch_size)

# 配置生成器和判别器网络
gan_model = tfgan.gan_model(
    generator_fn=nets.generator,  
    discriminator_fn=nets.discriminator,  
    real_data=target_image,
    generator_inputs=input_image)

#  建立 GAN loss 和 pixel loss
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.least_squares_generator_loss,
    discriminator_loss_fn=tfgan_losses.least_squares_discriminator_loss)
l1_pixel_loss = tf.norm(gan_model.real_data - gan_model.generated_data, ord=1)

# 结合两个 loss
gan_loss = tfgan.losses.combine_adversarial_loss(
    gan_loss, gan_model, l1_pixel_loss, weight_factor=FLAGS.weight_factor)

# 剩下代码保持一致
...
InfoGAN

最后一个例子是采用 InfoGAN 模型来生成 MNIST 图片,但是可以不需要任何标签来控制生成的数字类型。具体细节可以看论文“InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets”[16]。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置输入
images = mnist_data_provider.provide_data(FLAGS.batch_size)

# 配置生成器和判别器网络
gan_model = tfgan.infogan_model(
    generator_fn=mnist.infogan_generator,  
    discriminator_fn=mnist.infogran_discriminator,  
    real_data=images,
    unstructured_generator_inputs=unstructured_inputs,  # 自定义输入
    structured_generator_inputs=structured_inputs)  # 自定义

# 配置 GAN loss 以及相互信息惩罚
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.wasserstein_generator_loss,
    discriminator_loss_fn=tfgan_losses.wasserstein_discriminator_loss,
    gradient_penalty=1.0,
    mutual_information_penalty_weight=1.0)

# 剩下代码保持一致
...
自定义模型的创建

最后同样是非条件 GAN 生成 MNIST 图片,但利用GANModel函数来配置更多参数从而更加精确控制模型的创建。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置输入
images = mnist_data_provider.provide_data(FLAGS.batch_size)
noise = tf.random_normal([FLAGS.batch_size, FLAGS.noise_dims])

# 手动定义生成器和判别器模型
with tf.variable_scope('Generator') as gen_scope:
  generated_images = generator_fn(noise)
with tf.variable_scope('Discriminator') as dis_scope:
  discriminator_gen_outputs = discriminator_fn(generated_images)
with variable_scope.variable_scope(dis_scope, reuse=True):
  discriminator_real_outputs = discriminator_fn(images)
generator_variables = variables_lib.get_trainable_variables(gen_scope)
discriminator_variables = variables_lib.get_trainable_variables(dis_scope)

# 依赖于你需要使用的 TFGAN 特征,你并不需要指定 `GANModel`函数的每个参数,不过
# 最少也需要指定判别器的输出和变量
gan_model = tfgan.GANModel(
    generator_inputs,
    generated_data,
    generator_variables,
    gen_scope,
    generator_fn,
    real_data,
    discriminator_real_outputs,
    discriminator_gen_outputs,
    discriminator_variables,
    dis_scope,
    discriminator_fn)

# 剩下代码和第一个例子一样
...

最后,再次给出 TFGAN 的 Github 地址如下:

https://github.com/tensorflow/models/tree/master/research/gan


文章链接:

  1. TFGAN 例子:https://github.com/tensorflow/models/tree/master/research/gan
  2. TFGAN 教程:https://github.com/tensorflow/models/tree/master/research/gan/tutorial.ipynb
  3. Full Resolution Image Compression with Recurrent Neural Networks: https://arxiv.org/abs/1608.05148
  4. ImageNet:http://www.image-net.org/
  5. TFGAN 训练接口代码:https://www.tensorflow.org/code/tensorflow/contrib/gan/python/train.py
  6. TFGAN loss接口代码:https://www.tensorflow.org/code/tensorflow/contrib/gan/python/losses/python/losses_impl.py
  7. https://www.tensorflow.org/code/tensorflow/contrib/gan/python/eval/python/summaries_impl.py
  8. https://www.tensorflow.org/code/tensorflow/contrib/gan/python/eval/python/classifier_metrics_impl.py
  9. Tricks:https://www.tensorflow.org/code/tensorflow/contrib/gan/python/features/python/
  10. GANEstimator:https://www.tensorflow.org/code/tensorflow/contrib/gan/python/estimator/python/gan_estimator_impl.py
  11. losses: https://www.tensorflow.org/code/tensorflow/contrib/gan/python/losses/python/
  12. evaluation:https://www.tensorflow.org/code/tensorflow/contrib/gan/python/eval/python/
  13. Conditional Generative Adversarial Nets:https://arxiv.org/abs/1411.1784
  14. Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network:https://arxiv.org/abs/1609.04802
  15. Image-to-Image Translation with Conditional Adversarial Networks:https://arxiv.org/abs/1611.07004
  16. InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets:https://arxiv.org/abs/1606.03657
  17. Generative Adversarial Networks:https://arxiv.org/abs/1406.2661

如果有翻译不当的地方或者有任何建议和看法,可以点击左下角查看原文留言给出你对本文的建议和看法。

同时也欢迎关注我的微信公众号--机器学习与计算机视觉或者扫描下方的二维码,在后台留言,和我分享你的建议和看法,指正文章中可能存在的错误,大家一起交流,学习和进步!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法猿的成长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
AJAX跨域请求JSONP 原
JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。
tianyawhl
2019/04/04
1.1K0
第113天:Ajax跨域请求解决方法
第五步:在监听函数中,判断readyState=4&&status=200表示请求成功
半指温柔乐
2018/09/11
1.7K0
解决ajax跨域请求 (总结)
ajax跨域请求,目前已用几种方法实现: 1)用原生js的xhr对象实现。                var url="http://freegeoip.net/json/";                //创建xhr对象                function createCORSXhr(url,method){                     var xhr=new XMLHttpRequest();                     if("withCred
欲休
2018/03/15
1K0
解决ajax跨域请求  (总结)
剖析跨域问题始末及其解决方案——前端必备交叉知识(一)
在前端开发的旅程中,跨域问题无疑是一道难以逾越的高山。无论是初入职场的新手,还是经验丰富的老手,都可能在这座山前止步不前。跨域问题不仅在调试阶段频繁出现,更在正式环境的部署中如影随形,让开发人员头疼不已。今天,就让我们一起深入探讨跨域问题的根源,剖析其表现形式,并逐一攻克常见的跨域难题。希望这篇文章能成为你的指南,帮助你全面理解跨域及其解决方案,提升解决实际问题的能力。
watermelo37
2025/02/02
2200
剖析跨域问题始末及其解决方案——前端必备交叉知识(一)
ajax跨域解决方案domain_js解决跨域问题
JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。
全栈程序员站长
2022/09/23
2.8K0
ajax跨域解决方案domain_js解决跨域问题
ajax跨域的解决办法_java如何解决跨域问题
大家好,又见面了,我是你们的朋友全栈君。 什么是跨域问题? 跨域问题来源于JavaScript的”同源策略”,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScrip
全栈程序员站长
2022/09/23
7980
JQuery的Ajax跨域请求的
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115609.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/10
8970
ajax跨域,这应该是最全的解决方案了
前端爱好者的知识盛宴 嗨 这里是IMWEB 一个想为更多的前端人 享知识  助发展 觅福利 有情怀有情调的公众号 欢迎关注转发 让更多的前端技友一起学习发展~ 前言 从刚接触前端开发起,跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了,16年时也整理过一篇相关文章,但是感觉还是差了点什么,于是现在重新梳理了一下。 个人见识有限,如有差错,请多多见谅,欢迎提出issue,另外看到这个标题,请勿喷~ 提纲 关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域
用户1097444
2022/06/29
8490
ajax跨域,这应该是最全的解决方案了
Django之跨域请求
同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。 而如果我们要跳过这个策略,也就是说非要跨域请求,那么就需要通过JSONP或者CORS来实现了。 JSONP 什么是JSONP 首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。 那么JSONP是什么呢?  首先抛
人生不如戏
2018/05/30
1.5K0
ajax跨域的基本流程
创建XMLHttpRequest对象,也就是创建一个异步调用对象;判断XHR对象属性;创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息;设置响应HTTP请求状态变化的函数;发送HTTP请求;获取异步调用返回的数据;使用JavaScript和DOM实现局部刷新。
行云博客
2020/07/13
1.1K0
ajax cors跨域_jquery跨域
Jsonp 的实现原理就是:创建一个回调函数,然后在远程服务上调用这个函数并且将 JSON 数据形式作为参数传递,完成回调。
全栈程序员站长
2022/09/23
3.1K0
ajax跨域问题以及解决方案_js跨域请求的三种方法
鼠标离开用户名输入框时,检查是否符合要求,如果为空,则给提示,如果不为空,则异步查询数据库,后返回结果;
全栈程序员站长
2022/09/23
3.7K0
ajax跨域问题以及解决方案_js跨域请求的三种方法
什么是跨域跨域解决方法_500错误原因解决方法
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)
全栈程序员站长
2022/08/02
2.2K0
什么是跨域跨域解决方法_500错误原因解决方法
跨域请求的常用方式及解释
同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个域加载的脚本去获取另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。 js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。 只要协议、域名、端口有任何一个不同,都被当作是不同的域。 下面介绍几种常用的跨域请求方式 默认端口为:8080
柴小智
2018/04/10
1.5K0
跨域请求的常用方式及解释
js ajax 跨域问题 解决方案[通俗易懂]
跨域问题来源于JavaScript的”同源策略”,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题。
全栈程序员站长
2022/09/25
1.9K0
js ajax 跨域问题 解决方案[通俗易懂]
AJAX跨域完全讲解
AJAX跨域完全讲解 今天在慕课网上学习了AJAX跨域完全讲解:https://www.imooc.com/learn/947 我在收集AJAX面试题的时候其实就已经有过AJAX跨域的问题的了,当时候
Java3y
2018/03/15
8320
AJAX跨域完全讲解
ajax跨域问题-web开发必会
ajax跨域问题 跨域 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。 解决方式 通常来说,比较通用的有如下两种方式,一种是从服务器端下手,另一种则是从客户端的角度出发。二者各有利弊,具体要使用哪种方式还需要具体的分析。 服务器设置响应头 服务器代理 客户端采用脚本回调机制。 方式一 Access-Control-Allow-Origin 关键字只有在
Java帮帮
2018/03/19
1.8K0
ajax跨域问题-web开发必会
网站跨域的五种解决方式
等带有src属性的标签可以从不同的域加载和执行资源。其他插件的同源策略:flash、java applet、silverlight、googlegears等浏览器加载的第三方插件也有各自的同源策略,只是这些同源策略不属于浏览器原生的同源策略,如果有漏洞则可能被黑客利用,从而留下XSS攻击的后患
云扬四海
2019/06/05
1.4K0
跨域问题
测试URL为 http://localhost:80/home/allProductions 可以直接在浏览器console中执行
微醺
2019/01/17
1.6K0
ajax跨域解决方案_java如何解决跨域问题
从刚接触前端开发起, 跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了,16年时也整理过一篇相关文章,但是感觉还是差了点什么,于是现在重新梳理了一下。
全栈程序员站长
2022/09/23
1.2K0
ajax跨域解决方案_java如何解决跨域问题
相关推荐
AJAX跨域请求JSONP 原
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档