2017-12-02 21 views
0

私は初めてsiameseネットワークを実装しようとしています。私は、変数の共有に関する経験はありません。なぜ私はこのエラーになるのかわかりません "変数conv2/Wは存在しないか、tf.get_variable()で作成されていません。VarScopeにreuse = tf.AUTO_REUSEを設定しましたか?すべてのヘルプはnet1 = tower_network()Tensorflowの変数共有

from __future__ import division, print_function, absolute_import 

import tensorflow as tf 

import tflearn 
from tflearn.layers.core import input_data, dropout, fully_connected 
from tflearn.layers.conv import conv_2d, max_pool_2d 
from tflearn.layers.normalization import local_response_normalization 
from tflearn.layers.estimator import regression 

# Data loading and preprocessing 
import tflearn.datasets.mnist as mnist 
X, Y, testX, testY = mnist.load_data(one_hot=True) 
X = X.reshape([-1, 28, 28, 1]) 
testX = testX.reshape([-1, 28, 28, 1]) 


def tower_network(reuse = True): 
    network = tflearn.input_data(shape=(None,28,28,1)) 
    network = tflearn.conv_2d(network, 32,1, activation='relu',reuse=reuse, scope='conv1') 
    network = tflearn.conv_2d(network, 64,1, activation='relu',reuse=reuse, scope='conv2') 
    network = tflearn.conv_2d(network, 128,1, activation='relu',reuse=reuse, scope='conv3') 

    network = tflearn.max_pool_2d(network, 2, strides=2) 

    network = tflearn.fully_connected(network, 512, activation='relu',reuse=reuse, scope='fc1') 

    network = tflearn.dropout(network, 0.5) 
    return network 


def similarity_network(net1, net2): 
    num_classes = 2 
    network = tflearn.merge([net1,net2], mode='concat', axis=1, name='Merge') # merge net1 and net2 networks 
    # fully connected layers 
    network = tflearn.fully_connected(network, 2048, activation='relu') 
    network = tflearn.dropout(network, 0.5) 
    network = tflearn.fully_connected(network, 2048, activation='relu') 
    network = tflearn.dropout(network, 0.5) 
    # softmax layers 
    network = tflearn.fully_connected(network, num_classes, activation='softmax') 
    return network 




net1 = tower_network() 
net2 = tower_network(reuse=True) 

#similarity network 
network = similarity_network(net1, net2) 
#output layer 
#network = tflearn.regression(network, optimizer='sgd', loss='hinge_loss', learning_rate=0.02) 
network = tflearn.regression(network, optimizer='sgd', loss='categorical_crossentropy', learning_rate=0.02) 

# Training 
model = tflearn.DNN(network, tensorboard_verbose=0) 
model.fit({'input': X}, {'target': Y}, n_epoch=20, 
      validation_set=({'input': testX}, {'target': testY}), 
snapshot_step=100, show_metric=True, run_id='convnet_mnist') 

答えて

0

を高く評価され、パラメータreuseTrueでそのデフォルト値に設定されています。 これは、まだ存在しない同じ名前の変数をテンソルフローで再利用しようとします。

net1 = tower_network(reuse=False)に行を置き換えると問題が解決するはずです。

from __future__ import division, print_function, absolute_import 

import tensorflow as tf 

import tflearn 
from tflearn.layers.core import input_data, dropout, fully_connected 
from tflearn.layers.conv import conv_2d, max_pool_2d 
from tflearn.layers.normalization import local_response_normalization 
from tflearn.layers.estimator import regression 

# Data loading and preprocessing 
import tflearn.datasets.mnist as mnist 
X, Y, testX, testY = mnist.load_data(one_hot=True) 
X = X.reshape([-1, 28, 28, 1]) 
testX = testX.reshape([-1, 28, 28, 1]) 


def tower_network(reuse = True): 
    network = tflearn.input_data(shape=(None,28,28,1)) 
    network = tflearn.conv_2d(network, 32,1, activation='relu',reuse=reuse, scope='conv1') 
    network = tflearn.conv_2d(network, 64,1, activation='relu',reuse=reuse, scope='conv2') 
    network = tflearn.conv_2d(network, 128,1, activation='relu',reuse=reuse, scope='conv3') 

    network = tflearn.max_pool_2d(network, 2, strides=2) 

    network = tflearn.fully_connected(network, 512, activation='relu',reuse=reuse, scope='fc1') 

    network = tflearn.dropout(network, 0.5) 
    return network 


def similarity_network(net1, net2): 
    num_classes = 2 
    network = tflearn.merge([net1,net2], mode='concat', axis=1, name='Merge') # merge net1 and net2 networks 
    # fully connected layers 
    network = tflearn.fully_connected(network, 2048, activation='relu') 
    network = tflearn.dropout(network, 0.5) 
    network = tflearn.fully_connected(network, 2048, activation='relu') 
    network = tflearn.dropout(network, 0.5) 
    # softmax layers 
    network = tflearn.fully_connected(network, num_classes, activation='softmax') 
    return network 




net1 = tower_network(reuse=False) 
net2 = tower_network(reuse=True) 

#similarity network 
network = similarity_network(net1, net2) 
#output layer 
#network = tflearn.regression(network, optimizer='sgd', loss='hinge_loss', learning_rate=0.02) 
network = tflearn.regression(network, optimizer='sgd', loss='categorical_crossentropy', learning_rate=0.02) 

# Training 
model = tflearn.DNN(network, tensorboard_verbose=0) 
model.fit({'input': X}, {'target': Y}, n_epoch=20, 
      validation_set=({'input': testX}, {'target': testY}), 
snapshot_step=100, show_metric=True, run_id='convnet_mnist') 

これはまだあなたがどこにもフィード辞書に定義するが、不足している変数「入力」に関するエラーにつながるが、それは別の問題です。

+0

net1 = tower_network(reuse = False)を設定すると、同じエラーが発生します。変数conv1/Wは既に存在し、許可されていません。 VarScopeでreuse = Trueまたはreuse = tf.AUTO_REUSEを設定することを意味しましたか?もともとの定義: – ufdul

+0

私は私の答えを編集し、修正されたソースファイルを追加しました。 このファイルは、変数 "conv1/W"に関する問題を解決します。あなたが解決する必要があるいくつかの他の問題が残っています。 「conv/Wは存在しません」というエラーメッセージは、「conv/Wが存在しません」というエラーメッセージとは異なります。 – wolff

+0

もう少し説明する必要があります。tower_networkを初めて呼び出すときに、再利用をFalseに設定する必要があります。この最初の呼び出しで変数が作成されます。再利用がTrueに設定されたtower_networkへの呼び出しを続けると、それらの変数が使用され、新しい変数を作成しようとはしません。 – wolff