当前位置: 首页 > news >正文

wordpress网站描述泉州建站模板

wordpress网站描述,泉州建站模板,域名弄好了网站怎么建设,多国语言 网站源码VGG16能让某个指定的feature map激活值最大化图片的可视化 在前面的文章中#xff0c;我用jupyter notebook分别实现了#xff0c;预训练好的VGG16模型各层filter权重的可视化和给VGG16输入了一张图像#xff0c;可视化VGG16各层的feature map。深度学习 --- VGG16卷积核的可…   VGG16能让某个指定的feature map激活值最大化图片的可视化 在前面的文章中我用jupyter notebook分别实现了预训练好的VGG16模型各层filter权重的可视化和给VGG16输入了一张图像可视化VGG16各层的feature map。深度学习 --- VGG16卷积核的可视化(JupyterNotebook实战)-CSDN博客文章浏览阅读653次点赞11次收藏8次。本文是基于JupyterNotebook的VGG16卷积核的可视化实战有代码也有详细说明https://blog.csdn.net/daduzimama/article/details/141460156 深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)-CSDN博客文章浏览阅读1k次点赞16次收藏24次。在VGG16模型中输入任意一张图片VGG16模型就能给出预测结果但为什么会得到这个预测结果通过观察每层的feature map或许有助于我们更好的理解模型。https://blog.csdn.net/daduzimama/article/details/140279255         在这篇文章中需要可视化的是看看究竟什么的图像会令众多feature map/activation map中的某个activation map的激活值最大化。例如看看什么样的图像会让block2_conv2中的第123个feature map的激活值最大化。 这个算法的整体思路如下 1利用已有的不包含顶层的VGG16模型创建一个输出为指定层指定feature map的新模型 2创建一个图像尺寸和模型输入层维度相同的随机噪声图并假设他就是那个能够令指定feature map激活最大化的输入图像作为初值。 3定义损失函数这个损失函数的输入是刚才创建随机噪声图像输出为指定feature map的激活值总和。 4创建优化器使用梯度上升的反向传播方式使得损失函数的函数值最大化。逐步迭代最终把原始的随机噪声图像变成我们想要的能够最大化feature map的输入图像。 1导入需要用到的库函数 import tensorflow as tf print(tf.__version__) print(tf.keras.__version__)from tensorflow.keras.applications import VGG16 from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.vgg16 import preprocess_input import numpy as np import matplotlib.pyplot as plt 2加载不包括顶层VGG16的模型 modelVGG16(weightsimagenet,include_topFalse) model.summary()# 获取该模型的总层数 total_layers len(model.layers)# 输出总层数 print(f模型的总层数为: {total_layers})# 输出每一层所对应的名字便于后续选择feature map时使用 for i in range(total_layers):print(f第{i}层是{model.layers[i].name}) 3定义损失函数 定义损失函数也就是定义feature map关于输入图像的函数。因此损失函数的输入是我们后面自定义的模型model输入图像和指定feature map的index。输出是整张指定feature map值的均值。 # 损失函数的输入为你所使用的model,输入图像和指定feature map的index输出是指定层的某个卷积核的激活值的均值 def loss_function(model,input_image,feature_map_num):activations model(input_image)#获得input_image在新模型中产生的所有特征图activations 是一个四维张量其维度如下第一个维度 (batch size): 代表输入批次的大小。通常情况下如果只输入了一张图像这个维度的值为 1。第二个维度 (height): 代表特征图的高度。随着网络层数的增加通常由于池化层Pooling Layer的作用这个维度会逐渐减小。第三个维度 (width): 代表特征图的宽度。和高度一样宽度通常也会随着网络的加深而减小。第四个维度 (channels/filters): 代表特征图的通道数或者说在当前层中使用的滤波器的数量。这个维度表示在每一层中所提取的不同特征的数量。loss tf.reduce_mean(activations[:, :, :, feature_map_num])return loss ”activations model(input_image)“这句话的意思是把随机生成的输入图像喂给新建的模型计算输出相应层所有的outputoutput即feature map。并且把指定层所有的feature map保存在activations中。  “loss tf.reduce_mean(activations[:, :, :, feature_map_num])”这句话的意思是根据函数输入的feature_map_num在activations选择当前层指定的feature map也就是我们需要最大化的那个feature map并计算这个张量的均值。 最终把整张feature map的均值通过loss函数传出去。 上述过程如果用数学模型来表示的话大致可写成这里不一定严谨仅供参考 这样看来损失函数L是input image的复合函数feature map是input image的函数。 4定义计算梯度的函数   梯度是用于反向传播的这里所计算的梯度是损失函数相对于输入图像的梯度。 def gradient_function(model,image,feature_map_num):#创建 tf.GradientTape 对象:#TensorFlow 的 tf.GradientTape 是一个自动微分工具它可以记录运算过程中涉及的所有变量并计算这些变量相对于某个损失函数的梯度。with tf.GradientTape() as tape:#监视输入图像:这里明确告诉 GradientTape 需要监视 image 这个张量确保后续可以计算相对于 image 的梯度。tape.watch(image)#计算损失函数loss loss_function(model,image,feature_map_num)#通过 tape.gradient() 计算损失 loss 相对于输入图像 image 的梯度。#这会返回一个张量 gradient表示如何调整输入图像以最大化或最小化损失。 gradient tape.gradient(loss, image)return loss,gradient 计算损失函数相对于输入图像的梯度的目的是为了通过反向传播也就是梯度上升不断地优化输入图像。这一过程也可以用数学公式简单的表示如下 因此第一步是调用先前定义的损失函数计算loss。 第二步就调用tensorflow自带的计算梯度的函数tf.GradientTape去计算梯度。其中tape.gradient的第一个输入是损失函数的值loss第二个要输入的变量是损失函数相对于谁的梯度比如说在本例中要计算损失函数相对于输入图像input image的梯度所以这里输入的就是随机初始化的input image。 5定义用于优化图像显示效果的函数 通过梯度上升反向传播得到的能够令某个feature map最大化的input image无法直接通过imshow函数显示因此这里定义了一个专门针对无法显示问题的优化函数。 def proc_img(input_image):# input_image.numpy(): 将 TensorFlow 张量转换为 NumPy 数组。# .squeeze(): 移除数组中维度为1的条目。例如(1, 224, 224, 3) 会变成 (224, 224, 3)。这一步是为了去除批量维度使图像的形状更适合显示。input_image input_image.numpy().squeeze()#print(frange of result image:[{input_image.min(),input_image.max()}])# np.clip(optimized_image, 0, 255): 将图像像素值限制在 0 到 255 的范围内。优化过程中像素值可能会超出这个范围这一步将其剪切回有效范围。# .astype(uint8): 将数组数据类型转换为 uint8这是图像数据的标准类型确保图像可以正确显示。input_image np.clip(input_image, 0, 255).astype(uint8)return input_image 优化显示图像主要分四步 1通过梯度上升优化后的图像是一个tensorflow张量tensorflow张量是无法通过imshow直接显示的。这里的第一步是把tensorflow张量转换成Numpy数组。 2我们之前创建的tensorflow张量是一个1x224x224x3的4维向量四维向量是无法显示的因此在这里通过squeeze函数去掉第一个维度得到224x224x3的向量。 3把图像像素值的范围限制到0~255之间。 4将图像的数据类型改成uint8。 6创建输出层为feature map的新模型 #从model_without_top中选择新模型的输出层 layer_num1#获得指定层的全部输出/feature map layer_outputmodel_without_top.layers[layer_num].output print(layer_output.shape)# 创建一个新的模型这个模型的输入层等同于 VGG16 模型的输入层而输出是指定层的所有特征图 activation_model tf.keras.Model(inputsmodel_without_top.input, outputslayer_output) activation_model.nameactivation model activation_model.summary()# 获取该模型的总层数 total_layers len(activation_model.layers)# 输出总层数 print(f模型的总层数为: {total_layers}\n) 使用keras的Model函数构建自定义模型这个模型的输入层和前面已经创建好的不带顶层的VGG16模型的输入层一样。这个模型的输出则是指定层的feature map同样也是来自于前面创建好的VGG16模型model without top。这就是说如果使用该模型进行计算你是无法访问中间层的中间结果的。你指定的是哪层就 熟练了以后上述代码可简写为 #从model_without_top中选择新模型的输出层 layer_num1# 创建一个新的模型这个模型的输入层等同于 VGG16 模型的输入层而输出是指定层的所有特征图 activation_model tf.keras.Model(inputsmodel_without_top.input, outputsmodel_without_top.layers[layer_num].output) activation_model.nameactivation model activation_model.summary()# 获取该模型的总层数 total_layers len(activation_model.layers)# 输出总层数 print(f模型的总层数为: {total_layers}\n) 新模型被命名为activation model。  7获得能够令当前层指定feature map最大化的输入图像 # 固定随机化种子 np.random.seed(42) tf.random.set_seed(42)# 在指定层中选择指定的feature map feature_map_num4# 用随机数初始化图像初始值的范围为 [108, 148]。 random_InputImg tf.Variable(np.random.random((1, 224, 224, 3)) * 20 128, dtypetf.float32)#学习率 lr5.1# 创建优化器 optimizer tf.keras.optimizers.Adam(learning_ratelr)# 迭代次数 its 30# 开始梯度上升优化 for i in range(its):loss,gradients gradient_function(activation_model,random_InputImg,feature_map_num)# apply_gradients的主要功能是将梯度应用到相应的变量上以更新这些变量的值从而在训练过程中最小化或最大化目标函数。optimizer.apply_gradients([(-gradients, random_InputImg)])# 打印每轮的损失值print(fEpoch {i1}/{its}, Loss: {loss.numpy()})# 改进显示效果后的图像 MaxActivation_Imgproc_img(random_InputImg)# 显示结果 plt.figure(figsize(8, 8)) plt.imshow(MaxActivation_Img) plt.title(fMaxActivation Image for Filter {feature_map_num} in Layer {activation_model.layers[layer_num].name}) plt.show() 这里选择能够让block1_conv1层的64个feature map中的第0个feature map激活值最大化的图像长什么样         需要输入的参数有三个一是用“feature_map_num”选择你希望让该模型的哪个feature map的值最大化二是学习率“lr”它可以控制梯度上升算法的迭代速度。学习率越高迭代速度越快但太快了也有可能引发别的问题。三是迭代次数its迭代次数越多模型学习和迭代的次数就越多。 这里用到了前面定义好的三个函数gradient_function(计算梯度)loss_function(计算损失函数的函数值)和proc_img(优化)最后用keras自带的优化器Adam中的apply_gradients函数使用前面计算好的gradient更新random_InputImg。 若令feature_map_num0lr5.1its30则会得到如下的迭代结果 可见每次迭代损失函数的值Loss都在持续增长经过30次迭代后从最开始的8.1一直增长到290。对图像可视化后得到如下结果 这就是说如果输入图像长的像上面这个样子则能使得block1_conv1层的第0个feature map的激活值最大化。 8测试图像 通过前面一系列的操作已经得到了能够令block1_conv1层的第0个feature map的激活值最大的图像。现在我打算把这个刚刚得到的这个图像喂到模型中看看在所有的64个feature map中第0个filter所产生的feature map是足够大如果相应feature map的激活值够大那他的激活值是最大的吗其他的feature map表现又当如何呢 # 把生成的图像喂给模型进行预测 result_featuresactivation_model.predict(random_InputImg)# 设置字体为 SimHei (黑体) plt.rcParams[font.sans-serif] [SimHei] # 避免中文字体显示不正常 plt.rcParams[axes.unicode_minus] False# 绘制前8x8个特征图 N64 plt.figure(figsize(35,35)) for i in range(N):plt.subplot(N//81, 8, i1) plt.imshow(result_features[0, :, :, i]) # 显示特征图mean_featurenp.mean(result_features[0, :, :, i])# 计算当前feature map的均值#plt.title(f当前feature map的mean{mean_feature})if mean_feature770:plt.title(f当前feature map的mean{mean_feature})plt.axis(off) # 隐藏坐标轴 plt.show() 以下是具体的计算结果 (这是64个feature map及其对应的feature map的均值) 下图为放大后的前两行feature map局部其中用红框框出来的就是index0的第0个feature map及其均值。 图中所显示的均值为300这和前面经过多次迭代后的loss290接近。 至于其他各个feature map的mean究竟是什么样的大家可以自己看看。就我自己这边的观察我发现其他feature map的均值并不都是很小的也有一些是200多的这一点让我个人觉得似乎不太理想也就是说实际上各个feature map之间还是有一定相关性的。 为了看看第0个feature map的均值是不是这64个中最大的以及如果有比他大的还有哪些呢可以对之前code中的注释部分做如下修改这段if语句的目的是在subplot的时候只在均值大于300个子图上显示title。  最终得到如下结果可见在64个feature map中index为0的feature map确实是最大的。注意并不是说前面生成的input image必须要让预先指定feature map是所有feature map中最大才行只要指定位置的feature map够大就好了。 事实上上面的那个例子还是比较特殊的我这里说的特殊主要是指经过梯度上升迭代后产生的图像使得第0个feature map的值是64个中最大的。实际上更为普遍的现象是经过迭代所产生的图像只会使得指定位置的feature map最大化至于其他feature map的值究竟是大还是小这两件事是相互独立的。下面我再多举两个例子说明。 例1block1_conv1feature map index4 修改参数feature_map_num为4并全部重新运行所有的cell得到如下结果。 经过30次梯度上升迭代后损失函数的值增加到了90。相应的图像如下图所示 打印所有feature map的均值并查看对应位置的均值。 当前feature map的均值为93.5和前面计算的90比较接近。  但如果我如法炮制通过if语句只让均值大于93的feature map显示title会怎么样呢还是只有index为4的feature map上才会显示title吗让我们拭目以待。 可以看到大量feature map都显示了title这说明他们的均值都大于93.有的甚至比93要大很多,比如说用在下图中用红色方框框出来的图。 他们两个一个的feature map是265另一个更是高达355。 这恰好从另一个角度说明了我们最大化指定feature map的实验目的:        那就是只保证程序中指定的feature map最大化至于当前层的其他feature map则不在我们的考虑范围之内。因为很有可能能够令index4的feature map最大化的输入图像能够令index12,30...的feature map也很大 这里index4的feature map并不是个例下面我们再多看一个例子。 例2block1_conv1feature map index8 其他条件不变把feature map num改成8。  经过30次梯度上升迭代后损失函数的值增加到了730。相应的图像如下图所示 通过显示所有feature map的title并打印所有feature map所对应的mean可知把前面计算好的图像喂给model后在对应位置的feature map310。 现在把if函数显示title的阈值改为310得到如下结果 可见依然激活了多个不同位置的feature map且均值都在310以上。 9定义能够令多个位置的feature map最大化的批处理函数 def activation_max_images(model,layer_num,lr,its):# 创建一个新的模型这个模型的输入是 VGG16 模型的输入而输出是指定层的特征图Activation_model tf.keras.Model(inputsmodel.input, outputsmodel.layers[layer_num].output)Activation_model.summary()# 创建用于保存output image的列表MaxActivation_Imgs[]# 创建用于保存loss的列表Final_Loss[]for feature_map_num in range(N):# 初始化图像np.random.seed(42) # 固定随机种子random_InputImg tf.Variable(np.random.random((1, 224, 224, 3)) * 20 128, dtypetf.float32)print(fprocess image{feature_map_num})# 创建优化器对象optimizer tf.keras.optimizers.Adam(learning_ratelr)for i in range(its):loss,gradients gradient_function(Activation_model,random_InputImg,feature_map_num)optimizer.apply_gradients([(-gradients, random_InputImg)])# 梯度上升使用的是负的gradients因为优化器本身是基于梯度下降的逻辑。# 打印每轮的损失值print(fEpoch {i1}/{its}, Loss: {loss.numpy()})Final_Loss.append(loss.numpy())print(fprocess image{feature_map_num},done!)# 改进显示效果MaxActivation_Imgproc_img(random_InputImg)MaxActivation_Imgs.append(MaxActivation_Img)return MaxActivation_Imgs,Activation_model,Final_Loss activation_max_images函数能够同时处理多个指定位置的feature map主要是能够一次性处理整个layer的feature map并返回能够让这些feature map最大化的图像。 你需要输入模型类型model指定层layer_num学习率lr和迭代次数its。该函数所返回的是能够令指定feature map最大化的图像包。 10输出能够令block1conv1中前8x8个activation map激活值最大化的输入图像 生成图像 N64 layer_num1# 选择需要最大化的层 iter_num20#迭代次数 lr2.5#学习率MaxAct_imgs,New_model,LossListactivation_max_images(model_without_top,layer_num,lr,iter_num) 显示图像 fig,axsplt.subplots(N//8,8,figsize(15,15)) for i in range(N):rowi//8coli%8axs[row,col].imshow(MaxAct_imgs[i])axs[row,col].axis(off)axs[row,col].set_title(fLoss{LossList[i]:0.2f})plt.suptitle(fInput images that maximize the feature map for Layer: {New_model.layers[layer_num].name},fontsize36) block1conv1  注意这里有几个feature map无法通过反向传播得到我们想要的图像通过观察发现这些图像的初始损失函数为0且梯度也为0。 这可能是因为初始图像无法激活该特征图如果特征图在初始图像上没有激活激活值为0那么即使经过多次迭代损失函数仍然可能保持为0因为输入图像不包含能够激活该特征图的显著特征。 11输出能够令block1conv2中前8x8个activation map激活值最大化的输入图像 layer_num2MaxAct_imgs,New_model,LossListactivation_max_images(model_without_top,layer_num,lr,iter_num) 注意这里layer的index可以参考之前打印的log。  显示图像 fig,axsplt.subplots(N//8,8,figsize(15,15)) for i in range(N):rowi//8coli%8axs[row,col].imshow(MaxAct_imgs[i])axs[row,col].axis(off)axs[row,col].set_title(fLoss{LossList[i]:0.2f})plt.suptitle(fInput images that maximize the feature map for Layer:{New_model.layers[layer_num].name},fontsize36) block1conv2 值得注意的是由于所有feature map的迭代都使用了同一个学习率和相同的迭代次数使得有些图像的loss长的很大比如1000相应的图像也很清晰。而有的loss比较小或者说针对这个feature map还不够大只能生成部分的输出图像(例如我用红框框出来的第63幅图)。这一现象在后续层的处理中会更为明显。 Tips  block1之所以分成两层主要是因为多加一次3x3的卷积感受野要几乎能扩大一倍。一个 3x3 的卷积层的感受野是 3x3。两个堆叠的 3x3 卷积层的感受野是 5x5。三个堆叠的 3x3 卷积层的感受野是 7x7。 12输出能够令block2conv2中前8x8个activation map激活值最大化的输入图像 为了避免前面遇到的因为loss涨的不够多导致图像无法完整显示的问题我在这里预先把学习率从原来的2.5涨到了6.5。  layer_num5 lr6.5MaxAct_imgs,New_model,LossListactivation_max_images(model_without_top,layer_num,lr,iter_num) fig,axsplt.subplots(N//8,8,figsize(15,15)) for i in range(N):rowi//8coli%8axs[row,col].imshow(MaxAct_imgs[i])axs[row,col].axis(off)axs[row,col].set_title(fLoss{LossList[i]:0.2f})plt.suptitle(fInput images that maximize the feature map for Layer:{New_model.layers[layer_num].name},fontsize36) block2conv2  从结果上看虽然增大了学习率可依然无法满足部分feature map梯度上升的需求。部分无法完全显示的图像我已用红框在下图中框出。  为了克服这个问题我在又重新定义了一个新的批处理函数。与原来的批处理不同的是我在新函数迭代的for循环过程中我增加了一个if判断并设置了一个用于判断loss的阈值。这个设计的出发点有两个(在相同的迭代次数和学习率下一个是能够保证原来能够正常显示的图像提前结束循环另一个是给不能正常显示的图像的损失函数loss有足够的增长空间。 改进后的批处理函数 def activation_max_images_th(model,layer_num,lr,its,th):# 创建一个新的模型这个模型的输入是 VGG16 模型的输入而输出是指定层的特征图Activation_model tf.keras.Model(inputsmodel.input, outputsmodel.layers[layer_num].output)Activation_model.summary()# 创建用于保存output image的列表MaxActivation_Imgs[]# 创建用于保存loss的列表Final_Loss[]for feature_map_num in range(N):# 初始化图像np.random.seed(42) # 固定随机种子random_InputImg tf.Variable(np.random.random((1, 224, 224, 3)) * 20 128, dtypetf.float32)print(fprocess image{feature_map_num})# 创建优化器对象optimizer tf.keras.optimizers.Adam(learning_ratelr)for i in range(its):loss,gradients gradient_function(Activation_model,random_InputImg,feature_map_num)optimizer.apply_gradients([(-gradients, random_InputImg)])# 梯度上升使用的是负的gradients因为优化器本身是基于梯度下降的逻辑。# 打印每轮的损失值print(fEpoch {i1}/{its}, Loss: {loss.numpy()})if loss th:breakelif loss0.:breakFinal_Loss.append(loss.numpy())print(fprocess image{feature_map_num},done!)# 改进显示效果MaxActivation_Imgproc_img(random_InputImg)MaxActivation_Imgs.append(MaxActivation_Img)return MaxActivation_Imgs,Activation_model,Final_Loss 调用新批处理函数并设置很大的学习率和很高的阈值。这里的学习率lr和损失函数阈值th需要反复观看结果反复调试才有了下面code中的值。推荐读者自行摸索 layer_num5 lr52.5 iter_num50 th30000MaxAct_imgs,New_model,LossListactivation_max_images_th(model_without_top,layer_num,lr,iter_num,th) 下面是处理结果为了能让那些loss增长很慢的feature map的损失函数增加的足够高我所使用的策略是在维持一个比较大学习率基础上(保证了损失函数的增长速度)尽可能的增加迭代次数(保证了增加次数)通过不断调试最终得到了下面的结果虽然乍一眼看上去图像显示的比较夸张 在后面的文章中我会优先选择视觉上稍微看起来比较舒服的结果而不是这种看起来特别极端的效果。 block2conv1 为了比对在同一层中conv1与conv2的差异这里顺便把block2conv1的结果也画出来。可以看到的是相对于block2conv2层block2conv1层中有很多没有被激活的feature map这说明这些这些位置所关注的特征/或者说是希望提取的特征不在随机初始化的输入图像中。 13输出能够令block3conv3中前8x8个activation map激活值最大化的输入图像 使用传统批处理函数lr2.5iter_num20。 By the way随着网络层数深度的增加计算所花费的时间也会越来越多。 layer_num9 lr2.5 iter_num20 th80000MaxAct_imgs,New_model,LossListactivation_max_images(model_without_top,layer_num,lr,iter_num) #MaxAct_imgs,New_model,LossListactivation_max_images_th(model_without_top,layer_num,lr,iter_num,th) block3conv3 计算结果如下同样的由于对所有的feature map使用了同样的迭代次数和相同的学习率使得有些学习速度慢损失函数较小的图像只显示了部分内容。 使用带有阈值判断的批处理函数lr22.5iter_num30th18000。看看下面这些能够令feature map激活最大的图像们是不是很美 block3conv1 block3conv2 14输出能够令block4conv1中前8x8个activation map激活值最大化的输入图像 layer_num11 lr15.5 iter_num50 th6000MaxAct_imgs,New_model,LossListactivation_max_images_th(model_without_top,layer_num,lr,iter_num,th) block4conv2  block4conv3 实验进行到这里可以看到随着希望最大化feature map的层数进行的越来越深就会有越来越多的feature map的没有被激活这通常是由于以下这些原因 1. 深层卷积层的特征选择性 深层卷积层的特征图通常是对较高阶特征的响应比如复杂的形状、纹理或对象的组合。在这些深层中卷积核学会了识别特定的复杂特征而这些特征在随机初始化的图像中可能并不存在或难以被识别出来。因此这些特征图可能无法对初始图像作出响应导致激活值为零。 2. 特征图的稀疏性 随着网络的加深卷积层的特征图通常会变得更加稀疏。也就是说特征图中非零激活的区域会变得越来越少因为深层卷积核倾向于只对某些特定的复杂特征有强烈响应。对于一个随机初始化的图像深层特征图可能没有足够的信息来激活这导致激活值为零。 15输出能够令block5conv1中前8x8个activation map激活值最大化的输入图像 layer_num15 lr25.5 iter_num30 th6000MaxAct_imgs,New_model,LossListactivation_max_images_th(model_without_top,layer_num,lr,iter_num,th) block5conv2 block5conv3 全文完  --- 作者松下J27 参考文献(鸣谢)  1代码实战-可视化使VGG16各卷积层激活最大的原始图像_哔哩哔哩_bilibili 2Stanford University CS231n: Deep Learning for Computer Vision 3可视化卷积神经网络_哔哩哔哩_bilibili (配图与本文无关) 版权声明所有的笔记可能来自很多不同的网站和说明在此没法一一列出如有侵权请告知立即删除。欢迎大家转载但是如果有人引用或者COPY我的文章必须在你的文章中注明你所使用的图片或者文字来自于我的文章否则侵权必究。 ----松下J27  
文章转载自:
http://www.morning.ysybx.cn.gov.cn.ysybx.cn
http://www.morning.bgrsr.cn.gov.cn.bgrsr.cn
http://www.morning.nrddx.com.gov.cn.nrddx.com
http://www.morning.ykrkb.cn.gov.cn.ykrkb.cn
http://www.morning.bmnm.cn.gov.cn.bmnm.cn
http://www.morning.bmzxp.cn.gov.cn.bmzxp.cn
http://www.morning.hhpbj.cn.gov.cn.hhpbj.cn
http://www.morning.qsy37.cn.gov.cn.qsy37.cn
http://www.morning.wxfgg.cn.gov.cn.wxfgg.cn
http://www.morning.twpq.cn.gov.cn.twpq.cn
http://www.morning.xsjfk.cn.gov.cn.xsjfk.cn
http://www.morning.gtdf.cn.gov.cn.gtdf.cn
http://www.morning.zrks.cn.gov.cn.zrks.cn
http://www.morning.rpstb.cn.gov.cn.rpstb.cn
http://www.morning.tyhfz.cn.gov.cn.tyhfz.cn
http://www.morning.tnrdz.cn.gov.cn.tnrdz.cn
http://www.morning.spfq.cn.gov.cn.spfq.cn
http://www.morning.jgncd.cn.gov.cn.jgncd.cn
http://www.morning.wffxr.cn.gov.cn.wffxr.cn
http://www.morning.twdkt.cn.gov.cn.twdkt.cn
http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn
http://www.morning.thntp.cn.gov.cn.thntp.cn
http://www.morning.rpdmj.cn.gov.cn.rpdmj.cn
http://www.morning.jpbky.cn.gov.cn.jpbky.cn
http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn
http://www.morning.buyid.com.cn.gov.cn.buyid.com.cn
http://www.morning.ydrfl.cn.gov.cn.ydrfl.cn
http://www.morning.qiyelm.com.gov.cn.qiyelm.com
http://www.morning.mlfgx.cn.gov.cn.mlfgx.cn
http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn
http://www.morning.ypjjh.cn.gov.cn.ypjjh.cn
http://www.morning.tfsyk.cn.gov.cn.tfsyk.cn
http://www.morning.ydnxm.cn.gov.cn.ydnxm.cn
http://www.morning.rbknf.cn.gov.cn.rbknf.cn
http://www.morning.srgbr.cn.gov.cn.srgbr.cn
http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn
http://www.morning.pwppk.cn.gov.cn.pwppk.cn
http://www.morning.sqfnx.cn.gov.cn.sqfnx.cn
http://www.morning.hnkkf.cn.gov.cn.hnkkf.cn
http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn
http://www.morning.gfmpk.cn.gov.cn.gfmpk.cn
http://www.morning.ctfh.cn.gov.cn.ctfh.cn
http://www.morning.nqlkb.cn.gov.cn.nqlkb.cn
http://www.morning.cwyrp.cn.gov.cn.cwyrp.cn
http://www.morning.dfdhx.cn.gov.cn.dfdhx.cn
http://www.morning.tnthd.cn.gov.cn.tnthd.cn
http://www.morning.lnyds.cn.gov.cn.lnyds.cn
http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn
http://www.morning.wkxsy.cn.gov.cn.wkxsy.cn
http://www.morning.rpgdd.cn.gov.cn.rpgdd.cn
http://www.morning.ljyqn.cn.gov.cn.ljyqn.cn
http://www.morning.spghj.cn.gov.cn.spghj.cn
http://www.morning.tygn.cn.gov.cn.tygn.cn
http://www.morning.xdjwh.cn.gov.cn.xdjwh.cn
http://www.morning.bkqdg.cn.gov.cn.bkqdg.cn
http://www.morning.nnqrb.cn.gov.cn.nnqrb.cn
http://www.morning.bqqzg.cn.gov.cn.bqqzg.cn
http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn
http://www.morning.hylbz.cn.gov.cn.hylbz.cn
http://www.morning.xzgbj.cn.gov.cn.xzgbj.cn
http://www.morning.qfkxj.cn.gov.cn.qfkxj.cn
http://www.morning.psqs.cn.gov.cn.psqs.cn
http://www.morning.a3e2r.com.gov.cn.a3e2r.com
http://www.morning.glbnc.cn.gov.cn.glbnc.cn
http://www.morning.rxnxl.cn.gov.cn.rxnxl.cn
http://www.morning.bjndc.com.gov.cn.bjndc.com
http://www.morning.gslz.com.cn.gov.cn.gslz.com.cn
http://www.morning.splkk.cn.gov.cn.splkk.cn
http://www.morning.bqpg.cn.gov.cn.bqpg.cn
http://www.morning.dpwcl.cn.gov.cn.dpwcl.cn
http://www.morning.rbylq.cn.gov.cn.rbylq.cn
http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn
http://www.morning.qjldz.cn.gov.cn.qjldz.cn
http://www.morning.lmjkn.cn.gov.cn.lmjkn.cn
http://www.morning.bppml.cn.gov.cn.bppml.cn
http://www.morning.jwbfj.cn.gov.cn.jwbfj.cn
http://www.morning.nzfqw.cn.gov.cn.nzfqw.cn
http://www.morning.nkkpp.cn.gov.cn.nkkpp.cn
http://www.morning.bctr.cn.gov.cn.bctr.cn
http://www.morning.prjty.cn.gov.cn.prjty.cn
http://www.tj-hxxt.cn/news/260348.html

相关文章:

  • 重庆需要网站建设网站建设 制作公司
  • 网络推广话术开场白郑州seo技术博客
  • 手机网站开发者工具阜宁做网站
  • 网站被k申述wordpress更换服务器
  • 网站建设与设计毕业设计樟木头镇网站仿做
  • 个人备案 可以做企业网站吗网页美工设计参考文献
  • 保定网站建设方案推广免费wordpress主机
  • 提交网站黑龙江今天的新消息
  • 网站开发的需求文档模板做网页的技术
  • 华为网站的建设目标网络营销方式有哪些
  • 烟台高端网站制作公司wordpress 修改目录id
  • 莆田外贸网站建设网站建设书店目标客户分析
  • 网站建设企业策划书陕西建设网站电子政务大厅
  • 网站动态背景欣赏广东网站建设哪家
  • 建网站用什么工作站免费注册企业网站
  • 分析网站的网站flash布局 的优秀网站
  • 网站的服务器每年都要续费的吗山东mip网站建设
  • 服务器放多个网站手机seo排名
  • 放心的网站设计制作wordpress相对路径设置
  • 建设银行网站打不开别的网站可以用吗网站404页面编写
  • seo推广营销网站专门做书单的网站
  • 企业邮箱注册申请126官网seo网站诊断分析报告
  • 深圳网站的设计公司云互联的网站名字
  • 用KEGG网站做通路富集分析商城类网站建设步骤
  • 网站问题有哪些内容网站建设官方商城
  • 空包网网站怎么做的wordpress主题模板
  • 高校教学网站建设做电影网站服务器需求
  • 网站建设的管理网站开发设计方案
  • 做报名表的网站长沙人才招聘网长沙58同城招聘网
  • 网站做视频好不好网站优化可以做哪些优化