На самом деле у меня есть две проблемы.Прежде всего, возможно ли использовать визуализацию графика в Tfv2?Потому что я не мог написать код, показывающий мою архитектуру, поэтому я не знал, что мой дизайн правильный.
Вторая проблема - моя сеть прошла обучение, и точность валидации составляет всего 50%.Я использовал архитектуру ResNet.Вот мой блок ResNet, и я использовал его в структуре основной сети 6 раз.Мой GPU не самый лучший, поэтому я должен использовать фильтр размером 16 или 32:
class ResnetBlock(tf.keras.Model):
def __init__(self, residual_path=False):
super(ResnetBlock, self).__init__()
self.residual_path = residual_path
self.conv2 = tf.keras.layers.Conv2D(16, kernel_size = (3,3), strides=(1,1), padding='same', use_bias=False, kernel_initializer=tf.keras.initializers.he_normal(seed=13))
self.bn2 = tf.keras.layers.BatchNormalization(epsilon=1e-3, momentum=0.993)
self.relu2 = tf.keras.layers.Activation('relu')
self.conv3 = tf.keras.layers.Conv2D(32, kernel_size = (3,3), strides=(1,1), padding='same', use_bias=False, kernel_initializer=tf.keras.initializers.he_normal(seed=13))
self.bn3 = tf.keras.layers.BatchNormalization(epsilon=1e-3, momentum=0.993)
self.relu3 = tf.keras.layers.Activation('relu')
def call(self, inputs, training=None):
x0 = inputs
x = self.conv2(inputs)
x = self.bn2(x, training=training)
x = self.relu2(x)
x = self.conv3(x)
x = self.bn3(x, training=training)
x = self.relu3(x)
x = x + x0
return x
Также вот основная структура сети:
класс ResNet (tf.keras.Model):
def __init__(self, num_blocks ,num_classes, **kwargs):
super(ResNet, self).__init__(**kwargs)
self.num_blocks = num_blocks
self.conv1 = tf.keras.layers.Conv2D(32, kernel_size = (7,7), strides=(2,2), padding='same', use_bias=False, kernel_initializer=tf.keras.initializers.he_normal(seed=13))
self.bn1 = tf.keras.layers.BatchNormalization(epsilon=1e-3, momentum=0.993)
self.relu1 = tf.keras.layers.Activation('relu')
self.mps1 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))
self.blocks = tf.keras.models.Sequential(name='dynamic-blocks')
for block_number in range(num_blocks):
block = ResnetBlock(residual_path=True)
self.blocks.add(block)
self.final_bn = tf.keras.layers.BatchNormalization()
self.avg_pool = tf.keras.layers.GlobalAveragePooling2D()
self.fc = tf.keras.layers.Dense(num_classes)
def call(self, inputs, training=None):
x = self.conv1(inputs)
x = self.bn1(x, training=training)
x = self.relu1(x)
x = self.mps1(x)
out = self.blocks(x, training=training)
out = self.final_bn(out, training=training)
out = tf.nn.relu(out)
out = self.avg_pool(out)
out = self.fc(out)
return out