首页 > 解决方案 > 是否有可能使用自定义层可训练权重作为 tensorflow 插件函数旋转的参数?

问题描述

我想做的是了解我的自定义层对于一个域的图像的最佳旋转是什么。我使用 tensorflow 插件函数并希望将权重值作为参数传递。有我的自定义层

class RotationLayer(Layer):
def __init__(self, num_outputs, name = 'RotationLayer', **kwargs):
    super(RotationLayer, self).__init__(**kwargs)
    self.num_outputs = num_outputs

def build(self, input_shape):
    super(RotationLayer, self).build(input_shape)

    self.w = self.add_weight(
        shape=[1], initializer="uniform", trainable=True
    )

def call(self, inputs, **kwargs):
    rotated = tfa.image.rotate(inputs, (self.w*100)*math.pi/180)
    rotated = tf.reshape(rotated, shape=[-1,64,64,1])
    return rotated

def compute_output_shape(self, input_shape):
    return (input_shape[0], self.output_dim)

def get_config(self):
    base = super(RotationLayer, self).get_config()
    base['num_outputs'] = self.num_outputs
    return dict(list(base.items()))

这一层有效,但完全毁了我的 CNN,所以我想问一下是否还有其他可能性。我的目标是衡量学习数据增强层对 CNN 架构的影响。

神经网络架构

model = Sequential()
#model.add(flipLayer)
#model.add(brightnessLayer)
#model.add(rotatioLayer)

model.add(Conv2D(48, 5, padding = 'same', activation = 'relu', input_shape=(64,64,1)))
model.add(rotatioLayer)
model.add(MaxPool2D(pool_size = 3, strides = 2))
model.add(Conv2D(64, 5, padding = 'same', activation = 'relu'))
model.add(MaxPool2D(pool_size = 3, strides = (2,2)))
model.add(Conv2D(32, 3, padding = 'same', activation = 'relu'))
model.add(Dropout(0.1))
model.add(Dense(1024, activation = 'relu'))
model.add(Flatten())
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['acc'], run_eagerly=True)
model.summary()

标签: pythonkerasdeep-learningconv-neural-networkdata-augmentation

解决方案


推荐阅读