我是一个数据科学和Tensorflow的新手,所以,作为对我的“技能”的测试,我想尝试制作一个AI,你给它一个数字,然后它会返回一个28×28像素的该数字的图像。反过来做这件事是可能的,所以我想,为什么不呢?实际上,代码运作得相当好,但AI的准确率非常低,低到它只是返回随机像素。除了可能进行100个epoch之外,有没有办法让这个AI更准确?我使用的代码如下:
import tensorflow as tfimport tensorflow.keras as tkimport numpy as npimport matplotlib.pyplot as plt(train_data, train_labels), (test_data, test_labels) = tk.datasets.mnist.load_data()model = tk.Sequential([ tk.layers.Dense(64, activation='relu'), tk.layers.Dense(64, activation='relu'), tk.layers.Dense(784, activation='relu')]) history = model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics=['acc'])train_data = np.reshape(train_data, (60000, 784))test_data = np.reshape(test_data, (-1, 784))model.fit(train_labels, train_data, epochs=10, validation_data=(test_labels, test_data))result = model.predict([2])result = np.reshape(result, (28, 28))plt.imshow(result)plt.show()
我使用的是google.colab,因为我还没有能够在我的电脑上安装Tensorflow,这可能与此有关。提前感谢任何回答!
回答:
这是完全可能的,并且已经导致了一个广泛的研究领域,称为生成对抗网络(GANs)。
首先,让我列出你的方法存在的问题:
-
你使用单个数字作为输入,并期望模型理解它。这在实践中行不通。最好使用一种称为one-hot编码的表示方法。
-
对于每个标签,存在多个图像。从数学上讲,如果域X由标签组成(无论是否使用one-hot编码),而范围Y由图像组成,那么这种关系是一种一对多的关系,这种关系无法通过监督方式学习。从本质上讲,监督学习只能用于建模多对一的关系,或一对一的关系(尽管对于这种情况使用机器学习没有意义;字典是更好的选择)。因此,预测图像的标签很容易,但使用完全监督的方法为标签生成图像是不可能的,除非你只使用一个图像进行训练。
GANs解决问题(2)的方法是根据一组随机值生成一个“可能的”图像。GANs的变体允许指定要生成的精确值。
我建议阅读论文,该论文介绍了GANs。然后尝试基本的GAN,再继续生成特定的数字。