Keras ValueError:尺寸必须相等问题

2023-11-24

即使应用了答案和评论中的建议后,尺寸不匹配问题似乎仍然存在。这也是要复制的确切代码和数据文件:https://drive.google.com/drive/folders/1q67s0VhB-O7J8OtIhU2jmj7Kc4LxL3sf?usp=sharing

这该如何纠正!?最新的代码、模型摘要、使用的函数和我得到的错误如下

type_ae=='dcor'
#Wrappers for keras
def custom_loss1(y_true,y_pred):
    dcor = -1*distance_correlation(y_true,encoded_layer)
    return dcor

def custom_loss2(y_true,y_pred):
    recon_loss = losses.categorical_crossentropy(y_true, y_pred)
    return recon_loss

input_layer =  Input(shape=(64,64,1))

encoded_layer = Conv2D(filters = 128, kernel_size = (5,5),padding = 'same',activation ='relu', 
                       input_shape = (64,64,1))(input_layer)
encoded_layer = MaxPool2D(pool_size=(2,2))(encoded_layer)
encoded_layer = Dropout(0.25)(encoded_layer)
encoded_layer = (Conv2D(filters = 64, kernel_size = (3,3),padding = 'same',activation ='relu'))(encoded_layer)
encoded_layer = (MaxPool2D(pool_size=(2,2)))(encoded_layer)
encoded_layer = (Dropout(0.25))(encoded_layer)

encoded_layer = (Conv2D(filters = 64, kernel_size = (3,3),padding = 'same',activation ='relu'))(encoded_layer)
encoded_layer = (MaxPool2D(pool_size=(2,2)))(encoded_layer)
encoded_layer = (Dropout(0.25))(encoded_layer)
encoded_layer = Conv2D(filters = 1, kernel_size = (3,3),padding = 'same',activation ='relu', 
                       input_shape = (64,64,1),strides=1)(encoded_layer)
encoded_layer = ZeroPadding2D(padding=(28, 28), data_format=None)(encoded_layer)

decoded_imag = Conv2D(8, (2, 2), activation='relu', padding='same')(encoded_layer)
decoded_imag = UpSampling2D((2, 2))(decoded_imag)
decoded_imag = Conv2D(8, (3, 3), activation='relu', padding='same')(decoded_imag)
decoded_imag = UpSampling2D((2, 2))(decoded_imag)
decoded_imag = Conv2D(16, (3, 3), activation='relu', padding='same')(decoded_imag)
decoded_imag = UpSampling2D((2, 2))(decoded_imag)
decoded_imag = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(decoded_imag)
flat_layer = Flatten()(decoded_imag)
dense_layer = Dense(256,activation = "relu")(flat_layer)          
dense_layer = Dense(64,activation = "relu")(dense_layer) 
dense_layer = Dense(32,activation = "relu")(dense_layer) 
output_layer = Dense(9, activation = "softmax")(dense_layer)
autoencoder = Model(input_layer, [encoded_layer,output_layer])
autoencoder.summary()
autoencoder.compile(optimizer='adadelta', loss=[custom_loss1,custom_loss2])
autoencoder.fit(x_train,[x_train, y_train],batch_size=32,epochs=3,shuffle=True,
                validation_data=(x_val, [x_val,y_val]))

数据的维度为:

x_train.shape:  (4000, 64, 64, 1)
x_val.shape:  (1000, 64, 64, 1)
y_train.shape:  (4000, 9)
y_val.shape:  (1000, 9)

损失看起来像:

def custom_loss1(y_true,y_pred):
    dcor = -1*distance_correlation(y_true,encoded_layer)
    return dcor

def custom_loss2(y_true,y_pred):
    recon_loss = losses.categorical_crossentropy(y_true, y_pred)
    return recon_loss

相关函数基于张量,如下所示:

def distance_correlation(y_true,y_pred):
    pred_r = tf.reduce_sum(y_pred*y_pred,1)
    pred_r = tf.reshape(pred_r,[-1,1])
    pred_d = pred_r - 2*tf.matmul(y_pred,tf.transpose(y_pred))+tf.transpose(pred_r)
    true_r = tf.reduce_sum(y_true*y_true,1)
    true_r = tf.reshape(true_r,[-1,1])
    true_d = true_r - 2*tf.matmul(y_true,tf.transpose(y_true))+tf.transpose(true_r)
    concord = 1-tf.matmul(y_true,tf.transpose(y_true))
    #print(pred_d)
    #print(tf.reshape(tf.reduce_mean(pred_d,1),[-1,1]))
    #print(tf.reshape(tf.reduce_mean(pred_d,0),[1,-1]))
    #print(tf.reduce_mean(pred_d))
    tf.check_numerics(pred_d,'pred_d has NaN')
    tf.check_numerics(true_d,'true_d has NaN')
    A = pred_d - tf.reshape(tf.reduce_mean(pred_d,1),[-1,1]) - tf.reshape(tf.reduce_mean(pred_d,0),[1,-1]) + tf.reduce_mean(pred_d)
    B = true_d - tf.reshape(tf.reduce_mean(true_d,1),[-1,1]) - tf.reshape(tf.reduce_mean(true_d,0),[1,-1]) + tf.reduce_mean(true_d)
    #dcor = -tf.reduce_sum(concord*pred_d)/tf.reduce_sum((1-concord)*pred_d)
    dcor = -tf.log(tf.reduce_mean(A*B))+tf.log(tf.sqrt(tf.reduce_mean(A*A)*tf.reduce_mean(B*B)))#-tf.reduce_sum(concord*pred_d)/tf.reduce_sum((1-concord)*pred_d)
    #print(dcor.shape)
    #tf.Print(dcor,[dcor])
    #dcor = tf.tile([dcor],batch_size)
    return (dcor)

模型摘要如下所示:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 64, 64, 1)         0         
_________________________________________________________________
conv2d_30 (Conv2D)           (None, 64, 64, 128)       3328      
_________________________________________________________________
max_pooling2d_13 (MaxPooling (None, 32, 32, 128)       0         
_________________________________________________________________
dropout_13 (Dropout)         (None, 32, 32, 128)       0         
_________________________________________________________________
conv2d_31 (Conv2D)           (None, 32, 32, 64)        73792     
_________________________________________________________________
max_pooling2d_14 (MaxPooling (None, 16, 16, 64)        0         
_________________________________________________________________
dropout_14 (Dropout)         (None, 16, 16, 64)        0         
_________________________________________________________________
conv2d_32 (Conv2D)           (None, 16, 16, 64)        36928     
_________________________________________________________________
max_pooling2d_15 (MaxPooling (None, 8, 8, 64)          0         
_________________________________________________________________
dropout_15 (Dropout)         (None, 8, 8, 64)          0         
_________________________________________________________________
conv2d_33 (Conv2D)           (None, 8, 8, 1)           577       
_________________________________________________________________
zero_padding2d_5 (ZeroPaddin (None, 64, 64, 1)         0         
_________________________________________________________________
conv2d_34 (Conv2D)           (None, 64, 64, 8)         40        
_________________________________________________________________
up_sampling2d_10 (UpSampling (None, 128, 128, 8)       0         
_________________________________________________________________
conv2d_35 (Conv2D)           (None, 128, 128, 8)       584       
_________________________________________________________________
up_sampling2d_11 (UpSampling (None, 256, 256, 8)       0         
_________________________________________________________________
conv2d_36 (Conv2D)           (None, 256, 256, 16)      1168      
_________________________________________________________________
up_sampling2d_12 (UpSampling (None, 512, 512, 16)      0         
_________________________________________________________________
conv2d_37 (Conv2D)           (None, 512, 512, 1)       145       
_________________________________________________________________
flatten_4 (Flatten)          (None, 262144)            0         
_________________________________________________________________
dense_13 (Dense)             (None, 256)               67109120  
_________________________________________________________________
dense_14 (Dense)             (None, 64)                16448     
_________________________________________________________________
dense_15 (Dense)             (None, 32)                2080      
_________________________________________________________________
dense_16 (Dense)             (None, 9)                 297       
=================================================================
Total params: 67,244,507
Trainable params: 67,244,507
Non-trainable params: 0
_________________________________________________________________

这是错误:

InvalidArgumentError                      Traceback (most recent call last)
~/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
   1658   try:
-> 1659     c_op = c_api.TF_FinishOperation(op_desc)
   1660   except errors.InvalidArgumentError as e:

InvalidArgumentError: Dimensions must be equal, but are 1 and 64 for 'loss_1/zero_padding2d_5_loss/MatMul' (op: 'BatchMatMul') with input shapes: [?,64,64,1], [1,64,64,?].

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-11-0e924885fc6b> in <module>
     40 autoencoder = Model(input_layer, [encoded_layer,output_layer])
     41 autoencoder.summary()
---> 42 autoencoder.compile(optimizer='adadelta', loss=[custom_loss1,custom_loss2])
     43 autoencoder.fit(x_train,[x_train, y_train],batch_size=32,epochs=3,shuffle=True,
     44                 validation_data=(x_val, [x_val,y_val]))

~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, **kwargs)
    340                 with K.name_scope(self.output_names[i] + '_loss'):
    341                     output_loss = weighted_loss(y_true, y_pred,
--> 342                                                 sample_weight, mask)
    343                 if len(self.outputs) > 1:
    344                     self.metrics_tensors.append(output_loss)

~/anaconda3/lib/python3.6/site-packages/keras/engine/training_utils.py in weighted(y_true, y_pred, weights, mask)
    402         """
    403         # score_array has ndim >= 2
--> 404         score_array = fn(y_true, y_pred)
    405         if mask is not None:
    406             # Cast the mask to floatX to avoid float64 upcasting in Theano

<ipython-input-11-0e924885fc6b> in custom_loss1(y_true, y_pred)
      2 #Wrappers for keras
      3 def custom_loss1(y_true,y_pred):
----> 4         dcor = -1*distance_correlation(y_true,encoded_layer)
      5         return dcor
      6 

<ipython-input-6-f282528532cc> in distance_correlation(y_true, y_pred)
      2     pred_r = tf.reduce_sum(y_pred*y_pred,1)
      3     pred_r = tf.reshape(pred_r,[-1,1])
----> 4     pred_d = pred_r - 2*tf.matmul(y_pred,tf.transpose(y_pred))+tf.transpose(pred_r)
      5     true_r = tf.reduce_sum(y_true*y_true,1)
      6     true_r = tf.reshape(true_r,[-1,1])

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py in matmul(a, b, transpose_a, transpose_b, adjoint_a, adjoint_b, a_is_sparse, b_is_sparse, name)
   2415         adjoint_b = True
   2416       return gen_math_ops.batch_mat_mul(
-> 2417           a, b, adj_x=adjoint_a, adj_y=adjoint_b, name=name)
   2418 
   2419     # Neither matmul nor sparse_matmul support adjoint, so we conjugate

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py in batch_mat_mul(x, y, adj_x, adj_y, name)
   1421   adj_y = _execute.make_bool(adj_y, "adj_y")
   1422   _, _, _op = _op_def_lib._apply_op_helper(
-> 1423         "BatchMatMul", x=x, y=y, adj_x=adj_x, adj_y=adj_y, name=name)
   1424   _result = _op.outputs[:]
   1425   _inputs_flat = _op.inputs

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
    786         op = g.create_op(op_type_name, inputs, output_types, name=scope,
    787                          input_types=input_types, attrs=attr_protos,
--> 788                          op_def=op_def)
    789       return output_structure, op_def.is_stateful, op
    790 

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py in new_func(*args, **kwargs)
    505                 'in a future version' if date is None else ('after %s' % date),
    506                 instructions)
--> 507       return func(*args, **kwargs)
    508 
    509     doc = _add_deprecated_arg_notice_to_docstring(

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in create_op(***failed resolving arguments***)
   3298           input_types=input_types,
   3299           original_op=self._default_original_op,
-> 3300           op_def=op_def)
   3301       self._create_op_helper(ret, compute_device=compute_device)
   3302     return ret

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in __init__(self, node_def, g, inputs, output_types, control_inputs, input_types, original_op, op_def)
   1821           op_def, inputs, node_def.attr)
   1822       self._c_op = _create_c_op(self._graph, node_def, grouped_inputs,
-> 1823                                 control_input_ops)
   1824 
   1825     # Initialize self._outputs.

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
   1660   except errors.InvalidArgumentError as e:
   1661     # Convert to ValueError for backwards compatibility.
-> 1662     raise ValueError(str(e))
   1663 
   1664   return c_op

ValueError: Dimensions must be equal, but are 1 and 64 for 'loss_1/zero_padding2d_5_loss/MatMul' (op: 'BatchMatMul') with input shapes: [?,64,64,1], [1,64,64,?].

你有两个损失函数,所以你必须传递两个y(基本事实)用于评估预测的损失。

你的第一个预测是层的输出encoded_layer其大小为(None, 8, 8, 128)从模型中观察到。总结conv2d_59 (Conv2D)

但是你传递的适合的是什么y is [x_train, y_train]。 loss_1 期望输入大小(None, 8, 8, 128)但你正在路过x_train它有不同的尺寸。

如果你想要loss_1找到输入图像与编码图像的相关性,然后堆叠卷积,使得卷积的输出将产生与 x_train 图像形状相同的形状。使用model.summary查看卷积的输出形状。

不使用卷积层的填充、步幅和内核大小来获得所需的卷积输出大小。使用公式W2=(W1−F+2P)/S+1 and H2=(H1−F+2P)/S+1找到卷积的输出宽度和高度。检查这个参考


您的方法有两个主要问题。

  1. 您的损失函数正在检查编码图像和实际图像之间的相关性。正确的方法是从编码图像解码回图像,然后检查解码图像和实际图像之间的相关性(以自动编码器行为单位)
  2. 你的损失 1 是使用 numpy 数组。为了使损失函数成为计算图的一部分,它应该使用张量运算,而不是 numy 运算。

下面是工作代码。然而,对于损失 1,我使用两个图像的 l2 范数。如果你想使用相关性,那么你必须以某种方式将其转换为张量运算(这是与这个问题不同的问题)

def image_loss(y_true,y_pred):
    return tf.norm(y_true - y_pred)

def label_loss(y_true,y_pred):
    return categorical_crossentropy(y_true, y_pred)

input_img = Input(shape=(64, 64, 1))  

enocded_imag = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
enocded_imag = MaxPooling2D((2, 2), padding='same')(enocded_imag)
enocded_imag = Conv2D(8, (3, 3), activation='relu', padding='same')(enocded_imag)
enocded_imag = MaxPooling2D((2, 2), padding='same')(enocded_imag)
enocded_imag = Conv2D(8, (3, 3), activation='relu', padding='same')(enocded_imag)
enocded_imag = MaxPooling2D((2, 2), padding='same')(enocded_imag)

decoded_imag = Conv2D(8, (2, 2), activation='relu', padding='same')(enocded_imag)
decoded_imag = UpSampling2D((2, 2))(decoded_imag)
decoded_imag = Conv2D(8, (3, 3), activation='relu', padding='same')(decoded_imag)
decoded_imag = UpSampling2D((2, 2))(decoded_imag)
decoded_imag = Conv2D(16, (3, 3), activation='relu', padding='same')(decoded_imag)
decoded_imag = UpSampling2D((2, 2))(decoded_imag)
decoded_imag = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(decoded_imag)

flat_layer = Flatten()(enocded_imag) 
dense_layer = Dense(32,activation = "relu")(flat_layer) 
output_layer = Dense(9, activation = "softmax")(dense_layer)

model = Model(input_img, [decoded_imag, output_layer])

model.compile(optimizer='adadelta', loss=[image_loss, label_loss])
images = np.random.randn(10,64,64,1)
model.fit(images, [images, np.random.randn(10,9)])

损失函数distance_correlation您编写的代码假设每一行y_true and y_pred代表一个图像。当你使用Dense层它会起作用,因为Dense层输出一批(行)向量,其中每个向量代表一个单独的图像。然而,2D 卷积对一批具有多个通道的 2d 张量进行操作(只有 1 个通道)。所以要使用distance_correlation损失函数你必须重塑你的张量,使得每一行对应一个图像。添加以下两行来重塑张量。

def distance_correlation(y_true,y_pred):
    y_true = tf.reshape(tf.squeeze(y_true), [-1,64*64])
    y_pred = tf.reshape(tf.squeeze(y_pred), [-1,64*64])
    .... REST OF THE CODE ....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras ValueError:尺寸必须相等问题 的相关文章

随机推荐

  • 将 numpy int16 音频数组转换为 float32

    我有原始二进制 int16 数据 我正在使用它转换为 numpy 数组 audio np fromstring raw data dtype np int16 该数据是音频数据 当我将数据转换为 float32 时 音频变得失真 audio
  • 如何修复 由于目标计算机主动拒绝而无法建立连接 127.0.0.1:64527

    我有一个 MVC 应用程序 它依赖于 Web API 应用程序 我将这两个应用程序托管在共享托管环境上 子域上的 API 和主域上的 MVC API 是 api mydomain com MVC 是 mydomain com 每当我在邮递员
  • 如何从进程内部确定 CPU 和内存消耗

    我曾经承担过从正在运行的应用程序内部确定以下性能参数的任务 可用虚拟内存总量 当前使用的虚拟内存 Virtual memory currently used by my process 可用内存总量 当前使用的内存 RAM currentl
  • 在 VBA 中连接字符串

    我正在维护一个使用 VBA 用 Microsoft Access 编写的应用程序 我浏览了一下我的代码 刚刚注意到我下意识地使用加号 而不是与符号将字符串连接在一起 我已经有几年没有用 VB6 编写代码了 这会导致任何问题吗 一切看起来都很
  • 如何在 Visual Studio 2008 中创建 COM DLL?

    我已经很久没有编写 COM dll 了 我现在已经创建了几个类 它们继承了一些 COM 接口 但我想对其进行测试 我知道我必须在某处放置一个 GUID 然后使用 regsvr32 注册它 但是涉及哪些步骤 编辑 抱歉 忘了提及我正在使用 C
  • 如何将图像插入 OpenXML Word 文档的页眉?

    我的 OpenXML Word 文档生成项目需要文本 表格和图像 但首先 我需要一个带有徽标 图像 的文档标题 我使用了 Microsoft 示例来创建页眉和页脚 网址为使用 Open XML SDK 2 0 for Microsoft O
  • 为什么在某些条件下 AppDomain.CurrentDomain.GetAssemblies() 不返回 Global.asax 中的依赖程序集?

    EDIT 以前的标题是 IIS 重新启动和应用程序初始化之间的应用程序初始化行为不同 我更改了标题以将问题从 IIS 应用程序初始化中扩展出来 因为观察到的行为与AppDomain CurrentDomain GetAssemblies 我
  • 使用自定义 UITableViewCell 自动布局

    如何使用自动布局来移动自定义 UITableViewCell 的内容并调整其大小 为了使问题更清楚 我分配了contentView我的自定义单元格具有浅灰色背景颜色 为了将这个问题尽可能减少到最小 我的自定义单元只有一个UIImageVie
  • OpenCV中SimpleBlobDetector的minRepeatability参数有什么用?

    有一个minRepeatability参数输入SimpleBlobDetector在 OpenCV 中 这个参数有什么用 如果我将其从 1 更改为 20 它将如何影响斑点检测 相关代码在斑点检测 c The detect函数 唯一一个使用m
  • Hibernate:MySQLDialect 和 MySQLInnoDBDialect 之间有什么区别?

    MySQLDialect 和 MySQLInnoDBDialect 有什么区别 从那时起我就使用了 MySQLDialect 现在我想知道上面的有什么不同 Anyone MySQL默认的存储引擎是MyISAM 如果您需要事务和行级锁定 您通
  • React Router v4默认页面(未找到页面)

    这是常见的目的 将不匹配的请求定向到未找到的页面 用react router v4做这个看起来像以前的版本 我期望这个 下面是示例作品 链接工作正常 但我希望 NotFound 组件仅调用未知的 url 请求 但它总是在那里 import
  • Android下载管理器完成

    关于安卓下载管理器的小问题 这是我第一次使用它 并成功下载了多个文件并打开它们 但我的问题是如何检查下载是否完成 情况是我下载了一个 PDF 文件并打开它 通常该文件很小 在打开之前就完成了 但是 如果文件较大 如何在打开文件之前检查下载管
  • IndexedDB 事务和 Promise 之间的相互作用不一致

    I saw 同步承诺发布在 Reddit 和与作者进行了讨论 我们注意到 IndexedDB 事务和 Promise 之间的关系存在一些奇怪的不一致 IndexedDB 事务在所有情况下自动提交onsuccess活动结束 一个复杂的问题是你
  • Java 程序可以检测到它的堆空间不足吗?

    整个周末我都会在室友的电脑上运行遗传算法 我担心这么长时间运行它可能会耗尽内存 然而 我的算法的工作方式使得可以相当容易地修剪不太有用的结果 因此 如果有一种方法可以告诉我的程序何时将耗尽堆空间 我可能可以腾出空间并继续进行再多一些时间 当
  • Postgresql存储过程返回select结果集

    在 Microsoft SQL Server 中我可以做这样的事情 create procedure my procedure argument1 int argument2 int as select from my table wher
  • 错误 ITMS-90168:“您上传的二进制文件无效。”

    错误 ITMS 90168 您上传的二进制文件无效 生成的 API 分析文件太大 我们无法验证 交付前您的 API 每次我想将新版本的应用程序上传到 iTunes connect 时 都会出现上述错误 我正在使用应用程序加载器进行上传 我的
  • 监视目录列表的更改?

    在 unix 系统上 我如何监视 例如 tail 的工作原理 目录中对文件所做的更改 创建新文件或大小更改等 寻找命令行工具而不是要安装的东西 大多数 UNIX 变体都有一个 API 但它没有标准化 在Linux上 有inotify 在命令
  • ES6 尾递归优化堆栈溢出

    读过Rauschmayer 博士的描述关于 es6 中的递归尾部调用优化 我一直在尝试重新创建他详细介绍的递归阶乘函数的 零堆栈 执行 使用 Chrome 调试器在堆栈帧之间步进 我发现尾部优化没有发生 并且正在为每个递归创建一个堆栈帧 我
  • 为数组 x 中的每个元素选择 n 个项目(从泊松分布中抽取)的快速方法

    我在解决遇到的问题时遇到了一些麻烦 我有一个包含价格的数组 gt gt gt x np random randint 10 size 10 array 6 1 7 6 9 0 8 2 1 8 以及 随机 生成的泊松分布到达数组 gt gt
  • Keras ValueError:尺寸必须相等问题

    即使应用了答案和评论中的建议后 尺寸不匹配问题似乎仍然存在 这也是要复制的确切代码和数据文件 https drive google com drive folders 1q67s0VhB O7J8OtIhU2jmj7Kc4LxL3sf us