强化学习 ---baselines项目之 Atari游戏的网络结构解析

4 篇文章 0 订阅
订阅专栏

这个baselines项目设计的比较灵活,结构有点复杂。由于项目庞大,各个函数之间又是相互调用,有时候从一个函数追溯下去,可以追溯6,7层,每个函数的超参数又特别多,很容易把人搞晕。
      接下来只看DQN部分的源码,其他无关的先不看,沿着一条线分解它!接下来进行一个递归游戏,一层一层的深入探索,探索到尽头再返回,当然中途适当剪剪枝,跟网络图无关的部分先不访问!
     首先,我们找递归入口,在deepq下有个experiments,这下面全是实例,pong就是一个Atari游戏的实验。
在这里插入图片描述
以下是trian_pong的代码


1.

from baselines import deepq
from baselines import bench
from baselines import logger
from baselines.common.atari_wrappers import make_atari
import numpy as np
np.seterr(invalid='ignore')

def main():
    logger.configure()
    env = make_atari('PongNoFrameskip-v4')
    env = bench.Monitor(env, logger.get_dir())
    env = deepq.wrap_atari_dqn(env)
    model = deepq.learn(
        env,
        "conv_only",
        convs=[(32, 8, 4), (64, 4, 2), (64, 3, 1)],
        hiddens=[256],
        dueling=True,
        lr=1e-4,
        total_timesteps=int(1e7),
        buffer_size=10000,
        exploration_fraction=0.1,
        exploration_final_eps=0.01,
        train_freq=4,
        learning_starts=10000,
        target_network_update_freq=1000,
        gamma=0.99,
    )
    deepq.learn()

    model.save('pong_model.pkl')
    env.close()

if __name__ == '__main__':
    main()

以上代码主要调用了deepq文件。并且仔细看下deepq.learn()方法,参数很多,我们先关注它的网络结构,明显卷积层conv和全连接层hiddens是属于网络结构部分。按住ctrl点击learn,会跳转到learn()方法位置。以下是learn()的超参数。别怕,看起来多,其实没想象的复杂,因为它的复杂是你想象不到的


2.

def learn(env,
          network,
          seed=None,
          lr=5e-4,
          total_timesteps=100000,
          buffer_size=50000,
          exploration_fraction=0.1,
          exploration_final_eps=0.02,
          train_freq=1,
          batch_size=32,
          print_freq=100,
          checkpoint_freq=10000,
          checkpoint_path=None,
          learning_starts=1000,
          gamma=1.0,
          target_network_update_freq=500,
          prioritized_replay=False,
          prioritized_replay_alpha=0.6,
          prioritized_replay_beta0=0.4,
          prioritized_replay_beta_iters=None,
          prioritized_replay_eps=1e-6,
          param_noise=False,
          callback=None,
          load_path=None,
          **network_kwargs
          ):

可是这里面没有出现参数convs等,那就说明这些参数是在 **network_kwargs(一个字典)里面经过仔细对比可知:

**network_kwargs里有{convs, hiddens,dueling}这3个
再看以下哪个函数用到了 **network_kwargs


3.

q_func = build_q_func(network, **network_kwargs)

只有这一条用到了,nice!点进去,发现新的天地


4.

def build_q_func(network, hiddens=[256], dueling=True, layer_norm=False, **network_kwargs):
    if isinstance(network, str):
        from baselines.common.models import get_network_builder
       # print('network:',network)
        network = get_network_builder(network)(**network_kwargs)
       # print('network:', network)
    def q_func_builder(input_placeholder, num_actions, scope, reuse=False):
        with tf.variable_scope(scope, reuse=reuse):
            latent = network(input_placeholder)
            if isinstance(latent, tuple):
                if latent[1] is not None:
                    raise NotImplementedError("DQN is not compatible with recurrent policies yet")
                latent = latent[0]

            latent = layers.flatten(latent)

            with tf.variable_scope("action_value"):
                action_out = latent
                for hidden in hiddens:
                    action_out = layers.fully_connected(action_out, num_outputs=hidden, activation_fn=None)
                    if layer_norm:
                        action_out = layers.layer_norm(action_out, center=True, scale=True)
                    action_out = tf.nn.relu(action_out)
                action_scores = layers.fully_connected(action_out, num_outputs=num_actions, activation_fn=None)

            if dueling:
                with tf.variable_scope("state_value"):
                    state_out = latent
                    for hidden in hiddens:
                        state_out = layers.fully_connected(state_out, num_outputs=hidden, activation_fn=None)
                        if layer_norm:
                            state_out = layers.layer_norm(state_out, center=True, scale=True)
                        state_out = tf.nn.relu(state_out)
                    state_score = layers.fully_connected(state_out, num_outputs=1, activation_fn=None)
                action_scores_mean = tf.reduce_mean(action_scores, 1)
                action_scores_centered = action_scores - tf.expand_dims(action_scores_mean, 1)
                q_out = state_score + action_scores_centered
            else:
                q_out = action_scores
            return q_out

    return q_func_builder

很接近了,这个明显就是在构建网络结构了, **network_kwargs里面使用了两个参数,还剩下‘conv’ 没用,看3可以知道它返回的是一个函数,也就是这里面的q_func_builder,看这个函数前,还要进入下一层探索,先看下开头的这行


5.

network = get_network_builder(network)(**network_kwargs)

从刚刚的传参我们知道network = “conv_only” ,是一个字符串。通过一个字符串,返回了一个函数,并且再把**network_kwargs(也就是卷积层的参数)参数传递给返回的这个函数, 目测最终返回一个卷积层的网络结构。先点进去看一下:


6.

def get_network_builder(name):

    if callable(name):  #函数用于检查一个对象是否是可调用的
        # print('name',name)
        return name
    elif name in mapping:
       # print('mapping',mapping)
        return mapping[name]

    else:
        raise ValueError('Unknown network type: {}'.format(name))

这段代码很简洁:先检测下name是否是可调用的参数,再检测是否在mapping字典里,然后返回函数名。显然这里的“conv_only”是从mapping里面去取。
我们把mappling输出来看一下


7.

print(mapping)
output:
mapping {'mlp': <function mlp at 0x000001C90316B5E8>, 'cnn': <function cnn at 0x000001C90316B678>, 'impala_cnn': <function impala_cnn at 0x000001C90316B708>, 'cnn_small': <function cnn_small at 0x000001C90316B798>, 'lstm': <function lstm at 0x000001C90316B828>, 'cnn_lstm': <function cnn_lstm at 0x000001C90316B8B8>, 'impala_cnn_lstm': <function impala_cnn_lstm at 0x000001C90316B948>, 'cnn_lnlstm': <function cnn_lnlstm at 0x000001C90316B9D8>, 'conv_only': <function conv_only at 0x000001C90316BA68>}
network: <function conv_only.<locals>.network_fn at 0x000001C9030AF678>

发现有那么多函数,那么这些函数是什么时候加入mapping的呢?
在该文件搜索下mapping,发现register()函数:


8.

mapping = {}

def register(name):
    def _thunk(func):
        mapping[name] = func
        return func
    return _thunk

就是简单的将name和函数名存入mapping
再搜索register,发现了很多register的注解


9.

@register("mlp")
def mlp(num_layers=2, num_hidden=64, activation=tf.tanh, layer_norm=False):...

@register("cnn")
def cnn(**conv_kwargs):...

@register("conv_only")
def conv_only(convs=[(32, 8, 4), (64, 4, 2), (64, 3, 1)], **conv_kwargs):....

其实加上@register(“xxx”)后就会调用上面8函数直接加入mapping,这就正好跟mapping里的函数对应上了。注解是个好东西
到此为止,我也不知道跳了多少层了。只要脑袋里的线路清晰,就不会混乱。那么直接关注conv_only函数吧


10.

@register("conv_only")
def conv_only(convs=[(32, 8, 4), (64, 4, 2), (64, 3, 1)], **conv_kwargs):
    def network_fn(X):
        out = tf.cast(X, tf.float32) / 255.
        with tf.variable_scope("convnet"):
            for num_outputs, kernel_size, stride in convs:
                out = tf.contrib.layers.convolution2d(out,
                                           num_outputs=num_outputs,
                                           kernel_size=kernel_size,
                                           stride=stride,
                                           activation_fn=tf.nn.relu,
                                           **conv_kwargs)

        return out
    return network_fn

先看下整体结构,果然没错,跟我们在5的时候说的一样之前传入的**network_kwargs就变成这个函数的convs了。返回了一个network_fn函数 ,再传入 图像的输入参数----------就是这里的X参数。现在仔细看下这个函数!

  • convs是一个列表,列表里是一个元组。X是输入的图像参数,是一个shape=[batch,84,84,4]的Tensor。
  • 先量化成0-1的浮点数,再遍历convs里面的元素,搭建卷积网络
  • num_outputs是通道数,也就是卷积核个数, kernel_size卷积核大小, stride 是上下的跨度大小 这些是卷积网络里常用的
  • 输出out是一个【batch,size,size,64】的Tensor


    接下来返回4在来看
def build_q_func(network, hiddens=[256], dueling=True, layer_norm=False, **network_kwargs):
    if isinstance(network, str):
        from baselines.common.models import get_network_builder
       # print('network:',network)
        network = get_network_builder(network)(**network_kwargs)
       # print('network:', network)
    def q_func_builder(input_placeholder, num_actions, scope, reuse=False):
        with tf.variable_scope(scope, reuse=reuse):
            latent = network(input_placeholder)
            if isinstance(latent, tuple):
                if latent[1] is not None:
                    raise NotImplementedError("DQN is not compatible with recurrent policies yet")
                latent = latent[0]

            latent = layers.flatten(latent)

            with tf.variable_scope("action_value"):
                action_out = latent
                for hidden in hiddens:
                    action_out = layers.fully_connected(action_out, num_outputs=hidden, activation_fn=None)
                    if layer_norm:
                        action_out = layers.layer_norm(action_out, center=True, scale=True)
                    action_out = tf.nn.relu(action_out)
                action_scores = layers.fully_connected(action_out, num_outputs=num_actions, activation_fn=None)

            if dueling:
                with tf.variable_scope("state_value"):
                    state_out = latent
                    for hidden in hiddens:
                        state_out = layers.fully_connected(state_out, num_outputs=hidden, activation_fn=None)
                        if layer_norm:
                            state_out = layers.layer_norm(state_out, center=True, scale=True)
                        state_out = tf.nn.relu(state_out)
                    state_score = layers.fully_connected(state_out, num_outputs=1, activation_fn=None)
                action_scores_mean = tf.reduce_mean(action_scores, 1)
                action_scores_centered = action_scores - tf.expand_dims(action_scores_mean, 1)
                q_out = state_score + action_scores_centered
            else:
                q_out = action_scores
            return q_out

    return q_func_builder

根据上面的分析,在执行network = get_network_builder(network)(**network_kwargs)语句后,network相当于是10里的network_fn(X)函数

接着分析q_func_builder():

那么到此为止,这个网络的构造已经分析完了。现在再回到3来看下

q_func = build_q_func(network, **network_kwargs)

它只需要调用这一条语句,就可以得到一个构建网络图的函数了。q_func只是一个函数,还未进行传参和网络图的构建。

深度强化学习(Deep Reinforcement Learning) 原理与代码实例讲解
程序员光剑
06-27 779
深度强化学习(Deep Reinforcement Learning) - 原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词:深度强化学习,强化学习,神经网络,智能代理
大语言模型原理基础与前沿 基于人工智能反馈的强化学习
程序员光剑
06-27 900
大语言模型原理基础与前沿 基于人工智能反馈的强化学习 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词:大语言模型 (Large Language Models), 强化学习 (Reinforcement Learning),
论文阅读笔记 | 用深度强化学习玩Atari
weixin_46257633的博客
04-26 1049
论文阅读笔记 | 用深度强化学习玩Atari Abstract 使用强化学习从高维感官输入直接学习控制策略的深度学习模型。该模型是一个卷积神经网络,使用Q-learning的变体进行训练,输入为原始像素,输出为估计未来报酬的值函数。 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,...
深度强化学习玩Atari游戏
步子哥的博客
07-13 629
相比之下,我们的算法是在ε-贪婪控制序列上评估的,因此必须泛化到各种可能的情况。我们的方法在测试的7个游戏中的6个游戏上给出了最先进的结果,而且没有调整架构或超参数。我们在所有7个游戏中使用相同的网络架构、学习算法和超参数设置,表明我们的方法足够健壮,可以在各种游戏中工作,而无需引入特定于游戏的先验知识。由于智能体只能观察到当前屏幕的图像,因此这是一个部分可观察的任务,许多环境状态在感知上是混淆的。我们使用的架构中,每个可能的动作都有一个单独的输出单元,只有状态表示作为神经网络的输入。
开源项目Baselines安装与使用指南
最新发布
gitblog_01143的博客
08-08 958
开源项目Baselines安装与使用指南 baselinesOpenAI Baselines: high-quality implementations of reinforcement learning algorithms项目地址:https://gitcode.com/gh_mirrors/ba/baselines 目录结构及介绍 该项目遵循了清晰的组织结构,便于开发者理解和扩展。以下是主...
强化学习:玩转Atari-Pong游戏
qq_41188247的博客
11-14 2999
强化学习:玩转Atari-Pong游戏
强化学习----雅达利游戏(atari)模块的安装
qq_35027690的博客
01-06 3060
看了网上的部分教程,分别采用过这两个命令安装过, pip install gym[atari] pip install atari_py 然而在ide中使用时仍会报错。 后来发现,先执行: pip uninstall atari_py 再执行: pip install --no-index -f https://github.com/Kojoley/atari-py/releases ata...
强化学习的A3C算法应用(训练Atari游戏
01-28 7547
A3C算法的全称是Asynchronous Advantage Actor-Critic,异步优势执行者/评论者算法。这个算法和优势执行者/评论者算法的区别在于,在执行过程中不是每一步都更新参数,而是在回合结束后用整个轨迹进行更新。因此可以让多个Worker来进行轨迹的搜集和参数更新。每个执行者的更新都是异步的。这个算法与优势执行者/评论者算法相比,优点在于可以大大提高执行效率,因为对于策略更新算法来说,最耗时间的是在轨迹的搜集部分。 算法的步骤如下: 输入:环境 输出:最优策略的估计 参数:优化器
深度强化学习方法(DQN)玩转Atari游戏pong
热门推荐
libenfan的博客
05-30 1万+
Atari Pong 简介 Pong是起源于1972年美国的一款模拟两个人打乒乓球的游戏,近几年常用于测试强化学习算法的性能。这篇文章主要记录如何用DQN实现玩Atari游戏中的Pong,希望对和我一样的小白有所帮助,文章最后附本文代码及参考代码 环境介绍: torch = 1.8.0+cu111 Python = 3.8.5 装环境的过程见本人另一篇博客https://blog.csdn.net/libenfan/article/details/116396388?spm=1001.2014.3001.
AI架构师必知必会系列:强化学习在金融领域的应用
程序员光剑
12-05 338
在金融领域,如何制定最优决策以实现收益最大化和风险最小化一直是一个核心问题。传统的金融决策方法主要依赖于统计模型和专家经验,但在面对日益复杂多变的金融市场时,这些方法往往难以适应和优化。近年来,随着人工智能技术的快速发展,强化学习作为一种智能决策方法受到了金融领域的广泛关注。
Qlearning算法流程:逐步解析学习过程
程序员光剑
04-27 334
1. 背景介绍 1.1 强化学习概述 强化学习 (Reinforcement Learning, RL) 属于机器学习的一个分支,专注于智能体 (agent) 通过与环境互动学习最优策略。不同于监督学习,强化学习没有明确的标签数据,而是通过奖励 (reward) 来引导学习过程。智能体根据当前状态 (s
deep-reinforcement-learning-atari-pong:强化学习DQN算法的PyTorch在OpenAI Atari Pong游戏中的应用
03-12
Atari Pong中的深度强化学习算法 概括 此应用程序的目标是找出深度Q学习(DQN)在OpenAI环境中对Pong的Atari 1600游戏有多准确和有效。 在DQN之上,测试了对相同算法的其他改进,包括多步DQN,Double DQN和Dueling DQN。 从下图可以看出,基本DQN仅需玩约110场游戏即可达到类似于人的准确性,而经过300场游戏即可达到极高的准确性。 此项目中考虑的DQN改进版本显示出效率和准确性方面的一些改进。 基本DQN:第1集与第216集 环保环境 Atari 1600仿真器由OpenAI制作,您可以在59种不同的游戏上测试您的强化算法。 使用深度强化学习,因为输入是当前帧(210x160x3)的RGB图片。 由于RGB图片的计算量太大,因此变成了灰度。 接下来是将图像缩减采样并将其剪切到可播放区域,该区域的大小为84x84x1。 灰度,下采样和裁剪
强化学习baseline项目之gym中的Atari游戏环境重写
01-06
gym中集成的atari游戏可用于DQN训练,但是操作还不够方便,于是baseline中专门对gym的环境重写,以更好地适应dqn的训练      从源码中可以看出,只需要重写两个函数 reset()和step() ,由于render()没有被重写,所以画面就没有被显示出来了 1.NoopResetEnv()函数,功能:前30帧画面什么都不做,跳过。这有利于增加初始画面的随机性,不容易陷入过拟合 class NoopResetEnv(gym.Wrapper): def __init__(self, env, noop_max=30): Sample initial
强化学习 --baseline项目之gym中的Atari游戏环境重写
qq_41832757的博客
02-19 5070
gym中集成的atari游戏可用于DQN训练,但是操作还不够方便,于是baseline中专门对gym的环境重写,以更好地适应dqn的训练      从源码中可以看出,只需要重写两个函数 reset()和step() ,由于render()没有被重写,所以画面就没有被显示出来了 1.NoopResetEnv()函数,功能:前30帧画面什么都不做,跳过。这有利于...
用深度强化学习玩atari游戏_Pytorch深度强化学习 1.用DQN解决Atari game
weixin_39551103的博客
11-24 2588
我一直对强化学习感兴趣,这学期正好选了一门强化学习的课,第一次作业是让复现DQN。这几年也看了不少DQN的代码,但要自己实现起来,还是犯晕,效率很低。这篇文章从深度强化学习所需的元素出发,达到用DQN解决atari games的目的。1. Observe, Value, Act强化学习研究的是Agent和环境交互中如何学习最优策略,以获得最大收益。Agent需要能够观察环境(observe)的到所...
深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)
showswoller的博客
11-25 5796
深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)
用深度强化学习玩atari游戏_(一)深度强化学习·入门从游戏开始
weixin_39673303的博客
12-04 1100
1.在开始正式进入学习之前,有几个概念需要澄清,这样有利于我们对后续的学习有一个大致的框架感监督型学习与无监督型学习深度强化学习的范畴监督型学习是基于已有的带有分类标签的数据集合,来拟合神经网络,用以判断新的输入类型。无监督型学习是对无标签的数据集合,仅基于数据结构特征,对数据进行分类,比如常见的K-means。那么深度强化学习属于哪一种分类?深度强化学习通过自身与环境的交互获取数据集合,但这些数...
NumPy 应用:使用像素玩 Pong 的深度强化学习
数智笔记
02-20 1020
在本节中,您将设置一个计算折扣回报()的函数 —— 从观测中得到的预期回报 —— 它使用一个包含奖励的 1D 数组作为输入(借助 NumPy 的 np.zeros_like()函数)。为了对短期奖励给予更多权重,而不是长期奖励,您将使用一个折扣因子(gamma),通常是 0.9 到 0.99 之间的浮点数。# 从最后一个回报到第一个...# ...重置回报总和if r[t]!= 0:# ...计算折扣回报。
用深度强化学习玩atari游戏_强化学习快餐教程(2) - atari游戏
weixin_39573781的博客
12-04 472
# 强化学习快餐教程(2) - atari游戏不知道看了上节的内容,大家有没有找到让杆不倒的好算法。现在我们晋阶一下,向世界上第一种大规模的游戏机atari前进。## 太空入侵者可以通过```pip install atari_py```来安装atari游戏。下面我们以SpaceInvaders-v0为例看下Atari游戏环境的特点。### 图形版在太空入侵者中,支持的输入有6种,一个是什么也不...
stable-baselines文档
05-12
Stable-Baselines是用于训练强化学习算法的Python库,它提供多种强化学习算法,例如DQN、PPO、ACER、TRPO、ACKTR等。该库建立在OpenAI Gym、TensorFlow和NumPy之上,具有可重复使用、轻松调整和高效运行的设计理念,...
写文章

热门文章

  • 实习生去公司都干些啥 7563
  • 边长为n的正方形最多可以放下多少个半径为r的圆? 5761
  • 强化学习 --baseline项目之gym中的Atari游戏的环境重写 5070
  • 对论文 Deep Learning with Limited Numerical Precision 的理解与结论的验证 2196
  • 强化学习 ---baselines项目之 Atari游戏的网络结构解析 1764

分类专栏

  • 杂七杂八
  • 实习 2篇
  • 面试 4篇
  • ACM算法 2篇
  • 强化学习 4篇
  • 论文验证 1篇

最新评论

  • 边长为n的正方形最多可以放下多少个半径为r的圆?

    yuangungun666: 为什么长度是√3r啊

  • 边长为n的正方形最多可以放下多少个半径为r的圆?

    xywwww6666: 有没有Python的代码

  • 边长为n的正方形最多可以放下多少个半径为r的圆?

    伍六七800: 如果不能整除呢

  • 实习生去公司都干些啥

    一定要加油加油!: 我还好,我跟我同学一家公司,他技术硬,我跟着混

  • 实习生去公司都干些啥

    锈迹弦音: 月底可能 就卷铺走人了

最新文章

  • 京东广告算法面试
  • 华师大机器学习2021期末考试题
  • 实习生去公司都干些啥
2021年2篇
2020年5篇
2019年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家广东酒店艺术玻璃钢雕塑潍坊公园玻璃钢雕塑定制威海园林玻璃钢雕塑制作吉林仿铜玻璃钢雕塑价位玻璃钢雕塑安装效果制造玻璃钢迎宾人物雕塑玻璃钢花盆的未来发展趋势河北定制玻璃钢雕塑多少钱玻璃钢猫咪造型雕塑佛山主题玻璃钢雕塑厂家黄山玻璃钢雕塑人物定制江苏商场美陈研发安徽玻璃钢花盆生产企业家具建材商场美陈图片促销玻璃钢雕塑美人鱼大庆玻璃钢雕塑订制价格仿铜玻璃钢雕塑联系方式专业的玻璃钢雕塑麋鹿电器商场美陈布展照片曲阳玻璃钢公园雕塑孝感玻璃钢花盆玻璃钢雕塑仿铁效果泰州玻璃钢花盆室内玻璃钢雕塑加工南平手糊法玻璃钢雕塑销售南充玻璃钢雕塑制作厂家张掖玻璃钢动物雕塑设计玻璃钢梅花鹿雕塑图片深圳户外商场美陈销售公司台州玻璃钢雕塑供应商香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化