YA

In me the tiger sniffes the rose.

  • 主页
  • 世界之内
  • 世界之外
  • 叶隙随笔
所有文章 友链 关于我

YA

In me the tiger sniffes the rose.

  • 主页
  • 世界之内
  • 世界之外
  • 叶隙随笔

【Introduction to TensorFlow】03 卷积神经网络与复杂数据集

阅读数:21956次 2019-10-31
字数统计: 2.2k字   |   阅读时长≈ 8分

上一节使用了几层简单的神经网络实现了对Fashion MNIST数据集中10种衣物的识别。我们将一张图的每一个像素都作为一个参考因素,来训练我们的模型,但是其实一张图有很多没有用的地方,这就给训练模型增加了负担。那么接下来要学习的,就是一种能够少注意图像冗余信息,多注意图像重要信息的模型。本节包括week3和week4的内容。

week3讲述了CNN,卷积神经网络,一种压缩图像、获取图像特征的模型。本节首先概述CNN的重要概念:卷积,池化,然后使用TF实现这两个概念,搭建一个卷积神经网络,在Fashion MNIST中训练。

Fashion MNIST的图片是28*28的小图,且所有的物体都居中展示。week4则将进一步学习如何使用TF的API对更大、更复杂、更不整齐的图像进行预处理,并且在预处理后的图像上施展CNN的魔法。


Enhancing Vision with Convolutional Neural Networks

主要内容

  • 卷积与池化
  • 使用卷积神经网络,提高上一节中仅使用两层神经网络识别Fashion MNIST 中10种衣物的准确率

Convolution

对于每一个像素,我们要求不仅关注这个像素,还要关注这个像素周围的像素。如果我们有一个filter 大小为3*3,那么我们就会关注这个像素上下左右一圈的8个像素,我们关注它们的方法就是将每个像素和filter中对应的值相乘,最后再一起相加。

上例子:

tf-02-1

filter就这样一直滑动,每一次滑动得到一个值,每个值拼在一起,形成一张新的图像。filter还有滑动步长,stride,一次走一步,还是两步,得到的结果也会不一样。

filter滑动后的新图像大小有一个公式:

OutputSize=(N−F)/stride+1

where N 是原始图像宽度,F是filter的大小。这里默认padding=0。

卷积是一种神奇的方法,就是通过filter的过滤,能够使得图片的某些特征得到强调,filter的值不同,提取的特征就会不同。

如下图,就通过一个简单的filter得到了事物的轮廓。

tf-02-2

这就是卷积,一种提取图片特征的方法。

这种做法的两个关键启发:

  1. Features are hierarchical。从低复杂度的特征中组合出高复杂度的特征,比直接学习高复杂度的特征更加有效。比如我可以先学习识别直线、圆形之类的分类器,再训练一个组合圆形、直线这些基本图形的分类器
  2. Features are translationally invariant。可以保证特征的平移不变性(一定程度),可以提高模型的泛化效果。

from 【CS20-TF4DL】06 Convnet 简介

Pooling

池化的目的是为了缩小图像,将一些冗余的信息直截了当的去掉。

这里只讲Max Pooling,简单来说就是在一定区域中,比如2 * 2的像素中,选择像素值最大的像素,其他全部抛弃。

tf-02-3

也可以把max pooling想象成有一个filter,在图像上滑动,滑动的步伐大小叫stride。

一般来说,stride会和filter一样大小,上图中,filter=2 * 2,stride=2。图像小了一半。

我们接着看例子,下图是一个经过卷积的图片:

tf-02-4

我们使用filter大小为2*2的max pooling,使图片变成了原来的一半,非常神奇的是,缩小了一半的图片不仅没有失去原来的特征,反而更加明显了,这说明池化使得图片的冗余信息减少了。

tf-02-5

从上面这个例子看,pooling能够有效地减少冗余信息。

Convolution & Pooling in TF

讲完了理论,接下来看代码。我们在上一节的全连接神经网络上增加了卷积和池化层:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28,28,1)),
# 第一个参数是filter的个数,这里有64个filter。第二个参数是filter的大小,这里是3*3,stride默认为1.input_shape大小是28*28*1,这里1的意思是只有一个颜色通道,就是灰度图,如果是rgb图,就有三种颜色通道,就是28*28*3.
tf.keras.layers.MaxPooling2D(2, 2),
# max pooling,filter的大小是2*2,stride默认为1.
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28,28,1)),
# 同上
tf.keras.layers.MaxPooling2D(2, 2),
# 同上
tf.keras.layers.Flatten(),
# 然后再把图像展开编程一维数组,不用填参数,TF会自动算出图像大小
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])

model.summary

model.summary能够显示模型的网络结构,下图是我们的网络结构:

tf-02-6

一层层看,第一层卷积层,输出的shape由原来的(28, 28, 1)变成了(26,26,64),第二层pooling后,因为filter为2*2,所以之间变为原来的一半(13, 13, 64),再经过一层卷积核池化,到最后输出为(5, 5, 64)。

一张28*28的图片,在经过卷积池化后,变成了64张5*5的图片,我们可以直观地理解为,提取了64个这张图片的特征,每个特征大小为5*5。

Using Real-world Images

主要内容

  • 处理复杂、不统一的数据集:image generator
  • 使用处理后的数据集训练:fit generator

Image Generator

我们之前使用的都是非常完美的数据集,图片大小相同、物体居中且清晰,但是当我们有一个数据集,里面的图片大小不同,且物体的位置并不居中,图中有不止一个物体,而且更糟糕的是,我们还没做label,该怎么办?别怕,用TF的API:image generator。

只要我们把同一类的图片放在同一个文件夹下,我们就能用这个API来自动打标签,标签就是这个文件夹的名字。

如图,我的图片都没打标签,但是都放在了文件夹里,那么就可以放心地用image generator了。

tf-02-7

实现的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1.0/255.0)

train_generator = train_datagen.flow_from_directory(
train_dir,
# 这个表示训练集的文件夹名称
target_size = (300, 300),
# 图片大小不一,但是训练神经网络,数据大小一定要相同,target_size就设定了我们想要的大小,使得每一个图片都变成这个大小
batch_size = 128,
# 我们不是一张张训练,而是一个batch训练,这样的效果会比一张张训练更好
class_mode = 'binary'
# 我们这里是一个二分类问题,这个参数是为了给图片打标签
)

CNN on Complex Images

Model

对于更复杂的数据集,我们定义了一个更大的卷积神经网络,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
model = tf.keras.models.Sequential([
# Note the input shape is the desired size of the image 300x300 with 3 bytes color
# This is the first convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# Flatten the results to feed into a DNN
tf.keras.layers.Flatten(),
# 512 neuron hidden layer
tf.keras.layers.Dense(512, activation='relu'),
# Only 1 output neuron. It will contain a value from 0-1 where 0 for 1 class ('horses') and 1 for the other ('humans')
tf.keras.layers.Dense(1, activation='sigmoid')
])

和上一节差不多,多了两组卷积池化层,就不解释了。

Compile

上一节compile的optimizer是adam,loss是“sparse_categorical_crossentropy”,这次optimizer换成“RMSprop”,loss换成“binary_crossentropy”。RMSprop使得梯度下降变得更加稳定,且能容忍更大的学习率。

代码如下:

1
2
3
4
5
from tensorflow.keras.optimizers import RMSprop

model.compile(loss='binary_crossentropy',
optimizer=RMSprop(lr=0.001),
metrics=['acc'])

Training

还记得之前的fit吗?

1
model.fit(x_train, y_train, epochs=10)

因为这次我们的x_train不是直接从数据集里拿的,而是使用ImageDataGenerator这个API对数据进行预处理,所以相应的fit也要改。

名字和ImageDataGenerator 很般配:fit_generator。是这样用的:

1
2
3
4
5
6
7
8
9
10
11
12
13
history = model.fit_generator(
train_generator,
# 这就是之前我们写过的
steps_per_epoch = 8,
# 每个epoch训练几次batch。我们在train_generator中定义了一个batch大小是128,我们一共有1024张图片,所以这里设置为8
epochs = 10,
verbose = 2
# verbose:日志显示
# verbose = 0 为不在标准输出流输出日志信息
# verbose = 1 为输出进度条记录
# verbose = 2 为每个epoch输出一行记录
# verbose默认为 1
)

Validation

我们可以在训练的时候,增加一组验证集。

验证集的预处理和训练集的预处理一样:

1
2
3
4
5
6
7
8
9
10
from tensorflow.keras.preprocessing.image import ImageDataGenerator

validate_datagen = ImageDataGenerator(rescale=1.0/255.0)

validate_generator = validate_datagen.flow_from_directory(
validate_dir,
target_size = (300, 300),
batch_size = 32,
class_mode = 'binary'
)

在原来的fit_generator中加入validate_generator即可:

1
2
3
4
5
6
7
8
9
history = model.fit_generator(
train_generator,
steps_per_epoch=8,
epochs=10,
validation_data=validate_generator,
# 我们加在了这里
validation_steps=8,
# 同steps_per_epoch
verbose=2)
赏

谢谢你请我吃糖果

支付宝
微信
  • 本文作者: YA
  • 本文链接: http://www.yuuuuang.com/2019/10/31/【Introduction-to-TensorFlow】03-卷积神经网络与复杂数据集/
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
  • 世界之内
  • 机器学习

扫一扫,分享到微信

机器学习|Flow-based Model学习笔记
【Introduction to TensorFlow】02 初识机器学习与计算机视觉
  1. 1. Enhancing Vision with Convolutional Neural Networks
    1. 1.1. 主要内容
    2. 1.2. Convolution
    3. 1.3. Pooling
    4. 1.4. Convolution & Pooling in TF
      1. 1.4.1. model.summary
  2. 2. Using Real-world Images
    1. 2.1. 主要内容
    2. 2.2. Image Generator
    3. 2.3. CNN on Complex Images
      1. 2.3.1. Model
      2. 2.3.2. Compile
      3. 2.3.3. Training
      4. 2.3.4. Validation
© 2018-2025 YA
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量25538次 | 本站访客数20686人
  • 所有文章
  • 友链
  • 关于我

tag:

  • 随笔
  • 年终总结
  • 世界之内
  • 世界之外
  • 叶隙集
  • 机器学习
  • 叶隙随笔
  • 图像处理
  • 数据挖掘

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 2024年终总结

    2025-04-08

    #随笔#年终总结

  • 【叶隙集】41 盘旋的白文鸟

    2025-01-12

    #随笔#叶隙集

  • 大语言模型正在伤害人机交互领域的研究

    2025-01-05

    #随笔#世界之内

  • 【叶隙集】40 台湾旅行

    2024-12-22

    #随笔#叶隙集

  • 【叶隙集】39 搬家了

    2024-09-05

    #随笔#叶隙集

  • 2023年终总结

    2024-06-27

    #随笔#年终总结

  • 【叶隙集】38 参加学术会议

    2024-05-22

    #随笔#叶隙集

  • Notes of 3D Gaussian Splatting

    2024-03-19

    #世界之内

  • 【叶隙集】37 音乐会和朋友

    2023-12-04

    #随笔#叶隙集

  • 【叶隙集】36 QE和音乐会

    2023-11-02

    #随笔#叶隙集

  • 【叶隙集】35 新室友和更积极的生活

    2023-09-11

    #随笔#叶隙随笔

  • 读书笔记|《规训与惩罚》

    2023-08-27

    #随笔#世界之外

  • 【叶隙集】34 无法参加学术会议

    2023-06-28

    #随笔#叶隙集

  • 【叶隙集】33 回国后与朋友和家人们的聚会

    2023-06-11

    #随笔#叶隙集

  • 视频压缩技术概述

    2023-04-28

    #世界之内

  • 2022年终总结

    2023-03-31

    #随笔#年终总结

  • 【叶隙集】32 平和的心态

    2022-12-27

    #随笔#叶隙集

  • 【叶隙集】31 双相情绪障碍症

    2022-12-17

    #随笔#叶隙集

  • 【学习笔记】CS5229 Advanced Computer Network

    2022-12-17

    #世界之内

  • 【叶隙集】30 下半学期太忙了!

    2022-11-25

    #随笔#叶隙集

  • 【叶隙集】29 当助教的半个学期

    2022-10-07

    #随笔#叶隙集

  • 【叶隙集】28 忙碌的第一个月

    2022-08-31

    #随笔#叶隙集

  • 【叶隙集】27 老师的职责

    2022-07-31

    #随笔#叶隙集

  • 【叶隙集】26 新加坡太难找工作了

    2022-07-23

    #随笔#叶隙集

  • 【叶隙集】25 生产工具、学习生活和阅读笔记

    2022-07-15

    #随笔#叶隙集

  • 【叶隙集】24 学习、科研、旅行和爱与关怀

    2022-06-24

    #随笔

  • 【叶隙集】23 学习与研究

    2022-04-26

    #随笔#叶隙集

  • 【学习笔记】人工智能规划与决策

    2022-04-26

    #世界之内

  • 博士申请的总结

    2022-03-31

    #随笔

  • 【叶隙集】22 新的体验和宗教

    2022-03-07

    #随笔#叶隙集

  • 2021年终总结

    2022-01-08

    #随笔#年终总结

  • 【叶隙集】21 新朋友和学术报告

    2021-10-31

    #随笔#叶隙集

  • 【叶隙集】20 音乐会与教训

    2021-10-19

    #随笔#叶隙集

  • 【叶隙集】19 六周年纪念日

    2021-10-03

    #随笔#叶隙集

  • 【叶隙集】18 疫情与疫苗

    2021-09-24

    #随笔#叶隙集

  • 摘录|联合国2021年气候问题总结报告的摘要

    2021-09-19

    #世界之外

  • 【叶隙集】17 音乐会和读书

    2021-09-08

    #随笔#叶隙集

  • 【叶隙集】16 喜欢上了游泳

    2021-09-01

    #随笔#叶隙集

  • 【叶隙集】15 课前的夜曲

    2021-08-24

    #随笔#叶隙集

  • 【叶隙集】14 平稳的学习生活

    2021-08-16

    #随笔#叶隙集

  • 【叶隙集】13 生活与朋友

    2021-07-15

    #随笔#叶隙集

  • 【叶隙集】12 毕业

    2021-06-30

    #随笔#叶隙集

  • 【叶隙集】11 毕业前的生活

    2021-06-23

    #随笔#叶隙集

  • 读书笔记|《国境以南,太阳以西》读后感

    2021-06-17

    #随笔

  • 【叶隙集】10 青甘环线旅行

    2021-06-13

    #随笔#叶隙集

  • 半监督学习|论文粗读

    2021-06-07

    #机器学习

  • 【叶隙集】9 纯粹地生活

    2021-06-06

    #随笔#叶隙集

  • 【叶隙集】8 生活的界限

    2021-05-30

    #随笔#叶隙集

  • 【叶隙集】7 隔离结束

    2021-05-21

    #随笔#叶隙集

  • 【叶隙集】6 隔离生活

    2021-05-14

    #随笔#叶隙集

  • 【叶隙集】5 新的阶段

    2021-05-08

    #随笔#叶隙集

  • 【叶隙集】4 团队管理

    2021-04-30

    #随笔#叶隙集

  • 【叶隙集】3 过低的自我评价

    2021-04-23

    #随笔#叶隙集

  • 【叶隙集】2 方向与交往

    2021-04-16

    #随笔#叶隙集

  • 【叶隙集】1 原爆点-续

    2021-04-08

    #随笔#叶隙集

  • 随笔|目的与纯粹

    2021-03-28

    #随笔

  • 随笔|白文鸟

    2021-01-20

    #随笔

  • 写在一百以后——2020年终总结

    2021-01-01

    #随笔#年终总结

  • 随笔|选择

    2020-12-25

    #随笔

  • 读书笔记|《人生的意义》总结、摘录

    2020-11-25

    #世界之外

  • 书评|Normal People, Normal Love

    2020-10-07

    #随笔

  • Decision Making|人工智能、机器学习与强化学习的概述与比较

    2020-10-03

    #世界之内

  • 随笔|疫情后的总结

    2020-09-10

    #随笔

  • 学习笔记@PRML|1 Introduction

    2020-07-31

    #世界之内

  • 随笔|面试后的回顾与思考

    2020-07-26

    #随笔

  • 数据挖掘|数据挖掘概论笔记

    2020-06-24

    #世界之内#数据挖掘

  • 续写|美女或野兽

    2020-06-18

    #随笔

  • 随笔|无常

    2020-05-31

    #随笔

  • 现象学|胡塞尔《小观念》笔记

    2020-05-13

    #世界之外

  • 随笔|我的局限性

    2020-05-13

    #随笔

  • 随笔|胡乱的记录

    2020-04-09

    #随笔

  • 随笔|疫情

    2020-02-16

    #随笔

  • 随笔|怅惘地忖度

    2020-01-29

    #随笔

  • 2019年终总结

    2019-12-08

    #随笔#年终总结

  • 机器学习|Flow-based Model学习笔记

    2019-11-06

    #世界之内#机器学习

  • 【Introduction to TensorFlow】03 卷积神经网络与复杂数据集

    2019-10-31

    #世界之内#机器学习

  • 【Introduction to TensorFlow】02 初识机器学习与计算机视觉

    2019-10-29

    #世界之内#机器学习

  • 【Introduction to TensorFlow】01 TF 快速入门

    2019-10-29

    #世界之内#机器学习

  • 【Introduction to TensorFlow】00 课程概览

    2019-10-29

    #世界之内#机器学习

  • 随笔|呓语

    2019-10-27

    #随笔

  • 周记|面纱 久别重逢

    2019-09-21

    #随笔

  • 学习笔记|拟合优化

    2019-09-15

    #世界之内

  • 周记|爱人 体验 芝诺

    2019-09-07

    #随笔

  • 摘录|造成不幸福的原因之六:嫉妒

    2019-09-06

    #世界之外

  • 随笔|虚无 纵欲

    2019-08-22

    #随笔

  • 周记|尘埃落定

    2019-06-29

    #随笔

  • 周记|本能 愉悦 基因

    2019-06-12

    #随笔

  • 周记|空荡荡

    2019-06-02

    #随笔

  • 四月裂帛——读《女儿红》

    2019-05-30

    #随笔#世界之外

  • 机器学习|主成分分析

    2019-05-10

    #世界之内#机器学习

  • 《好运设计》史铁生

    2019-05-09

    #世界之外

  • 机器学习|感知机与支持向量机

    2019-04-27

    #世界之内#机器学习

  • 周记|记忆 概念 庸俗

    2019-04-27

    #随笔

  • 机器学习|模型评估与选择

    2019-04-17

    #世界之内#机器学习

  • 机器推理|SLD Resolution

    2019-04-06

    #世界之内

  • 第五代计算机

    2019-03-31

    #世界之内

  • 学习笔记|Volume Rendering

    2019-03-31

    #世界之内#图像处理

  • 周记|三月驼云

    2019-03-28

    #随笔

  • 生成对抗网络与强化学习:文本生成的方法

    2019-03-11

    #世界之内

  • 《桨声灯影里的秦淮河》俞平伯

    2019-03-09

    #世界之外

  • 周记|雨

    2019-03-09

    #随笔

  • 《春之积雪》简媜

    2019-03-01

    #世界之外

  • 周记|逃离

    2019-02-15

    #随笔

  • 存在主义是一种人道主义

    2019-02-11

    #世界之外

  • 学习笔记|比较文学

    2019-02-09

    #世界之外

  • 尼采的美学

    2019-02-01

    #世界之外

  • 哲学涉猎

    2019-02-01

    #世界之外

  • 读书笔记|光的诗人——《如何看懂印象派》

    2019-01-28

    #随笔#世界之外

  • 叔本华的生命意志哲学

    2019-01-25

    #世界之外

  • 再也不要把他们弄丢了

    2019-01-21

    #随笔

  • 2018年终总结

    2018-12-31

    #随笔#年终总结

  • 人类的心理行为模式

    2018-12-25

    #世界之外

  • 周记|神经症人格

    2018-12-22

    #随笔

  • 【周记】旋转

    2018-11-30

    #随笔

  • 七牛云Bucket失效

    2018-11-21

    #世界之内

  • 周记|从前的日色慢

    2018-11-21

    #随笔

  • 【数理逻辑】Incompleteness Theorem

    2018-11-10

    #世界之外

  • 专业随想

    2018-11-05

    #随笔

  • 生活

    2018-11-04

    #世界之外

  • 计算机组成与体系结构

    2018-11-04

    #世界之内

  • 【强化学习】Policy Gradient

    2018-11-03

    #世界之内

  • 怀疑是否有价值——怀疑论

    2018-10-30

    #世界之外

  • 周记|Every hero and coward

    2018-10-20

    #随笔

  • Web in Java

    2018-10-11

    #世界之内

  • 周记|十月女泽

    2018-10-02

    #随笔

  • 托福备考

    2018-09-28

    #世界之内

  • 周记|裸体之舞

    2018-09-24

    #随笔

  • 周记|中秋幸福

    2018-09-18

    #随笔

  • History of artificial intelligence

    2018-09-09

    #世界之外

  • 周记|我那无趣的灵魂

    2018-09-09

    #随笔

  • Softmax Regression

    2018-09-08

    #世界之内

  • 周记|Rational

    2018-09-02

    #随笔

  • 贰 《SICP》笔记:模块化、对象和状态

    2018-08-05

    #世界之内

  • 周记|困倦

    2018-08-04

    #随笔

  • 壹 《SICP》笔记:构造数据抽象

    2018-07-31

    #世界之内

  • 周记|原爆点

    2018-07-31

    #随笔

  • 零 《SICP》笔记:构造过程抽象

    2018-07-23

    #世界之内

  • Norms or maybe more

    2018-07-09

    #世界之内

  • 事已至此

    2018-06-24

    #随笔

  • 【增强学习】AirSim搭建

    2018-06-02

    #世界之内

  • 【机器学习】BP算法

    2018-05-26

    #世界之内

  • 【康德】宏大的哲学语境

    2018-05-26

    #世界之外

  • 【康德】康德的研究领域是什么

    2018-05-11

    #世界之外

  • 【高等数学】什么是梯度(期中考试复习思考)

    2018-04-29

    #世界之内

  • 《自控力》读书笔记

    2018-04-21

    #随笔

  • 【线性代数】The Essence of Linear Algebra

    2018-04-21

    #世界之内

  • 【数据结构与算法】临时抱佛脚

    2018-03-10

    #世界之内

  • 科技革命与人类社会——《论工业社会及其未来》读后感

    2018-03-08

    #随笔

  • 《论工业社会及其未来》原文摘录

    2018-02-23

    #世界之外

  • 《如何高效学习》读后总结

    2018-02-19

    #随笔

  • 《精进》chapter-2读后总结

    2018-02-13

    #随笔

  • A Review of Brian - Inspired Computer Vision

    2018-02-11

    #世界之内

  • 最近有个女生,说对我很失望

    2017-12-07

    #随笔

  • 病入膏肓

    2017-01-29

    #随笔

  • 白文鸟

    2016-10-29

    #随笔

  • 《不能承受的生命之轻》读后感

    2016-07-13

    #随笔

  • 都五月份了

    2016-04-29

    #随笔

  • 《四月裂帛》简媜

    2014-09-29

    #世界之外

  • Wuuuudle
  • Nemo
  • Elmo (yyh)
  • highestpeak
  • Kazoo Blog
努力做一名谦逊、独立、乐于思考的学生