首页 > 解决方案 > 如何从训练数据列表和预期结果中创建张量流数据库,以及如何构造独特的网络形状

问题描述

我正在创建一个神经网络,并定制了一些来自国际象棋游戏的位置训练数据。然后我创建了一个函数,将这些数据分成 797*2 位的二进制输入和预期的输出为 0 和 1 之间的两个浮点数(特别是 [0, 1], [0.5, 0.5], [1, 0] 是唯一的有预期的产出)。以下是包含此数据的变量示例:

x_train = [[1, 0, 0,... 0, 0, 1],... [0, 0, 0,... 0, 1, 0]] # input: each index contains two positions with 797 bit binary values. couple hundred thousand items in the list.
y_train = [[0, 1], [0.5, 0.5],... [0.5, 0.5]] # expected output: each index contains two digits between 0 and 1 showing which position is better, or are they equal. same size as x_train.

然而,我为 tensorflow 找到的所有教程都展示了人们使用他们定制数据库中的数据,我不知道如何构造我的数据以便 tensorflow 可以读取它。这就是我的网络的样子(除了每个输入 797 个节点):

图像显示了一个神经网络图,其中两棵树会聚成一棵树

如您所见,前 4 层分为两部分,其中节点不能混合,第 5 层连接到第 4 层中的每个节点,就像普通网络一样。然后它照常继续,直到我们得到我们的输出。如果您有兴趣,它基于Eli (Omid) David、Nathan S. Netanyahu 和 Lior Wolf的这篇研究论文

这就是我尝试使用 tensorflow 构建它的方式:

import tensorflow as tf

# create the models
model_c = tf.keras.Sequential()
model_c.add(tf.keras.Input(shape=(400,)))
model_c.add(tf.keras.layers.Dense(200, activation="sigmoid"))
model_c.add(tf.keras.layers.Dense(100, activation="sigmoid"))
model_c.add(tf.keras.layers.Dense(2, activation="sigmoid"))
model_b = tf.keras.Sequential()
model_b.add(tf.keras.Input(shape=(797,)))
model_b.add(tf.keras.layers.Dense(600, activation="sigmoid"))
model_b.add(tf.keras.layers.Dense(400, activation="sigmoid"))
model_b.add(tf.keras.layers.Dense(200, activation="sigmoid"))
model_a = tf.keras.Sequential()
model_a.add(tf.keras.Input(shape=(797,)))
model_a.add(tf.keras.layers.Dense(600, activation="sigmoid"))
model_a.add(tf.keras.layers.Dense(400, activation="sigmoid"))
model_a.add(tf.keras.layers.Dense(200, activation="sigmoid"))


# compile the models
model_c.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])
model_b.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])
model_a.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])

# run the models
# idk how

我真的不知道如何完成这项工作,因为再一次,我发现的每个教程都涉及更普通的东西(比如导入预制数据库和简单的神经网络)。谢谢你的帮助。

标签: pythonpython-3.xtensorflowkerastensorflow2.0

解决方案


使用此代码:

import tensorflow as tf

input = tf.keras.Input(shape=(797,))
model_a = tf.keras.Sequential(
    [tf.keras.layers.Dense(600, activation="sigmoid"),
    tf.keras.layers.Dense(400, activation="sigmoid"),
    tf.keras.layers.Dense(200, activation="sigmoid")]
)
output1 = model_a(input)

model_b = tf.keras.Sequential(
    [tf.keras.layers.Dense(600, activation="sigmoid"),
    tf.keras.layers.Dense(400, activation="sigmoid"),
    tf.keras.layers.Dense(200, activation="sigmoid")]
)
output2 = model_b(input)

x = tf.keras.layers.Concatenate()([output1, output2])
model_c = tf.keras.Sequential(
    [tf.keras.layers.Dense(200, activation="sigmoid"),
    tf.keras.layers.Dense(100, activation="sigmoid"),
    tf.keras.layers.Dense(2, activation="sigmoid")]
)
output = model_c(x)

model = tf.keras.Model(input, output)

# compile the models
model.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])

# run the models
x_train = tf.random.uniform([2000, 797], 0, 2, tf.int32)
y_train = tf.random.uniform([2000, 2])
model.fit(x_train, y_train)

推荐阅读