无法预测具有不同分辨率的数据集
Can’t predict dataset with varying resolution
经过多次尝试和错误尝试,我能够创建一个模型,该模型可以在具有不同分辨率图像的数据集上进行训练。
一切正常,但是当我保存这个模型并稍后加载它时,它无法预测具有不同分辨率的多个图像。
解决方法是在每张图片之前加载模型,但这一点也不理想。
有办法解决这个问题吗?或者这是一个错误?
错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimension 1 in both shapes must be equal: shape[0] = [1,10,10,3] vs. shape[1] = [1,12,9,3] [Op:ConcatV2] name: concat
完整追溯:
Traceback (most recent call last):
File "c:\Users\samue\Desktop\test\predicting.py", line 22, in <module>
predicts = conv_model.predict(dataset)
File "C:\Users\samue\AppData\Roaming\Python\Python310\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None
File "C:\Users\samue\AppData\Roaming\Python\Python310\site-packages\tensorflow\python\framework\ops.py", line 7186, in raise_from_not_ok_status
raise core._status_to_exception(e) from None # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimension 1 in both shapes must be equal: shape[0] = [1,10,10,3] vs. shape[1] = [1,12,9,3] [Op:ConcatV2] name: concat
如何重现:
我创建了一个最小的可重现示例,只有两张分辨率为 [10, 10]
和 [9, 12]
的图像,都保存为 .png
和 rgb 色彩空间。
运行 training.py
创建一个 model.h5
模型,在 1 个时期后仅使用一个 Conv2D
层进行训练。
文件夹结构:
/main_folder
--training.py
--predicting.py
--/data
--001.png
--002.png
training.py
import cv2, os
import keras
import tensorflow as tf
from keras import layers
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
input_layer = keras.Input(shape=(None, None, 3))
out = layers.Conv2D(3, (3, 3), activation='sigmoid', padding='same')(input_layer)
conv_model = keras.Model(input_layer, out)
conv_model.compile(
optimizer='adam',
loss=tf.keras.losses.MeanSquaredError()
)
conv_model.summary()
path = "data"
data = [cv2.imread(os.path.join(path, f)) / 255 for f in os.listdir(os.path.join(path))]
def data_generator():
for i in range(len(data)):
yield data[i], data[i]
dataset = tf.data.Dataset.from_generator(
data_generator,
output_types=(tf.float32, tf.float32),
output_shapes=((None, None, 3), (None, None, 3))
).batch(1)
conv_model.fit(
dataset,
epochs=1,
validation_data=dataset
)
conv_model.save('model.h5')
predicting.py
import cv2, os
import keras
import tensorflow as tf
path = "data"
data = [cv2.imread(os.path.join(path, f)) / 255 for f in os.listdir(os.path.join(path))]
def data_generator():
for i in range(len(data)):
yield data[i], data[i]
dataset = tf.data.Dataset.from_generator(
data_generator,
output_types=(tf.float32, tf.float32),
output_shapes=((None, None, 3), (None, None, 3))
).batch(1)
conv_model = keras.models.load_model('model.h5')
predicts = conv_model.predict(dataset)
for i in predicts:
print(i)
方法model.predict
将尝试将其输出打包到一个tensor/numpy 数组中。但是,输出需要在所有样本中具有相同的维度。
在维度不同的情况下,您可以直接迭代数据集并在唯一样本上调用模型:
predicts = [conv_model(x) for x in dataset]
请注意,对于少量输入(即 batch_size=1),it is recommended 直接使用 __call__
而不是预测方法。
经过多次尝试和错误尝试,我能够创建一个模型,该模型可以在具有不同分辨率图像的数据集上进行训练。
一切正常,但是当我保存这个模型并稍后加载它时,它无法预测具有不同分辨率的多个图像。
解决方法是在每张图片之前加载模型,但这一点也不理想。
有办法解决这个问题吗?或者这是一个错误?
错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimension 1 in both shapes must be equal: shape[0] = [1,10,10,3] vs. shape[1] = [1,12,9,3] [Op:ConcatV2] name: concat
完整追溯:
Traceback (most recent call last):
File "c:\Users\samue\Desktop\test\predicting.py", line 22, in <module>
predicts = conv_model.predict(dataset)
File "C:\Users\samue\AppData\Roaming\Python\Python310\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None
File "C:\Users\samue\AppData\Roaming\Python\Python310\site-packages\tensorflow\python\framework\ops.py", line 7186, in raise_from_not_ok_status
raise core._status_to_exception(e) from None # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimension 1 in both shapes must be equal: shape[0] = [1,10,10,3] vs. shape[1] = [1,12,9,3] [Op:ConcatV2] name: concat
如何重现:
我创建了一个最小的可重现示例,只有两张分辨率为 [10, 10]
和 [9, 12]
的图像,都保存为 .png
和 rgb 色彩空间。
运行 training.py
创建一个 model.h5
模型,在 1 个时期后仅使用一个 Conv2D
层进行训练。
文件夹结构:
/main_folder
--training.py
--predicting.py
--/data
--001.png
--002.png
training.py
import cv2, os
import keras
import tensorflow as tf
from keras import layers
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
input_layer = keras.Input(shape=(None, None, 3))
out = layers.Conv2D(3, (3, 3), activation='sigmoid', padding='same')(input_layer)
conv_model = keras.Model(input_layer, out)
conv_model.compile(
optimizer='adam',
loss=tf.keras.losses.MeanSquaredError()
)
conv_model.summary()
path = "data"
data = [cv2.imread(os.path.join(path, f)) / 255 for f in os.listdir(os.path.join(path))]
def data_generator():
for i in range(len(data)):
yield data[i], data[i]
dataset = tf.data.Dataset.from_generator(
data_generator,
output_types=(tf.float32, tf.float32),
output_shapes=((None, None, 3), (None, None, 3))
).batch(1)
conv_model.fit(
dataset,
epochs=1,
validation_data=dataset
)
conv_model.save('model.h5')
predicting.py
import cv2, os
import keras
import tensorflow as tf
path = "data"
data = [cv2.imread(os.path.join(path, f)) / 255 for f in os.listdir(os.path.join(path))]
def data_generator():
for i in range(len(data)):
yield data[i], data[i]
dataset = tf.data.Dataset.from_generator(
data_generator,
output_types=(tf.float32, tf.float32),
output_shapes=((None, None, 3), (None, None, 3))
).batch(1)
conv_model = keras.models.load_model('model.h5')
predicts = conv_model.predict(dataset)
for i in predicts:
print(i)
方法model.predict
将尝试将其输出打包到一个tensor/numpy 数组中。但是,输出需要在所有样本中具有相同的维度。
在维度不同的情况下,您可以直接迭代数据集并在唯一样本上调用模型:
predicts = [conv_model(x) for x in dataset]
请注意,对于少量输入(即 batch_size=1),it is recommended 直接使用 __call__
而不是预测方法。