Python TensorFlow 2.0[条件x==y未保持元素状态:]

Python TensorFlow 2.0[条件x==y未保持元素状态:],python,python-3.x,tensorflow,keras,Python,Python 3.x,Tensorflow,Keras,我正在使用TensorFlow 2和Keras训练一个国际象棋程序。以前,如果我将数据加载到与模型训练相同的脚本中,我就可以实现这一点,但是随着数据集变得越来越大,对数据进行pickle并重新加载的速度要快得多。当我这样做的时候,我现在得到了这组错误,即使在将我的模型裁剪到1层以简化问题之后 有人能解释一下“条件x==y未保存元素信息”错误消息的含义吗 代码如下: import tensorflow as tf import numpy as np import pandas as pd imp

我正在使用TensorFlow 2和Keras训练一个国际象棋程序。以前,如果我将数据加载到与模型训练相同的脚本中,我就可以实现这一点,但是随着数据集变得越来越大,对数据进行pickle并重新加载的速度要快得多。当我这样做的时候,我现在得到了这组错误,即使在将我的模型裁剪到1层以简化问题之后

有人能解释一下“条件x==y未保存元素信息”错误消息的含义吗

代码如下:

import tensorflow as tf
import numpy as np
import pandas as pd
import chess
from util import *
from sklearn.model_selection import train_test_split
import pickle
import time

bb = chess.Board()

print("Reading examplesMatrix...")
examplesMatrix = pickle.load(open('examplesMatrix.sav','rb'))
examplesMatrix = examplesMatrix.T

print("Reading Y_vec...")
Y_vec = pickle.load(open('Yvector.sav','rb'))

print(examplesMatrix.shape)
print(Y_vec.shape)

X_train, X_test, y_train, y_test = train_test_split(examplesMatrix, Y_vec, test_size=0.2)

start_time = time.time()

model = tf.keras.models.Sequential([
    #tf.keras.layers.Conv1D(kernel_size=8, filters=100),
    tf.keras.layers.Dense(activation='relu', units=600)
    #tf.keras.layers.Dense(units=400, activation='relu'),
    #tf.keras.layers.Dense(units=200, activation='relu'),
    #tf.keras.layers.Dense(units=100, activation='relu'),
    #tf.keras.layers.Dense(3, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(X_train, y_train) #, epochs=5)
model.evaluate(X_test, y_test)

print("Execution time: %s seconds ---" % (time.time() - start_time))
fname = "/home/jwales/eclipse-workspace/djwdata/science/chessmaster/keras_full_29OctC1.sav"
print("Saving as: "+fname)
model.save(fname)
以下是输出: (请注意,我的板子是9x8,因此我有额外的8个元素用于设计功能,如板子总分、移动次数以及移动的对象)

正在阅读示例矩阵。。。
阅读你的生活。。。
(1212827, 8, 9)
(1212827, 1)
2019-10-29 10:47:17.469971:I tensorflow/core/platform/cpu_feature_guard.cc:142]您的cpu支持该tensorflow二进制文件未编译为使用的指令:AVX2 FMA
2019-10-29 10:47:17.491088:I tensorflow/core/platform/profile_utils/cpu_utils.cc:94]cpu频率:2808000000 Hz
2019-10-29 10:47:17.491373:I TysFrace/编译器/ XLA/Service / Service .CC:168)XLA服务0x4B4E870在平台主机上执行计算。设备:
2019-10-29 10:47:17.491409:I tensorflow/compiler/xla/service/service.cc:175]StreamExecutor设备(0):主机,默认版本
培训970261个样本
2019-10-29 10:47:18.220470:W tensorflow/core/common_runtime/base_collective_executor.cc:216]BaseCollectiveExecutor::StartPort无效参数:断言失败:[]条件x==y未保持元素状态:[x(丢失/输出\U 1\U丢失/稀疏OfMaxCrossEntropyWithLogits/Shape_1:0)=][32 1][y(丢失/输出\u 1 \u丢失/稀疏SoftMaxCrossEntropyWithLogits/跨步\u切片:0)=][32 8]
[{{node loss/output_1_loss/SparseSoftmaxCrossEntropyWithLogits/assert_equal/assert/assert}}]
32/970261[……]-预计到达时间:3:45:10回溯(最近一次呼叫最后一次):
文件“kt_trainer.py”,第68行,在
模型拟合(X_列,y_列)#,历次=5)
文件“/usr/local/lib/python3.7/dist-packages/tensorflow_-core/python/keras/engine/training.py”,第728行,在fit中
使用多处理=使用多处理)
文件“/usr/local/lib/python3.7/dist-packages/tensorflow\u-core/python/keras/engine/training\u v2.py”,第324行,以适合的形式
总(单位时间=时间)
文件“/usr/local/lib/python3.7/dist packages/tensorflow\u core/python/keras/engine/training\u v2.py”,第123行,在run\u one\u中
批处理输出=执行函数(迭代器)
文件“/usr/local/lib/python3.7/dist packages/tensorflow\u core/python/keras/engine/training\u v2\u utils.py”,第86行,执行函数
分布函数(输入函数)
文件“/usr/local/lib/python3.7/dist packages/tensorflow_core/python/eager/def_function.py”,第457行,在调用中__
结果=自身调用(*args,**kwds)
文件“/usr/local/lib/python3.7/dist packages/tensorflow_core/python/eager/def_function.py”,第520行,在调用中
返回self.\u无状态\u fn(*args,**kwds)
文件“/usr/local/lib/python3.7/dist packages/tensorflow\u core/python/eager/function.py”,第1823行,在调用中__
返回图形\函数。\过滤\调用(args,kwargs)\ pylint:disable=受保护的访问
文件“/usr/local/lib/python3.7/dist packages/tensorflow\u core/python/eager/function.py”,第1141行,在过滤调用中
自捕获(U输入)
文件“/usr/local/lib/python3.7/dist packages/tensorflow\u core/python/eager/function.py”,第1224行,位于调用平面中
ctx、args、取消管理器=取消管理器)
文件“/usr/local/lib/python3.7/dist packages/tensorflow_core/python/eager/function.py”,第511行,在调用中
ctx=ctx)
文件“/usr/local/lib/python3.7/dist packages/tensorflow\u core/python/eager/execute.py”,第67行,在quick\u execute中
六、将_从(核心状态)提升到_异常(例如代码、消息),无
文件“”,第2行,从
tensorflow.python.framework.errors\u impl.InvalidArgumentError:断言失败:[]条件x==y未保持元素状态:[x(丢失/输出\u 1\u丢失/稀疏SoftMaxCrossEntropyWithLogits/Shape\u 1:0)=][32 1][y(丢失/输出\u 1\u丢失/稀疏SoftMaxCrossEntropyWithLogits/Striped\u切片:0)=][32 8]
[[node loss/output\u 1\u loss/SparseSoftmaxCrossEntropyWithLogits/assert\u equal/assert/assert(定义于/usr/local/lib/python3.7/dist packages/tensorflow\u core/python/framework/ops.py:1751)][Op:\u推断\u分布式函数\u 716]
函数调用堆栈:
分布函数

问题在于损失函数接收到两个不同形状的张量

[条件x==y未保持元素状态:][x(丢失/输出\u 1\u丢失/稀疏SoftMaxCrossEntropyWithLogits/Shape\u 1:0)=][32 1][y(丢失/输出\u 1\u丢失/稀疏SoftMaxCrossEntropyWithLogits/Strated\u切片:0)=][32 8]

所以其中一个输入是[32,1],另一个是[32,8],但损失函数要求输入的形状相等。据我所知,您有8个类,因此您需要模型输出为[32,8]。将中的
units=600
替换为
units=8

tf.keras.layers.Dense(activation='relu', units=600)

或者添加其他层以具有输出形状
(批次大小,8)

当x值超出范围
(0,1)

时,密集层也会出现此错误消息

尝试:


在调用密集层之前。

很抱歉,您的解决方案似乎不起作用。如果我将单位从600更改为任何其他数字,则输出不变。我还尝试显式地告诉它输入大小:tf.keras.layers.Dense(units=3,input_shape=(8,9)),得到了相同的结果。我想从模型中得到的输出是0,1,2==白输,平局,白赢。看起来标签的形状是[32,8],但模型的输出是[32,1]。也许您需要以其他方式解析标签
tf.keras.layers.Dense(activation='relu', units=600)
   tf.keras.layers.Flatten()