Я начал изучать нейросети и кое как понял общие принципы но
Я не могу понять в tensorflow Где находится ввод вывод и проверка данных?
Мой
код
import os
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm
from keras.layers import Input
from keras.models import Model, Sequential
from keras.layers.core import Dense, Dropout
from keras.layers import LeakyReLU
from keras.datasets import mnist
from keras.optimizers import Adam
from keras import initializers
# Сообщите Keras, что мы используем tensorflow в качестве нашего внутреннего движка.
os.environ["KERAS_BACKEND"] = "tensorflow"
# Чтобы убедиться, что мы можем воспроизвести эксперимент и получить те же результаты
np.random.seed(10)
# Размер нашего вектора случайного шума.
random_dim = 100
# Пример символов из датасета MNIST
def load_minst_data():
# загрузить данные
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# нормализуйте наши входные данные, чтобы они находились в диапазоне [-1, 1]
x_train = (x_train.astype(np.float32) - 127.5)/127.5
# преобразовать x_train с формой (60000, 28, 28) в (60000, 784), поэтому мы имеем
# 784 столбца в строке
x_train = x_train.reshape(60000, 784)
return (x_train, y_train, x_test, y_test)
# создать сети генератора и дискриминатора
def get_optimizer():
return Adam(lr=0.0002, beta_1=0.5)
def get_generator(optimizer):
# Sequential последовательное объявление слоев
generator = Sequential()
generator.add(Dense(256, input_dim=random_dim, kernel_initializer=initializers.RandomNormal(stddev=0.02)))
generator.add(LeakyReLU(0.2))
generator.add(Dense(512))
generator.add(LeakyReLU(0.2))
generator.add(Dense(1024))
generator.add(LeakyReLU(0.2))
generator.add(Dense(784, activation='tanh'))
generator.compile(loss='binary_crossentropy', optimizer=optimizer)
return generator
def get_discriminator(optimizer):
discriminator = Sequential()
discriminator.add(Dense(1024, input_dim=784, kernel_initializer=initializers.RandomNormal(stddev=0.02)))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(512))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(256))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(1, activation='sigmoid'))
discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
return discriminator
# Осталась только соединить генератор с дискриминатором.
def get_gan_network(discriminator, random_dim, generator, optimizer):
# Изначально мы установили для обучаемого значение False, так как мы хотим тренировать только
# генератор или дискриминатор одновременно
discriminator.trainable = False
# вход ган (шум) будет 100-мерным вектором
gan_input = Input(shape=(random_dim,))
# вывод генератора (изображение)
x = generator(gan_input)
# получить вывод дискриминатора (вероятность того, что изображение реально или нет)
gan_output = discriminator(x)
gan = Model(inputs=gan_input, outputs=gan_output)
gan.compile(loss='binary_crossentropy', optimizer=optimizer)
return gan
# Дополнительно можно создать функцию, сохраняющую сгенерированные изображения через каждые 20 эпох
def plot_generated_images(epoch, generator, examples=100, dim=(10, 10), figsize=(10, 10)):
# Входные данные рандомное число
noise = np.random.normal(0, 1, size=[examples, random_dim])
# аи генратор изоброжения
generated_images = generator.predict(noise)
# Изменить форму
generated_images = generated_images.reshape(examples, 28, 28)
# Уменьшить картинку
plt.figure(figsize=figsize)
for i in range(generated_images.shape[0]):
# Расположение картинки на сетке
plt.subplot(dim[0], dim[1], i+1)
# Показать картинку
plt.imshow(generated_images[i], interpolation='nearest', cmap='gray_r')
plt.axis('off')
plt.tight_layout()
# Сохранить изоброжение
plt.savefig('gan_generated_image_epoch_%d.png' % epoch)
# Осталось только обучить нейросеть и посмотреть на результаты — изображения.
def train(epochs=1, batch_size=128):
# Получите данные для обучения и тестирования
x_train, y_train, x_test, y_test = load_minst_data()
# Разделите обучающие данные на пакеты размером 128
batch_count = x_train.shape[0] / batch_size
#Создайте нашу сеть GAN
adam = get_optimizer()
generator = get_generator(adam)
discriminator = get_discriminator(adam)
# Получить общую сеть дискрименатора и генератора
gan = get_gan_network(discriminator, random_dim, generator, adam)
for e in range(1, epochs+1):
print('-'*15, 'Epoch %d' % e, '-'*15)
for _ in range(int(batch_count)):
# Получите случайный набор входного шума и изображений
noise = np.random.normal(0, 1, size=[batch_size, random_dim])
image_batch = x_train[np.random.randint(0, x_train.shape[0], size=batch_size)]
# Создание поддельных изображений MNIST
print('Face image')
generated_images = generator.predict(noise)
# image_batch Текущие изоброжение
# generated_images Фальшовое изоброжение
X = np.concatenate([image_batch, generated_images])
# Метки для сгенерированных и реальных данных 0.9 или 0
y_dis = np.zeros(2*batch_size)
# Одностороннее сглаживание этикетки
y_dis[:batch_size] = 0.9
#print(y_dis)
# Дискриминатор поездов
print('Check image')
discriminator.trainable = True
# Данные на вход
#print(generated_images)
discriminator.train_on_batch(X, y_dis) # X face image, y_dis true image
# Генератор поездов
noise = np.random.normal(0, 1, size=[batch_size, random_dim]) # рандомное число
y_gen = np.ones(batch_size)
print(y_gen)
discriminator.trainable = False
gan.train_on_batch(noise, y_gen)
if e == 1 or e % 20 == 0:
plot_generated_images(e, generator)
if __name__ == '__main__':
train(1, 128)
Я имею в веду что
Вод идет через
x_train, y_train, x_test, y_test = load_minst_data()
image_batch = x_train[np.random.randint(0, x_train.shape[0], size=batch_size)]
X = np.concatenate([image_batch, generated_images])
y_dis = np.zeros(2*batch_size)
discriminator.train_on_batch(X, y_dis)
noise = np.random.normal(0, 1, size=[batch_size, random_dim]) # рандомное число
y_gen = np.ones(batch_size)
gan.train_on_batch(noise, y_gen)
Но я так и не понял по каким условиям и где идет проверка, и как оно понимает какие данные нужно вывести.
И где находятся метки в image_batch по которым нейросеть определяет что является 1 а что 7
Если упрощать то
Traning_date = [[image,3,real],[image,2,real],[image,5,real]]
for e in range(1, epochs+1):
Face_date = generator.train_on_batch(random(int),Array) # rerutn [[image,3,face]]
Test_Traning_date = Traning_date.append(Face_date)
test = Test_Traning_date[random(int)]
Test_discriminator = discriminator.train_on_batch(test, bool) # Вернуть либо True/False
# Проверить работу
if Test_discriminator != test[2]:
discriminator.reset # наказать нейроную сеть
if test[2] == False:
plt.imshow(test[0]) # Показать изоброжение
else:
if test[2] == False:
generator.reset # наказать нейроную сеть
Я не понимаю как вернуть bool для discriminator и array для generator
Я не понимаю как проверить правильность значения и сказать нейронной сети что оно неправильно
Вроде бы где-то в Sequential() и compile().
Можете пожалуйста объяснить этот момент и по подробнее.