【机器学习炼丹术】的炼丹总群已经快满了,要加入的快联系炼丹兄WX:cyx645016617python
参考目录:
算法
以前讲过了如何用tensorflow构建数据集,而后这一节课讲解如何用Tensorflow2.0来建立模型。网络
TF2.0中建立模型的API基本上都放到了它的Keras中了,Keras能够理解为TF的高级API,里面封装了不少的常见网络层、常见损失函数等。 后续会详细介绍keras的全面功能,本篇文章讲解如何构建模型。dom
import tensorflow as tf import tensorflow.keras as keras class MyLayer(keras.layers.Layer): def __init__(self, input_dim=32, output_dim=32): super(MyLayer, self).__init__() w_init = tf.random_normal_initializer() self.weight = tf.Variable( initial_value=w_init(shape=(input_dim, output_dim), dtype=tf.float32), trainable=True) # 若是是false则是不参与梯度降低的变量 b_init = tf.zeros_initializer() self.bias = tf.Variable(initial_value=b_init( shape=(output_dim), dtype=tf.float32), trainable=True) def call(self, inputs): return tf.matmul(inputs, self.weight) + self.bias x = tf.ones((3,5)) my_layer = MyLayer(input_dim=5, output_dim=10) out = my_layer(x) print(out.shape) >>> (3, 10)
这个就是定义了一个TF的网络层,其实能够看出来和PyTorch定义的方式很是的相似:机器学习
tf.keras.layers.Layer
,这个pytorch中要继承torch.nn.Module
相似;__def__
中定义,和pytorch的模型类相同;call()
和pytorch中的forward()
的相似。上面代码中实现的是一个全链接层的定义,其中能够看到使用tf.random_normal_initializer()
来做为参数的初始化器,而后用tf.Variable
来产生网络层中的权重变量,经过trainable=True
这个参数说明这个权重变量是一个参与梯度降低的能够训练的变量。ide
我经过tf.ones((3,5))
产生一个shape为[3,5]的一个全是1的张量,这里面第一维度的3表示有3个样本,第二维度的5就是表示要放入全链接层的数据(全链接层的输入是5个神经元);而后设置的全链接层的输出神经元数量是10,因此最后的输出是(3,10)。函数
import tensorflow as tf import tensorflow.keras as keras class CBR(keras.layers.Layer): def __init__(self,output_dim): super(CBR,self).__init__() self.conv = keras.layers.Conv2D(filters=output_dim, kernel_size=4, padding='same', strides=1) self.bn = keras.layers.BatchNormalization(axis=3) self.ReLU = keras.layers.ReLU() def call(self, inputs): inputs = self.conv(inputs) inputs = self.ReLU(self.bn(inputs)) return inputs class MyNet(keras.Model): def __init__ (self,input_dim=3): super(MyNet,self).__init__() self.cbr1 = CBR(16) self.maxpool1 = keras.layers.MaxPool2D(pool_size=(2,2)) self.cbr2 = CBR(32) self.maxpool2 = keras.layers.MaxPool2D(pool_size=(2,2)) def call(self, inputs): inputs = self.maxpool1(self.cbr1(inputs)) inputs = self.maxpool2(self.cbr2(inputs)) return inputs model = MyNet(3) data = tf.random.normal((16,224,224,3)) output = model(data) print(output.shape) >>> (16, 56, 56, 32)
这个是构建了一个很是简单的卷积网络,结构是常见的:卷积层+BN层+ReLU层。能够发现这里继承的一个tf.keras.Model
这个类。学习
Model比Layer的功能更多,反过来讲,Layer的功能更精简专注。lua
.fit()
,.evaluate()
,.predict()
等方法来快速训练。保存和加载模型也是在Model这个级别进行的。如今说一说上面的代码和pytorch中的区别,做为一个对比学习、也做为一个对pytorch的回顾:spa
filters
就是卷积后的输出特征图的通道数;而PyTorch的卷积层是须要输入两个通道数的参数,一个是输入特征图的通道数,一个是输出特征图的通道数;keras.layers.BatchNormalization(axis=3)
是BN层,这里的axis=3说明第三个维度(从0开始计数)是通道数,是须要做为批归一化的维度(这个了解BN算法的朋友应该能够理解吧,不了解的话去从新看我以前剖析BN层算法的那个文章吧,在文章末尾有相关连接)。pytorch的图像的四个维度是:而tensorflow是:
总之,学了pytorch以后,再看keras的话,对照的keras的API,不少东西都直接就会了,二者的API愈来愈类似了。
上面最后输出是(16, 56, 56, 32)
,输入的是\(224\times 224\)的维度,而后通过两个最大池化层,就变成了\(56\times 56\)了。
到此为止,咱们如今应该是能够用keras来构建模型了。