Pytorch: доступ к пакетам изображений из разных классов из универсального загрузчика данных

Я пытаюсь обучить GAN с помощью tenorflow и pytorch. Я использую класс torchvision.datasets.ImageFolder (root, transform = None, target_transform = None, loader =) для загрузки изображений. У меня два класса: отрицательные и положительные. Как я могу получить доступ к партии негативных и позитивных изображений из загрузчика данных, когда я повторяю его. Посмотрите на итерацию загрузчика данных в цикле обучения. Вот код:

DATA_FOLDER = './tf_data/plasmodium_photos/'
IMAGE_PIXELS = 28*28*3
NOISE_SIZE = 10
BATCH_SIZE = 10


def noise(n_rows, n_cols):
    return np.random.normal(size=(n_rows, n_cols))

def xavier_init(size):
    in_dim = size[0] if len(size) == 1 else size[1]
    stddev = 1. / np.sqrt(float(in_dim))
    return tf.random_uniform(shape=size, minval=-stddev, maxval=stddev)

def images_to_vectors(images):
    return images.reshape(images.shape[0], 2352)


def vectors_to_images(vectors):
    return vectors.reshape(vectors.shape[0], 28, 28, 3)


def plasmodium_data():
    compose = transforms.Compose(
        [transforms.ToTensor(),
         transforms.Normalize((.5, .5, .5), (.5, .5, .5))
        ])
    return datasets.ImageFolder(DATA_FOLDER, transform=compose)



# Load data
data = plasmodium_data()

# Create loader with data, so that we can iterate over it
data_loader = DataLoader(data, batch_size=BATCH_SIZE, shuffle=True)


# Num batches
num_batches = len(data_loader)


## Discriminator

# Input
X = tf.placeholder(tf.float32, shape=(None, IMAGE_PIXELS))

# Layer 1 Variables
D_W1 = tf.Variable(xavier_init([2352, 1024]))
D_B1 = tf.Variable(xavier_init([1024]))

# Layer 2 Variables
D_W2 = tf.Variable(xavier_init([1024, 512]))
D_B2 = tf.Variable(xavier_init([512]))

# Layer 3 Variables
D_W3 = tf.Variable(xavier_init([512, 256]))
D_B3 = tf.Variable(xavier_init([256]))

# Out Layer Variables
D_W4 = tf.Variable(xavier_init([256, 1]))
D_B4 = tf.Variable(xavier_init([1]))

# Store Variables in list
D_var_list = [D_W1, D_B1, D_W2, D_B2, D_W3, D_B3, D_W4, D_B4]


## setting up a Generator network

# Input
Z = tf.placeholder(tf.float32, shape=(None, NOISE_SIZE))

# Layer 1 Variables
G_W1 = tf.Variable(xavier_init([10, 256]))
G_B1 = tf.Variable(xavier_init([256]))

# Layer 2 Variables
G_W2 = tf.Variable(xavier_init([256, 512]))
G_B2 = tf.Variable(xavier_init([512]))

# Layer 3 Variables
G_W3 = tf.Variable(xavier_init([512, 1024]))
G_B3 = tf.Variable(xavier_init([1024]))

# Out Layer Variables
G_W4 = tf.Variable(xavier_init([1024, 2352]))
G_B4 = tf.Variable(xavier_init([2352]))

# Store Variables in list
G_var_list = [G_W1, G_B1, G_W2, G_B2, G_W3, G_B3, G_W4, G_B4]

def discriminator(x):
    l1 = tf.nn.dropout(tf.nn.leaky_relu(tf.matmul(x,   D_W1) + D_B1, .2), .3)
    l2 = tf.nn.dropout(tf.nn.leaky_relu(tf.matmul(l1,  D_W2) + D_B2, .2), .3)
    l3 = tf.nn.dropout(tf.nn.leaky_relu(tf.matmul(l2,  D_W3) + D_B3, .2), .3)
    out = tf.matmul(l3, D_W4) + D_B4
    return out

def generator(z):
    l1 = tf.nn.leaky_relu(tf.matmul(z,  G_W1) + G_B1, .2)
    l2 = tf.nn.leaky_relu(tf.matmul(l1, G_W2) + G_B2, .2)
    l3 = tf.nn.leaky_relu(tf.matmul(l2, G_W3) + G_B3, .2)
    out = tf.nn.tanh(tf.matmul(l3, G_W4) + G_B4)
    return out

G_sample = generator(Z)
D_real = discriminator(X)
D_fake = discriminator(G_sample)

# Losses
D_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_real, labels=tf.ones_like(D_real)))
D_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake, labels=tf.zeros_like(D_fake)))
D_loss = D_loss_real + D_loss_fake
G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_fake, labels=tf.ones_like(D_fake)))

# Optimizers
D_opt = tf.train.AdamOptimizer(2e-4).minimize(D_loss, var_list=D_var_list)
G_opt = tf.train.AdamOptimizer(2e-4).minimize(G_loss, var_list=G_var_list)

# Testing configuration
num_test_samples = 100
test_noise = noise(num_test_samples, NOISE_SIZE)

# Variable initialization
num_epochs = 200

# Start interactive session
session = tf.InteractiveSession()

# Init Variables
tf.global_variables_initializer().run()

# Init Logger
# Needed to make sure the logging output is visible.
  # See https://github.com/tensorflow/tensorflow/issues/3047
tf.logging.set_verbosity(tf.logging.INFO)

X_batch = None
Z_batch = None
#Training
# Iterate through epochs
for epoch in range(num_epochs):
    for n_batch, (batch, label) in enumerate(data_loader):

        #print(epoch)
        # 1. Train Discriminator
        print(label)
        #print(type(batch))
        #print(batch.permute(0, 2, 3, 1).shape)
        X_batch = images_to_vectors(batch.permute(0, 2, 3, 1).numpy())
        feed_dict = {X: X_batch, Z: noise(BATCH_SIZE, NOISE_SIZE)}
        _, d_error, d_pred_real, d_pred_fake = session.run(
            [D_opt, D_loss, D_real, D_fake], feed_dict=feed_dict
        )

        # 2. Train Generator
        feed_dict = {Z: noise(BATCH_SIZE, NOISE_SIZE)}
        _, g_error = session.run(
            [G_opt, G_loss], feed_dict=feed_dict
        )

        if n_batch % 5 == 0:
            display.clear_output(True)
            # Generate images from test noise
            test_images = session.run(
                G_sample, feed_dict={Z: test_noise}
            )
            test_images = vectors_to_images(test_images)
            # Log Images
            for i in range(len(test_images)):
                imgplot = plt.imshow(test_images[i])


            # Log Status
            #tf.logging.info(
            #    epoch, num_epochs, n_batch, num_batches,
            #    d_error, g_error, d_pred_real, d_pred_fake
            #)

Насколько я понимаю, ваш код делает это (я не запускал код): получение пакета положительных и отрицательных образцов из данных. Вы имели в виду, что хотите, чтобы партия заполнялась ТОЛЬКО положительными или ТОЛЬКО отрицательными образцами?

Manuel Lagunas 11.04.2018 15:23

@ManuelLagunas Я имел в виду именно это. Приносим извинения, если сообщение не прошло.

Vladimir Fomene 12.04.2018 12:54

Я предлагаю вам создать свой собственный DataSet, чтобы добавить эту функциональность. Просто скопируйте исходный код ImageFolder Pytorch DataSet и укажите в инициализации список индексов, которые относятся только к положительным или отрицательным примерам в зависимости от переданного вами аргумента.

mbpaulus 20.04.2018 21:57
1
3
470
0

Другие вопросы по теме