【发布时间】:2021-12-28 15:27:13
【问题描述】:
感谢您提供帮助。我正在尝试使用 TensorFlow 训练卷积神经网络来预测我的系统的二进制方面。我有大约 1000 个 ndarray,大小为 400x400x3,持有浮动。这类似于(我认为)RGB 图像;我的图像的三个方面不是颜色,而是三个不同功能的输出,但这在这里不重要。这些 ndarray 中的每一个都与一个二进制标签相关联——0 或 1。我是 TensorFlow 的新手,虽然在机器学习原理上相当扎实,所以非常感谢有关解码错误的指导。我认为我排列图层的方式很奇怪,但我尝试非常密切地按照教程进行操作,所以我不知道为什么。
我的代码如下:
no_of_samples = 1035
train_batches = 30
BATCH_SIZE = 23
SHUFFLE_BUFFER_SIZE = 50
data, labels = np.load("total_image_data.npy", allow_pickle=True), np.load("labels.npy", allow_pickle=True)
#divide into test and train sets
train_indices = np.random.choice([i for i in range(no_of_samples)], size=train_batches*BATCH_SIZE)
test_indices = [i for i in range(no_of_samples) if i not in train_indices]
data_train, labels_train = [data[i] for i in train_indices], [labels[i] for i in train_indices]
data_test, labels_test = [data[i] for i in test_indices], [labels[i] for i in test_indices]
train_dataset = tf.data.Dataset.from_tensor_slices((data_train, labels_train))
test_dataset = tf.data.Dataset.from_tensor_slices((data_test, labels_test))
train_dataset = train_dataset.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE)
test_dataset = test_dataset.batch(BATCH_SIZE)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(200, 5, strides=3, activation='relu', input_shape=(BATCH_SIZE, 400, 400, 3)),
tf.keras.layers.Conv2D(100, 5, strides=2, activation="relu"),
tf.keras.layers.Conv2D(50, 5, activation="relu"),
tf.keras.layers.Conv2D(25, 3, activation="relu"),
tf.keras.layers.MaxPooling2D(3),
tf.keras.layers.Conv2D(50, 3, activation="relu"),
tf.keras.layers.Conv2D(25, 3, activation="relu"),
tf.keras.layers.MaxPooling2D(3),
tf.keras.layers.Conv2D(50, 2, activation="relu"),
tf.keras.layers.Conv2D(25, 2, activation="relu"),
tf.keras.layers.GlobalMaxPooling2D(),
# Finally, we add a classification layer.
tf.keras.layers.Dense(2)
])
model.compile(optimizer=tf.keras.optimizers.RMSprop(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['sparse_categorical_accuracy'])
model.fit(labels_train, data_train, epochs=10, batch_size=BATCH_SIZE)
model.evaluate(labels_test, data_test)
我运行时遇到的错误如下:
Traceback (most recent call last):
File "training.py", line 36, in <module>
model = tf.keras.Sequential([
File "/local/**/ac3/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py", line 530, in _method_wrapper
result = method(self, *args, **kwargs)
File "/local/**/ac3/lib/python3.8/site-packages/keras/utils/traceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None
File "/local/**/ac3/lib/python3.8/site-packages/keras/engine/input_spec.py", line 213, in assert_input_compatibility
raise ValueError(f'Input {input_index} of layer "{layer_name}" '
ValueError: Input 0 of layer "max_pooling2d" is incompatible with the layer: expected ndim=4, found ndim=5. Full shape received: (None, 23, 58, 58, 25)
任何帮助解码此内容将不胜感激。
更新:新的令人兴奋的错误!在一些慷慨的社区成员的帮助下,我的代码现在看起来像这样:
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
no_of_samples = 1035
BATCH_SIZE = 16
SHUFFLE_BUFFER_SIZE = 50
data, labels = np.load("total_image_data.npy", allow_pickle=True), np.load("labels.npy", allow_pickle=True)
print(np.shape(data)) ##this outputs (1035, 400, 400, 3)
print(np.shape(labels)) ##this outputs (1035, )
#divide into test and train sets
dataset = tf.data.Dataset.from_tensor_slices((data, labels)).shuffle(SHUFFLE_BUFFER_SIZE)
test_dataset = dataset.take(100).batch(BATCH_SIZE)
train_dataset = dataset.skip(100).batch(BATCH_SIZE)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(200, 5, strides=3, activation='relu', input_shape=(400, 400, 3)),
tf.keras.layers.Conv2D(100, 5, strides=2, activation="relu"),
tf.keras.layers.Conv2D(50, 5, activation="relu"),
tf.keras.layers.Conv2D(25, 3, activation="relu"),
tf.keras.layers.MaxPooling2D(3),
tf.keras.layers.Conv2D(50, 3, activation="relu"),
tf.keras.layers.Conv2D(25, 3, activation="relu"),
tf.keras.layers.MaxPooling2D(3),
tf.keras.layers.Conv2D(50, 2, activation="relu"),
tf.keras.layers.Conv2D(25, 2, activation="relu"),
tf.keras.layers.GlobalMaxPooling2D(),
# Finally, we add a classification layer.
tf.keras.layers.Dense(1)
])
print('Labels shape -->',labels.shape)
print('Labels -->', labels)
model.compile(optimizer=tf.keras.optimizers.RMSprop(),
loss=tf.keras.losses.BinaryCrossentropy(),
metrics=['accuracy'])
model.fit(train_dataset, epochs=10)
model.evaluate(test_dataset)
这编译并运行良好,但报告了 nan 的损失和 58% 的跨时期的不变准确度(我正在寻找的东西的基线流行率为 38%)。再次,我投身于你的怜悯。
【问题讨论】:
-
您不能将 BATCH_SIZE 放入您的输入定义中:
tf.keras.layers.Conv2D(200, 5, strides=3, activation='relu', input_shape=( 400, 400, 3))
标签: python tensorflow keras deep-learning conv-neural-network