我在phyton中使用keras来完成我在神经元网络中的第一步。我训练了一个模型来识别30 px30 to的图像。
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.python.keras import Sequential
train_ds = keras.preprocessing.image_dataset_from_directory('images', validation_split=0.2,
subset="training", seed=123, batch_size=32, image_size=(30, 30))
val_ds = keras.preprocessing.image_dataset_from_directory('images', validation_split=0.2,
subset="validation", seed=123, batch_size=32, image_size=(30, 30))
class_names = train_ds.class_names
print(class_names)
AUTOTUNE = tf.data.experimental.AUTOTUNE
train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
num_classes = 13
model = Sequential([
layers.experimental.preprocessing.Rescaling(1./255, input_shape=(30, 30, 3)),
layers.Conv2D(10, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(15, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(20, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(num_classes)
])
model.compile(
optimizer='adam',
loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.summary()
epochs = 50
history = model.fit(
train_ds,
validation_data=val_ds,
epochs=epochs
)
model.save("model.h5")我对此非常满意,因为我的val_accuracy是0.9912。
但是现在我想使用Java中的模型来对缓冲的图像进行分类:
public class Test
{
public static void main(String[] args) throws Exception
{
MultiLayerNetwork model = KerasModelImport.importKerasSequentialModelAndWeights("ki.h5");
BufferedImage img = ImageIO.read(new File("testImage.png"));
ImageLoader loader = new ImageLoader(30, 30, 3);
INDArray input = loader.asMatrix(img);
INDArray output = model.output(input);
System.out.println("Test " + output);
}
}在这里,我收到了这个错误:
线程"main“org.deeplearning4j.nn.modelimport.keras.exceptions.UnsupportedKerasConfigurationException:不支持的keras层类型重新标度中的
异常。请在https://github.com/eclipse/deeplearning4j/issues上提交一个问题。
我让它工作,我物理通过删除重新刻度层。但后来我得到了例外
未知Keras损失函数稀疏交叉熵。请在https://github.com/eclipse/deeplearning4j/issues上提交一个问题。
我愿意接受任何建议。是否有更好的方法使用java的模型?
或者我应该更改python文件中的某些内容,或者如何保存模型?
发布于 2021-10-02 22:33:59
我来自deeplearning4j项目。从外表上看,安德烈亚斯·拉德奥尔是对的。当我们实现缺少的导入函数时,这个函数从裂缝中溜走了。
请在github上点击我,就像它在这个问题上说的那样(甚至是关于链接问题),我们可以在那里继续讨论解决办法。
对于愿意这样做的用户,也可以使用模型导入注册自定义层来解决这个问题。您可以使用我们的tensorflow类api (samediff),并定义自己实现该功能的函数,并将其注册为一个层。如果您认为这适合您的用例,那么您可以在这里看到一个示例:https://github.com/eclipse/deeplearning4j/blob/master/deeplearning4j/deeplearning4j-modelimport/src/test/java/org/deeplearning4j/nn/modelimport/keras/e2e/KerasCustomLossTest.java
否则,我们将考虑添加缺少的函数。大部分角点的工作都集中在卷积层上,并确保了这些工作的正确性。谢谢你把这个挂起来!
发布于 2021-10-02 21:32:35
deeplearning4j似乎不支持将损失函数定义为对象。您必须用字符串指定它。https://github.com/eclipse/deeplearning4j/issues/8990
试着改变
model.compile(
optimizer='adam',
loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])至
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])请注意,使用此方法不能设置kwarg from_logits。我想这可能会破坏你的模型。如果是这样的话,您需要向他们提交一个问题,因为这是他们库中的一个bug。
https://stackoverflow.com/questions/69420171
复制相似问题