2

私はいくつかのデータで DNN モデルをトレーニングしており、学習した重みを分析して、私が研究している真のシステム (生物学におけるシグナル伝達カスケード) について何かを学びたいと考えています。生物学的 NN について学ぶために人工 NN を使用していると言えるでしょう。

トレーニング例ごとに、最上位層でシグナル伝達を担う単一の遺伝子を削除しました。

このシグナル伝達カスケードを NN としてモデリングし、最初の隠れ層のノードの 1 つを削除していると、ドロップアウトの実際のバージョンを実行していることに気付きました。

したがって、ドロップアウトを使用してモデルをトレーニングしたいと思いますが、オンラインで見たドロップアウトの実装はノードをランダムにドロップアウトするようです。必要なのは、トレーニング例ごとにドロップアウトするノードを指定する方法です。

これを実装する方法に関するアドバイスはありますか?私はどのパッケージにもオープンですが、現在、私がすでに行ったことはすべて Tensorflow にあるため、そのフレームワークを使用するソリューションをいただければ幸いです。

説明された詳細を好む人のために:

10 個の入力変数があり、最初のレイヤーの 32 個の relu ノードに完全に接続されています。これらは、出力に完全に接続されている 2 番目のレイヤー (relu) に完全に接続されています (回帰を行っているため線形)。

10 個の入力変数に加えて、28 個のノードのうちどれをドロップアウトする必要があるかもわかっています。

トレーニング時にこれを指定する方法はありますか?

現在使用しているコードは次のとおりです。

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)
4

2 に答える 2

4

入力変数と、ドロップしたいものを除いてすべて 1 の等しいサイズのベクトルを提供します。それは 0 です。

最初の操作は、削除したい遺伝子をゼロにするための乗算です。そこから先は、あなたが今持っているものとまったく同じになるはずです。

テンソルフローに渡す前に乗算 (遺伝子をゼロにする) するか、別のプレースホルダーを追加して、変数と同じように feed_dict のグラフにフィードすることができます。後者の方が良いかもしれません。

(レイヤー 2 の) 非表示のノードをドロップする必要がある場合、それは 1 と 0 の別のベクトルです。

それが機能するかどうか、またはさらにサポートが必要な場合はお知らせください。


編集: わかりましたので、tflearn を実際にはあまり使用していません (通常の tensorflow を行っただけです) が、tensorflow と tflearn を組み合わせることができると思います。基本的に、私は追加しましtf.multiplyた。別のものを追加して、tflearn.input_data(shape =[num_stresses])およびtflearn.input_data(shape =[num_kinase])のプレースホルダーを提供する必要がある場合がstresses_dropout_vectorありkinase_dropout_vectorます。そしてもちろん、これら 2 つのベクトルのゼロの数と位置を変更できます。

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)

tensorflow の追加が機能しない場合は、指定された 2 つのテンソル/ベクトルの要素ごとの乗算を行う通常の古い tflearn.multiply 関数を見つける必要があります。

それが役立つことを願っています。

于 2017-01-11T07:15:33.127 に答える
1

完全を期すために、これが私の最終的な実装です。

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)
于 2017-01-11T20:37:28.360 に答える