Python 3.x 重塑的输入是一个值为788175的张量,但请求的形状有1050900

Python 3.x 重塑的输入是一个值为788175的张量,但请求的形状有1050900,python-3.x,tensorflow,autoencoder,Python 3.x,Tensorflow,Autoencoder,我正在导入一些要训练的数据数组,但tensorflow的输出错误如下 inp = open('train.csv',"rb") X = pickle.load(inp) X = X/255.0 X = np.array(X) model = keras.Sequential([ keras.layers.Flatten(input_shape=(113, 75, 3)), keras.layers.Dense(75, activation=tf.nn.relu), ker

我正在导入一些要训练的数据数组,但tensorflow的输出错误如下

inp = open('train.csv',"rb")
X = pickle.load(inp)
X = X/255.0
X = np.array(X)
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(113, 75, 3)),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(50, activation=tf.nn.relu),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(25425, activation=tf.nn.softmax),
    keras.layers.Reshape((113, 75, 4))
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(X, X, epochs=5)
我应该能够创建一个自动编码器,但程序输出: 回溯(最近一次呼叫最后一次):

文件“C:\Users\dalto\Documents\geo4\train.py”,第24行,在
模型拟合(X,X,历元=5)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\engine\training.py”,第643行
使用多处理=使用多处理)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\engine\training\u arrays.py”,第664行
步骤(名称=“每个时代的步骤”)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\engine\training\u arrays.py”,第383行,在模型迭代中
批量输出=f(批量输入)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\backend.py”,第3510行,在调用中__
输出=自。\图形\ fn(*转换的\输入)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\function.py”,第572行,在调用__
返回自我。呼叫平面(args)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\function.py”,第671行,位于调用平面中
输出=自我推理函数调用(ctx,args)
调用中第445行的文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\function.py”
ctx=ctx)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\execute.py”,第67行,在quick\u execute中
六、将_从(核心状态)提升到_异常(例如代码、消息),无
文件“”,第3行,从
tensorflow.python.framework.errors\u impl.InvalidArgumentError:重塑的输入是一个具有788175个值的张量,但请求的形状具有1050900个值
[[节点重塑/重塑(定义于C:\Users\dalto\Documents\geo4\train.py:24)]][Op:_u推理_ukeras_uscratch_922]
函数调用堆栈:
keras_划痕图
如果我将重塑更改为(113,75,3),我会得到这样的结果,它不会修复错误,只是更改了它:

Traceback (most recent call last):
  File "C:\Users\dalto\Documents\geo4\train.py", line 24, in <module>
    model.fit(X, X, epochs=5)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 643, in fit
use_multiprocessing=use_multiprocessing)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 664, in fit
steps_name='steps_per_epoch')
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 383, in model_iteration
    batch_outs = f(ins_batch)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\backend.py", line 3510, in __call__
outputs = self._graph_fn(*converted_inputs)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 572, in __call__
return self._call_flat(args)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 671, in _call_flat
outputs = self._inference_function.call(ctx, args)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 445, in call
ctx=ctx)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\execute.py", line 67, in quick_execute
six.raise_from(core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Incompatible 
shapes: [31,113,75] vs. [31,113,75,3]
 [[node metrics/accuracy/Equal (defined at 
C:\Users\dalto\Documents\geo4\train.py:24) ]] [Op:__inference_keras_scratch_graph_922]
回溯(最近一次呼叫最后一次):
文件“C:\Users\dalto\Documents\geo4\train.py”,第24行,在
模型拟合(X,X,历元=5)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\engine\training.py”,第643行
使用多处理=使用多处理)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\engine\training\u arrays.py”,第664行
步骤(名称=“每个时代的步骤”)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\engine\training\u arrays.py”,第383行,在模型迭代中
批量输出=f(批量输入)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\keras\backend.py”,第3510行,在调用中__
输出=自。\图形\ fn(*转换的\输入)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\function.py”,第572行,在调用__
返回自我。呼叫平面(args)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\function.py”,第671行,位于调用平面中
输出=自我推理函数调用(ctx,args)
调用中第445行的文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\function.py”
ctx=ctx)
文件“C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site packages\tensorflow\Python\eager\execute.py”,第67行,在quick\u execute中
六、将_从(核心状态)提升到_异常(例如代码、消息),无
文件“”,第3行,从
tensorflow.python.framework.errors\u impl.InvalidArgumentError:不兼容
形状:[31113,75]对[31113,75,3]
[[节点度量/精度/相等(定义于
C:\Users\dalto\Documents\geo4\train.py:24)][Op:\u推理\u keras\u scratch\u图形\u 922]

整形后的输入和输出大小必须相同。因此,您必须使用
(113,75,3)
而不是
(113,75,4)

现在,通过使用
(113,75,3)
,您得到了不相等的错误,因为您使用
稀疏的\u分类的\u交叉熵作为损失函数,您应该使用
分类的\u交叉熵

这两者之间的基本区别在于,当使用直接整数作为标签时,
sparse\u category\u crossentropy
起作用,而当使用一个热编码标签时,
category\u crossentropy
起作用

更正:

inp = open('train.csv',"rb")
X = pickle.load(inp)
X = X/255.0
X = np.array(X)
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(113, 75, 3)),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(50, activation=tf.nn.relu),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(25425, activation=tf.nn.softmax),
    keras.layers.Reshape((113, 75, 4))
])
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(X, X, epochs=5)

整形后的输入和输出大小必须相同。因此,您必须使用
(113,75,3)
而不是
(113,75,4)

现在,通过使用
(113,75,3)
,您得到了不相等的错误,因为您使用
稀疏的\u分类的\u交叉熵作为损失函数,您应该使用
分类的\u交叉熵

这两者之间的基本区别在于,当使用直接整数作为标签时,
sparse\u category\u crossentropy
起作用,而当使用一个热编码标签时,
category\u crossentropy
起作用

更正:

inp = open('train.csv',"rb")
X = pickle.load(inp)
X = X/255.0
X = np.array(X)
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(113, 75, 3)),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(50, activation=tf.nn.relu),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(25425, activation=tf.nn.softmax),
    keras.layers.Reshape((113, 75, 4))
])
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(X, X, epochs=5)

输入形状为
(113,75,3)
。输出为
(113,75,4)
。修复此问题可能会有所帮助。它会给我一个完全不同的错误。如果将输出重塑为[x,y,z],则
x*y*z
必须等于上一层的大小。在您的情况下
25425!=113*745*4=33900
@用户2653663正确,使用
(113,75,3)
。输入形状为
(113,75,3)
。输出为
(113,75,4)
。修复此问题可能会有所帮助。它会给我一个完全不同的错误。如果