Η κατάρτιση ενός δικτύου συνέλιξη με 2 λειτουργία συνέλιξη με κοινόχρηστο βάρη που πρέπει να κρατήσει ένα κανόνα της 1

ψήφοι
0

Θέλω να εκπαιδεύσει ένα δίκτυο συνέλιξη με 4 λειτουργίες συνέλιξης με 2 φίλτρα που μοιράζονται τα βάρη, αλλά με ένα πρότυπο που παραμένει στο 1 μεταξύ των στοιχείων των φίλτρων. Ας πούμε ότι έχετε εισάγει πίνακα Α και Β, και το φίλτρο C και D. Η λειτουργία που θέλω να κάνω είναι:

Μ1 = tf.conv2d (A, C)

Μ2 = tf.conv2d (Β, C)

Μ3 = tf.conv2d (Α, D)

Μ4 = tf.conv2d (Β, D)

Ταυτόχρονα, έχω ανάγκη sqrt (C ^ 2 + D ^ 2) = 1

Έχω βρει έναν τρόπο για να μοιραστούν τα βάρη μεταξύ των διαφόρων λειτουργία συνέλιξη χρησιμοποιώντας το ίδιο στρώμα δύο φορές, όπως ζητήθηκε στην προηγούμενη ερώτηση Πώς να μοιραστούν πυρήνες συνέλιξης μεταξύ των στρωμάτων στο κέρας; .

Αλλά δεν έχω καμία ιδέα για το πώς να διαμορφώσει τους περιορισμούς του κανόνα σε 1.

Ευχαριστώ!

Έχω προσπαθήσει να εισαγάγει ένα στρώμα εισόδου που θα πρέπει να εκπαιδευτεί με ένα πυκνό στρώμα με τη διάσταση του φίλτρου πυρήνα μου, και στη συνέχεια να αναμορφώσει και γίνεται διαχωρισμός σε 2 χρησιμοποιώντας cos (x) sin (x) πριν από τη λειτουργία συνέλιξης (είμαι ήδη αυτόν τον τρόπο στον κώδικα για να διαμορφώσει την εικόνα εισόδου). Στη συνέχεια χρησιμοποιήστε μια χειροκίνητη λειτουργία tf.nn.conv2d (). Αλλά με τους πυρήνες να πάρω μια διάσταση της παρτίδας ως 0 διάσταση και αυτό είναι ασυμβίβαστο με την απαιτούμενη διάσταση του πυρήνα [filter_height, filter_width, in_channels, out_channels]. Η συμπίεση δεν θα λειτουργήσει.

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)

Αυτό το τελευταίο κωδικός λειτουργεί καλά, αλλά δεν θα έχει κανόνας του 1 για τα weigths των στρωμάτων conv2D επειδή δεν τέτοιοι περιορισμοί γίνεται

Δημοσιεύθηκε 24/10/2019 στις 12:52
πηγή χρήστη
Σε άλλες γλώσσες...                            

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