Formarea unei rețele convoluție cu 2 operațiune convoluție cu greutăți comune care trebuie să păstreze o normă de 1

voturi
0

Vreau să antreneze o rețea convoluție cu 4 operații de convoluție cu 2 filtre care împărtășesc greutăți, dar cu o normă care stă la 1 între elementele filtrelor. Să presupunem că am de intrare matrice A și B, și se filtrează C și D. Operația vreau să fac este:

M1 = tf.conv2d (A, C)

M2 = tf.conv2d (B, C)

M3 = tf.conv2d (A, D)

M4 = tf.conv2d (B, D)

În același timp, am nevoie de sqrt (C ^ 2 + D ^ 2) = 1

Am găsit o modalitate de a împărtăși greutățile între operațiunea convoluție diferite utilizând același strat de două ori, așa cum a fost întrebat într - o întrebare anterioară Cum de a partaja nucleele convoluție între straturi în keras? .

Dar nu am nici o idee cum să formuleze constrângerile impuse de norma la 1.

Mersi!

Am încercat să introducă un strat de intrare, care ar fi antrenat printr-un strat dens, cu dimensiunea filtrului meu de nucleu, iar apoi remodeleze și împărțit-o în 2 folosind cos (x) sin (x) înainte de operația de convoluție (eu sunt deja face acest lucru în codul pentru a modula imaginea de intrare). Apoi am folosi o operație tf.nn.conv2d manuală (). Dar, cu nucleele am obține o dimensiune a lotului ca 0 dimensiune și acest lucru este incompatibil cu dimensiunea necesară a kernel-ului [filter_height, filter_width, in_channels, out_channels]. Stoarcerea nu va funcționa.

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)

Acest ultim cod funcționează bine, dar nu va avea o normă de 1 pentru weigths straturilor conv2D, deoarece nici o astfel de constrângeri se face

Întrebat 24/10/2019 la 12:52
sursa de către utilizator
În alte limbi...                            

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