2017-01-11 3 views
1

Ich trainiere ein DNN-Modell auf einige Daten und hoffe, die gelernten Gewichte zu analysieren, um etwas über das wahre System zu lernen, das ich studiere (Signalkaskaden in der Biologie). Ich denke, man könnte sagen, ich benutze künstliche NNs, um über biologische NNs zu lernen.Benutzerdefinierte Dropout in Tensorflow

Für jedes meiner Trainingsbeispiele habe ich ein einzelnes Gen entfernt, das für die Signalisierung auf der obersten Schicht verantwortlich ist.

Während ich diese Signalkaskade als NN modelliere und einen der Knoten in der ersten versteckten Schicht entferne, merke ich, dass ich eine echte Version des Dropouts mache.

Ich möchte daher Dropout verwenden, um mein Modell zu trainieren, aber die Implementierungen von Dropout, die ich online gesehen habe scheinen zufällig einen Knoten auszusetzen. Was ich brauche, ist eine Möglichkeit zu spezifizieren, welcher Knoten für jedes Trainingsbeispiel ausfällt.

Haben Sie Ratschläge zur Implementierung? Ich bin offen für jedes Paket, aber im Moment ist alles, was ich bereits getan habe, in Tensorflow, also würde ich eine Lösung schätzen, die dieses Framework verwendet.

Für diejenigen, die die Details bevorzugen erläutert:

Ich habe 10-Eingangsvariablen, die zu 32 relu Knoten in der ersten Schicht vollständig verbunden sind, die vollständig mit einer zweiten Schicht verbunden sind (relu), die voll ist, verbunden mit dem Ausgang (linear, weil ich Regression mache).

Zusätzlich zu den 10 Eingangsvariablen weiß ich auch zufällig, welcher der 28 Knoten ausfallen sollte.

Gibt es eine Möglichkeit, die ich beim Training angeben kann? Hier

ist der Code, den ich zur Zeit verwenden:

num_stresses = 10 
num_kinase = 32 
num_transcription_factors = 200 
num_genes = 6692 

# Build neural network 
# Input variables (10) 
# Which Node to dropout (32) 
stress = tflearn.input_data(shape=[None, num_stresses]) 
kinase_deletion = tflearn.input_data(shape=[None, num_kinase]) 

# This is the layer that I want to perform selective dropout on, 
# I should be able to specify which of the 32 nodes should output zero 
# based on a 1X32 vector of ones and zeros. 
kinase = tflearn.fully_connected(stress, num_kinase, activation='relu') 

transcription_factor = tflearn.fully_connected(kinase, num_transcription_factors, activation='relu') 

gene = tflearn.fully_connected(transcription_factor, num_genes, activation='linear') 

adam = tflearn.Adam(learning_rate=0.00001, beta1=0.99) 

regression = tflearn.regression(gene, optimizer=adam, loss='mean_square', metric='R2') 

# Define model 
model = tflearn.DNN(regression, tensorboard_verbose=1) 

Antwort

2

ich Ihre Eingangsgrößen und eine gleich große Vektor aller 1en mit Ausnahme des einen liefern würden Sie fallen wollen, dass man eine 0

Die allererste Operation sollte dann eine Multiplikation sein, um das Gen, das Sie löschen möchten, auf Null zu setzen. Von da an sollte es genau das sein, was du jetzt hast.

Sie können entweder multiplizieren (Null aus Ihrem Gen), bevor Sie es Tensorflow übergeben oder fügen Sie einen anderen Platzhalter und füttern Sie es in das Diagramm im Feed_dict, wie Sie Ihre Variablen tun. Letzteres wäre wahrscheinlich besser.

Wenn Sie einen versteckten Knoten fallen müssen (in Schicht 2), es ist nur ein Vektor von 1 s und ein 0

Lassen Sie mich wissen, ob das funktioniert oder wenn Sie weitere Hilfe benötigen.


Edit: Ok, also habe ich nicht wirklich mit tflearn arbeitete sehr viel (ich regelmäßig tensorflow gerade tat), aber ich glaube, Sie tensorflow und tflearn kombinieren. Grundsätzlich habe ich tf.multiply hinzugefügt. Möglicherweise müssen Sie einen weiteren tflearn.input_data(shape =[num_stresses]) und tflearn.input_data(shape =[num_kinase]) hinzufügen, um Platzhalter für die stresses_dropout_vector und kinase_dropout_vector zu geben. Und natürlich können Sie die Anzahl und Positionen von Nullen in diesen beiden Vektoren ändern.

import tensorflow as tf ###### New ###### 
import tflearn 

num_stresses = 10 
num_kinase = 32 
num_transcription_factors = 200 
num_genes = 6692 

stresses_dropout_vector = [1] * num_stresses ###### NEW ###### 
stresses_dropout_vector[desired_node_to_drop] = 0 ###### NEW ###### 

kinase_dropout_vector = [1] * num_kinase ###### NEW ###### 
kinase_dropout_vector[desired_hidden_node_to_drop] = 0 ###### NEW ###### 

# Build neural network 
# Input variables (10) 
# Which Node to dropout (32) 
stress = tflearn.input_data(shape=[None, num_stresses]) 
kinase_deletion = tflearn.input_data(shape=[None, num_kinase]) 

# This is the layer that I want to perform selective dropout on, 
# I should be able to specify which of the 32 nodes should output zero 
# based on a 1X32 vector of ones and zeros. 

stress_dropout = tf.multiply(stress, stresses_dropout_vector) ###### NEW ###### Drops out an input 
kinase = tflearn.fully_connected(stress_dropout, num_kinase, activation='relu') ### changed stress to stress_dropout 
kinase_dropout = tf.multiply(kinase, kinase_dropout_vector) ###### NEW ###### Drops out a hidden node 

transcription_factor = tflearn.fully_connected(kinase_dropout, num_transcription_factors, activation='relu') ### changed kinase to kinase_dropout 

gene = tflearn.fully_connected(transcription_factor, num_genes, activation='linear') 

adam = tflearn.Adam(learning_rate=0.00001, beta1=0.99) 

regression = tflearn.regression(gene, optimizer=adam, loss='mean_square', metric='R2') 

# Define model 
model = tflearn.DNN(regression, tensorboard_verbose=1) 

Wenn Hinzufügen in Tensorflow nicht funktioniert, müssen Sie nur eine regelmäßige alte tflearn finden.multiplizieren Sie die Funktion, die eine elementweise Multiplikation von zwei gegebenen Tensoren/Vektoren durchführt.

Hoffe, dass hilft.

+0

„Wenn Sie einen versteckten Knoten fallen müssen (in Schicht 2), es ist nur ein Vektor von 1 s und eine 0“ - Genau das möchte ich machen. Soll ich also einen zweiten Eingangstensor erzeugen, der nach der zweiten Schicht multipliziert? – kmace

+0

Ja, also hätten Sie zwei Platzhalter. ph_inputDropout und ph_layer2Dropout. also ist die Ausgabe von layer2 etwas wie Eingabe * Gewichte + Bias. Multiplizieren Sie das einfach mit den ph_layer2Dropout 1's und 0's. –

+0

oh, du hast Code gepostet. Ich werde sehen, ob ich es bearbeiten kann ... –

1

Für Vollständigkeit, hier ist meine endgültige Umsetzung:

import numpy as np 
import pandas as pd 
import tflearn 
import tensorflow as tf 

meta = pd.read_csv('../../input/nn/meta.csv') 
experiments = meta["Unnamed: 0"] 
del meta["Unnamed: 0"] 

stress_one_hot = pd.get_dummies(meta["train"]) 

kinase_deletion = pd.get_dummies(meta["Strain"]) 
kinase_one_hot = 1 - kinase_deletion 

expression = pd.read_csv('../../input/nn/data.csv') 
genes = expression["Unnamed: 0"] 
del expression["Unnamed: 0"] # This holds the gene names just so you know... 

expression = expression.transpose() 

# Set up data for tensorflow 
# Gene expression 
target = expression 
target = np.array(expression, dtype='float32') 
target_mean = target.mean(axis=0, keepdims=True) 
target_std = target.std(axis=0, keepdims=True) 
target = target - target_mean 
target = target/target_std 

# Stress information 
data1 = stress_one_hot 
data1 = np.array(data1, dtype='float32') 
data_mean = data1.mean(axis=0, keepdims=True) 
data_std = data1.std(axis=0, keepdims=True) 
data1 = data1 - data_mean 
data1 = data1/data_std 

# Kinase information 
data2 = kinase_one_hot 
data2 = np.array(data2, dtype='float32') 

# For Reference 
# data1.shape 
# #(301, 10) 
# data2.shape 
# #(301, 29) 


# Build the Neural Network 

num_stresses = 10 
num_kinase = 29 
num_transcription_factors = 200 
num_genes = 6692 

# Build neural network 
# Input variables (10) 
# Which Node to dropout (32) 
stress = tflearn.input_data(shape=[None, num_stresses]) 
kinase_deletion = tflearn.input_data(shape=[None, num_kinase]) 

# This is the layer that I want to perform selective dropout on, 
# I should be able to specify which of the 32 nodes should output zero 
# based on a 1X32 vector of ones and zeros. 
kinase = tflearn.fully_connected(stress, num_kinase, activation='relu') 
kinase_dropout = tf.mul(kinase, kinase_deletion) 

transcription_factor = tflearn.fully_connected(kinase_dropout, num_transcription_factors, activation='relu') 

gene = tflearn.fully_connected(transcription_factor, num_genes, activation='linear') 

adam = tflearn.Adam(learning_rate=0.00001, beta1=0.99) 

regression = tflearn.regression(gene, optimizer=adam, loss='mean_square', metric='R2') 

# Define model 
model = tflearn.DNN(regression, tensorboard_verbose=1) 

# Start training (apply gradient descent algorithm) 
model.fit([data1, data2], target, n_epoch=20000, show_metric=True, shuffle=True)#,validation_set=0.05) 
Verwandte Themen