class CNN(tf.keras.Model):def __init__(self):super().__init__()self.conv1 = tf.keras.layers.Conv2D(filters=32, # 卷积层神经元(卷积核)数目kernel_size=[5, 5], # 感知域大小(滤波器大小) padding=2strides=(2,2),padding='same', # padding策略(vaild 或 same)same保证卷出来的图大小与原输入相同kernel_initializer=tf.random_normal_initializer,activation=tf.nn.relu # 激活函数)self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2],strides=2)self.conv2 = tf.keras.layers.Conv2D(filters=64,kernel_size=[5, 5],strides=(1,1),padding='same',kernel_initializer=tf.random_normal_initializer,activation=tf.nn.relu)self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2],strides=2)self.flatten = tf.keras.layers.Flatten()self.dense1 = tf.keras.layers.Dense(units=512, activation=tf.nn.relu)self.dropout = tf.keras.layers.Dropout(rate=0.1)self.dense2 = tf.keras.layers.Dense(units=120)def call(self, inputs): # [batch_size, 150, 150, 1] x = self.conv1(inputs) # [batch_size, 75, 75, 32] x = self.pool1(x) # [batch_size, 37, 37, 64]x = self.conv2(x) # [batch_size, 19, 19, 64]x = self.pool2(x) # [batch_size, 9, 9, 64]x = self.flatten(x) # [batch_size, 9*9*64=5184]x = self.dense1(x) # [batch_size, 512]x = self.dropout(x) x = self.dense2(x) # [batch_size, 120]output = tf.nn.softmax(x)return output
调用:
model = CNN()
网络结构示意图:
输入150x150单通道的黑白图像,
第一层卷积:32个5x5,步长为2的卷积核卷积后是75x75的32通道。
下一层是2x2的最大池化层得到37x37,64通道的数据。
下一层再经过64个5x5,步长为1的卷积核卷积后是19x19的64通道,
下一层是2x2,步长为2的最大池化层得到9x9,64通道的数据。
下一层将多维的输入一维化
下一层全连接,下一层dropout随机失活,下一层再神经网络全连接,最后softmax全连接。