类型错误:张量是不可散列的

时间:2021-04-27 20:32:56

标签: python typeerror tensor

我正在尝试创建 mlp 和 cnn 模型并绘制训练准确度和损失、验证准确度和测试准确度。

在我的研究范围内,我将模型编写为函数,并使用 train_on_batch 函数训练模型并评估函数以确定测试和验证损失和准确性。然而,尽管 MLP 模型没有问题,但 CNN 模型无法工作。我添加了相关的代码部分和导致 TypeError 的行。

顺便说一句,我试图解决 StackOverflow 上旧讨论中的问题,但我找不到解决方案。

导入的库

# TensorFlow and tf.keras
import tensorflow as tf

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split

from matplotlib.lines import Line2D
import os


定义输入

    train_images = np.load(path1)
    train_labels = np.load(path2)
    test_images = np.load(path3)
    test_labels = np.load(path4)
    train_images = (train_images/127.5)-1
    test_images= (test_images/127.5)-1
    [train_images, validation_images, train_labels, validation_labels] = train_test_split(train_images, train_labels, test_size=0.1, train_size=0.9, shuffle=True)
    print(train_images.shape)
    print(train_labels.shape)
    pixel_finder = np.reshape(train_images[0], (28, 28))  

CNN 模型创建

for n in range(1):
    def cnn_3():
        cnn_3 = tf.keras.Sequential({
            tf.keras.layers.Input(shape=(28, 28)),
            tf.keras.layers.Conv2D(filters=16, kernel_size=(3, 3), padding='valid', activation='relu'),
            tf.keras.layers.Conv2D(filters=8, kernel_size=(5, 5), padding='valid', activation='relu'),
            tf.keras.layers.Conv2D(filters=8, kernel_size=(3, 3), padding='valid', activation='relu'),
            tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
            tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='relu'),
            tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
            tf.keras.layers.GlobalAveragePooling2D(),
            tf.keras.layers.Dense(units=5, activation='softmax')
        })
        cnn_3.compile(optimizer='adam',
                      loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                      metrics=['accuracy'])
        Arr_train_loss_acc = []
        Arr_val_acc_loss = []
        Arr_test_acc_loss = []
        for j in range(15):
            for i in range(540):
                if i % 10 == 9:
                    Arr_train_loss_acc.extend(cnn_3.train_on_batch(train_images[i*50:50*(i+1)], train_labels[i*50:50*(i+1)], sample_weight=None, class_weight=None, reset_metrics=True, return_dict=False))
                    Arr_val_acc_loss.extend(cnn_3.evaluate(validation_images, validation_labels))
                else:
                    cnn_3.train_on_batch(train_images[i*50:50*(i+1)], train_labels[i*50:50*(i+1)], sample_weight=None, class_weight=None, reset_metrics=True, return_dict=False)
            unison_shuffler(train_images, train_labels)
        Arr_test_acc_loss.extend(cnn_3.evaluate(test_images, test_labels))
        Arr_weights=cnn_3.trainable_weights
        results={'train_loss_acc':Arr_train_loss_acc, 'val_loss_acc':Arr_val_acc_loss, 'test_acc_loss':Arr_test_acc_loss, 'weights':Arr_weights}
        return results

错误行

    results_cnn = cnn_3()
    [Arr_1, Arr_2, Arr_3, Arr_4] = results

错误输出

TypeError                                 Traceback (most recent call last)
<ipython-input-17-d4c2ac0ade5c> in <module>()
     75         return results
     76 
---> 77     results_cnn = cnn_3()
     78     [Arr_1, Arr_2, Arr_3, Arr_4] = results
     79     Arr_1 = Arr_1[::2] + Arr_1[1::2]

1 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/keras_tensor.py in __hash__(self)
    259   def __hash__(self):
    260     raise TypeError('Tensors are unhashable. (%s)'
--> 261                     'Instead, use tensor.ref() as the key.' % self)
    262 
    263   # Note: This enables the KerasTensor's overloaded "right" binary

TypeError: Tensors are unhashable. (KerasTensor(type_spec=TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='input_9'), name='input_9', description="created by layer 'input_9'"))Instead, use tensor.ref() as the key.222'''

0 个答案:

没有答案