Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅使用数据集的第一个样本进行训练的模型_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python 仅使用数据集的第一个样本进行训练的模型

Python 仅使用数据集的第一个样本进行训练的模型,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在培训以下模型: model = tf.keras.Sequential([ tf.keras.layers.Embedding(input_dim=30, output_dim=64, mask_zero=True), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=1024)), tf.keras.layers.Dense(128, activation="sigmoid"),

我正在培训以下模型:

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(input_dim=30, output_dim=64, mask_zero=True),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=1024)),
    tf.keras.layers.Dense(128, activation="sigmoid"),
    tf.keras.layers.Dense(10, activation="linear")
])
这个网络处理文本,因此我通过将每个字母转换为数值,将数据集中的每个字符串转换为numpy数组:

def converter(fen):
    normal_list = []

    for letter in fen:
        if letter == "/" or letter == " " or letter == "-":
            normal_list.append(0)
        elif letter == "p":
            normal_list.append(1)
        elif letter == "P":
            normal_list.append(2)
        elif letter == "n":
            normal_list.append(3)
        elif letter == "N":
            normal_list.append(4)
        elif letter == "b":
            normal_list.append(5)
        elif letter == "B":
            normal_list.append(6)
        elif letter == "r":
            normal_list.append(7)
        elif letter == "R":
            normal_list.append(8)
        elif letter == "q":
            normal_list.append(9)
        elif letter == "Q":
            normal_list.append(10)
        elif letter == "k":
            normal_list.append(11)
        elif letter == "K":
            normal_list.append(12)
        elif letter == "a":
            normal_list.append(13)
        elif letter == "b":
            normal_list.append(14)
        elif letter == "c":
            normal_list.append(15)
        elif letter == "d":
            normal_list.append(16)
        elif letter == "e":
            normal_list.append(17)
        elif letter == "f":
            normal_list.append(18)
        elif letter == "g":
            normal_list.append(19)
        elif letter == "h":
            normal_list.append(20)
        elif letter == "1":
            normal_list.append(21)
        elif letter == "2":
            normal_list.append(22)
        elif letter == "3":
            normal_list.append(23)
        elif letter == "4":
            normal_list.append(24)
        elif letter == "5":       
            normal_list.append(25) 
        elif letter == "6":
            normal_list.append(26)
        elif letter == "7":
            normal_list.append(27)
        elif letter == "8":
            normal_list.append(28)
        elif letter == "9":
            normal_list.append(29)
        else:
            normal_list.append(0)
    
    return np.array(normal_list, ndmin=2).astype(np.float32)
    # I used ndmin = 2 because the embedding layer turns it into ndmin = 3
然后,我导入数据集进行训练,并转换样本:

x_set = []
y_set = []

for position in df["position"]:
    x_set.append(cvt.converter(position))
len(x_集)
是950,
x_集[0]。shape
是(1,?)其中?在50到70之间变化

关于
y_集
,我使用了:

for a in range(len(df["position"])):
    y_set.append(np.array([
        df["Pawns"][a], df["Knights"][a], df["Bishops"][a], df["Rooks"][a],
        df["Queens"][a], df["Mobility"][a], df["King"][a], df["Threats"][a],
        df["Passed"][a], df["Space"][a]
    ], ndmin=2)) # If I don't use ndmin = 2 here I get ValueError: Data cardinality is ambiguous
它的透镜也是950

当我调用
model.fit(x\u集,y\u集,epochs=10)
模型只使用一个样本来训练网络:

Epoch 1/10
1/1 [==============================] - 19s 19s/step - loss: 0.2291 - mae: 0.4116
Epoch 2/10
1/1 [==============================] - 3s 3s/step - loss: 0.1645 - mae: 0.3302
Epoch 3/10
1/1 [==============================] - 3s 3s/step - loss: 0.0764 - mae: 0.1982
Epoch 4/10
1/1 [==============================] - 3s 3s/step - loss: 1.4347 - mae: 1.0087
Epoch 5/10
1/1 [==============================] - 3s 3s/step - loss: 0.0038 - mae: 0.0461
Epoch 6/10
1/1 [==============================] - 3s 3s/step - loss: 0.0532 - mae: 0.1780
Epoch 7/10
1/1 [==============================] - 3s 3s/step - loss: 0.0597 - mae: 0.1931
Epoch 8/10
1/1 [==============================] - 3s 3s/step - loss: 0.0522 - mae: 0.1814
Epoch 9/10
1/1 [==============================] - 3s 3s/step - loss: 0.0375 - mae: 0.1583
Epoch 10/10
1/1 [==============================] - 3s 3s/step - loss: 0.0252 - mae: 0.1432

它不应该使用所有950个x_集样本吗?这段代码有什么问题?

这一行表示它是在一批而不是一个样本上进行培训:

1/1 [==============================] - 19s 19s/step - loss: 0.2291 - mae: 0.4116
我相信Keras中的默认批量大小是32。Keras嵌入层需要整数,而不是浮点数,并且您使用的维度太多,因此您应该在转换器中更改这一行:

返回np.array(normal_list,ndmin=2).astype(np.float32)
为此:

返回np.array(普通列表)
您希望每个训练样本具有(?)的形状,在哪里?你的情况是50比70。您希望每个目标的形状为(10),因为您的模型将从其最后一个密集层输出10个值。结合样本数量,您希望
x_集
的形状为
(950,?)和
y_集
的形状为
(950,10)
。为了避免问题,您可能应该将所有样本填充为相同的大小,而不是在50到70之间变化

您的模型需要以下输入:

>>model.input\u形状
(没有,没有)
您的
model.summary()
如下所示(第一个
None
维度是批次大小,在您的情况下是950):

模型:“顺序”
_________________________________________________________________
层(类型)输出形状参数
=================================================================
嵌入_2(嵌入)(无,无,64)1920
_________________________________________________________________
双向(双向(无,2048)8921088
_________________________________________________________________
稠密的(稠密的)(无,128)262272
_________________________________________________________________
密集型_1(密集型)(无,10)1290
=================================================================
总参数:9186570
可培训参数:9186570
不可训练参数:0
_________________________________________________________________

简言之,我相信您正在将整个训练集嵌入到一个样本中。

模式是在完整数据集上进行训练,即如果需要,可以使用10次以上的训练,然后使用批量大小。我不认为只使用一个样本,您注意到了这一点吗?
1
这里指的是一个批次,而不是一个样本;请参阅