飞道的博客

tensorflow——如何构建网络(一)

246人阅读  评论(0)

写在前面

  • 这个系列博客会具体讲讲怎么用tensorflow去搭建网络,其中一些细节例如如何加载数据集、需要哪些包可以参考我的其他博客。以此,来增加自己的编程能力。也会解读一些keras源码等

一、神经网络中有哪些层

点我

  • 从连接方式来说:全连接Dense、Conv2D、Conv2DTranspose、RNN等
  • 主要的功能层:BN层,激活函数层、Input层,Lambda层、Dropout层、Flatten层、Reshape层等等

二、 利用tf.keras.Squential()构建简单的网络

  • 适用情况:
    ①利用构建简单的全连接或者卷积网络来实现手写数字识别问题
    ②作为网络的一部分内嵌在网络函数中(例如VAE中的encoder函数和decoder,或者GAN中的判别器和生成器),这种情况将在后面讲,这里不涉及。
  • 代码
# 构建一个网络模型
model = tf.keras.Sequential([layer1,layer2,...])
  • 数据流
    Sequential会构建一个网络计算图,每个边代表数据流。这个计算图会在模型第一次调用fit函数时开始工作(后面会将)

三、后面步骤

1.完成构建网络部分

2.model.compile()

  • 此过程被称为装载过程,主要声明我们训练模型时需要什么样{Loss,Optimizer,metrics}
# model.compile
# 使用SGD,LOSS选用稀疏分类交叉熵,metrics与loss对应
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
             loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
             metrics=['sparse_categorical_accuracy'])

3.model.fit()

  • 此过程可以理解为用我们的训练数据去训练模型
  • 数据的处理过程如下:

  • tips:
    ①fit()函数中,x,y必须要不同时为numpy.array,要不同时为tensor
    ②当x的数据类型为tf.dataset时,i.e.将数据和标签进行了配对,y不用声明
# model.fit()

model.fit(x_train,y_train,batch_size=32,epochs=500,
         validation_split=0.2,validation_freq=20)

4.model.summary()

  • 这个会使自己清晰的看到自己的网络结构
model.summary()# 打印网络信息

out:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                multiple                  15        
=================================================================
Total params: 15
Trainable params: 15
Non-trainable params: 0
_________________________________________________________________

5.model.evaluate(x_test,y_test)

  • 使用该函数进行模型的评估
# 评估,evaluate函数返回测试集上[loss,metrics_values]
loss,metrics_values = model.evaluate(x_test,y_test)

6.model.predict(input)

  • 该函数可以对测试集或其子集进行预测
  • tips:input的shape一定要包含batch_size的维度,因为神经网络是按batch进行计算的。
# predict
# 这里只预测了一个
pred = model.predict(x_test[0].reshape(1,32,32,3)) #‘1’为batch_size

四、再送两个知识点

  • 假设我们现在在处理图像问题,就比如MNIST数据集
    ①当我们使用卷积神经网络时,需要将图像提前预处理成含有channel维度的形状,即(batch_size,w,h,chennel),在MNIST数据集中channel=1。
    ②当我们使用全连接去处理图像的时候,网络的第一层一定是一个Flatten()。这时候图像不需要预处理channel维度,即(batch_size,w,h)就可,在Flatten()层中会自动将channel置为1,即(batch_size,w,h,1)。Flatten()中的keyword positions默认时‘channel_last’

下节预告

  • 如何去训练一些特殊的神经网络,例如VAE,GAN等。会使用 Keras Sequential API 与 tf.GradientTape 训练循环编写。
  • 尽快更新“如何构建网络(二)”

转载:https://blog.csdn.net/weixin_44441131/article/details/105892591
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场