Képzés egy konvolúciós hálózat 2 konvolúciós művelet közös súlyok kell tartani a norma 1

szavazat
0

Azt akarom, hogy a vonat egy konvolúciós hálózat 4 konvolúciós műveleteket 2 szűrő megosztó súlyok, de a norma, hogy marad 1 elemei között a szűrőket. Tegyük fel, hogy van bemeneti mátrix az A és B, és a szűrő C és D művelet szeretnék tenni a következő:

M1 = tf.conv2d (A, C)

M2 = tf.conv2d (B, C)

M3 = tf.conv2d (A, D)

M4 = tf.conv2d (B, D)

Ugyanakkor, azt kell sqrt (C ^ 2 + D ^ 2) = 1

Találtam egy módja, hogy megosszák a súlyokat a különböző konvolúciós művelet segítségével ugyanazt a réteget kétszer, ahogy kérték a korábbi kérdés Hogyan lehet megosztani konvolúciós kernel rétegek közötti keras? .

De fogalmam sincs, hogyan kell megfogalmazni a megszorítások a norma 1.

Kösz!

Megpróbáltam bevezetni a bemeneti réteg, amely képezni keresztül sűrű réteg dimenziója a kernelt szűrő, majd átalakítja és osztott be segítségével 2 cos (x) sin (x), mielőtt a konvolúciós művelet (én már csinál ez a kód, hogy modulálja a bemeneti kép). Azt majd egy kézi tf.nn.conv2d () műveletet. De a mag kapok egy dimenziót a tétel, mint a 0 dimenzió és ez nem egyeztethető össze a szükséges dimenziója a kernel [filter_height, filter_width, in_channels, out_channels]. Szorította ez nem fog működni.

conv2d_layer_real= Conv2D(1,data_Mat2.shape[1],padding='same',kernel_constraint=max_norm(1),use_bias =False)
conv2d_layer_imag = Conv2D(1,data_Mat2.shape[1],padding='same',kernel_constraint=max_norm(1),use_bias =False)

input_shape = (data_Mat2.shape[1], data_Mat2.shape[1],1);
input_shape2 = (1,);

inputs_r = Input(shape=input_shape)
inputs_r2 = Input(shape=input_shape2)

phase_r2 = Dense(data_Mat2.shape[1]*data_Mat2.shape[1],activation = 'tanh',use_bias =False,kernel_initializer=RandomNormal(mean=0.0, stddev=0.5, seed=None))(inputs_r2)

phase_real = Lambda(lambda x:tf.cos(x*3.1416))(phase_r2)
phase_imag = Lambda(lambda x:tf.sin(x*3.1416))(phase_r2)

phase_real2 = Reshape((data_Mat2.shape[1], data_Mat2.shape[1],1))(phase_real)
phase_imag2 = Reshape((data_Mat2.shape[1], data_Mat2.shape[1],1))(phase_imag)

Mat_real = Multiply()([inputs_r,phase_real2])
Mat_imag = Multiply()([inputs_r,phase_imag2])

out_conv1 = conv2d_layer_real(Mat_real)
out_conv2 = conv2d_layer_real(Mat_imag)

out_conv3 = conv2d_layer_imag(Mat_real)
out_conv4 = conv2d_layer_imag(Mat_imag)

out_real = Add()([out_conv1,-out_conv4])
out_imag = Add()([out_conv2,out_conv3])

image_out = tf.complex(out_real,out_imag)
image_out = tf.square(tf.abs(image_out))

image_out = AveragePooling2D(pool_size=(pool_s, pool_s))(image_out)

vector_out = Reshape((9,))(image_out)

outputs = Softmax()(vector_out)

Ez utóbbi kód jól működik, de nem lesz norma 1 a súlyrendszerrel a conv2D rétegek, mert nincs ilyen megszorítások készül

A kérdést 24/10/2019 12:52
a forrás felhasználó
Más nyelveken...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more