совместное использование переменных в Tensorflow

Я пытаюсь реализовать сиамскую сеть в первый раз. У меня нет опыта совместного использования переменных. Я не знаю, почему я получаю эту ошибку «Переменная conv2/W не существует или не была создана с помощью tf.get_variable(). Вы имели в виду установить повторное использование = tf.AUTO_REUSE в VarScope?» Любая помощь приветствуется

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

person ufdul    schedule 02.12.2017    source источник


Ответы (1)


В net1 = tower_network() для параметра reuse установлено значение по умолчанию, которое равно True. Это приводит к тому, что тензорный поток пытается повторно использовать переменную с тем же именем, которого еще не существует.

Замена строки на 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')

Это по-прежнему приводит к ошибке об отсутствующей переменной «input», которую вы определяете в словаре канала, но больше нигде, но это другая проблема.

person wolff    schedule 02.12.2017
comment
Установка net1 = tower_network (повторное использование = False) приводит к той же ОШИБКЕ: переменная conv1/W уже существует, запрещена. Вы имели в виду установить reuse=True или reuse=tf.AUTO_REUSE в VarScope? Первоначально определено по адресу: - person ufdul; 02.12.2017
comment
Я отредактировал свой ответ и добавил измененный исходный файл. Этот файл решает проблему с переменной conv1/W. Остались другие проблемы, которые вам нужно решить. Также обратите внимание, что сообщение об ошибке, в котором говорится, что conv/W уже существует, отличается от сообщения об ошибке, в котором говорится, что conv/W не существует. - person wolff; 02.12.2017
comment
Возможно, мне нужно объяснить немного больше: вам нужно установить повторное использование на False при первом вызове Tower_network. Затем этот первый вызов создаст переменные. Последующие вызовы Tower_network с повторным использованием, установленным на True, будут использовать эти переменные и не будут пытаться создавать новые. - person wolff; 02.12.2017