我正在尝试创建 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'''