java.net. URL считал поток в байт []

Мне удалось заставить ваш код работать с некоторыми изменениями, похоже, ошибка произошла из-за использования вами sparse_categorical_crossentropy. Я не знаю, почему вы использовали это, поскольку ваши уроки не кажутся эксклюзивными, т.е. у вас есть оценка '1' в нескольких строках вашего tftest.csv для каждой записи. Кроме того, вы не должны нормализовать ваши ярлыки. Я внес эти изменения:

x_train = num_converter_flatten(distribution_train)
y_train = num_converter_flatten(probs_train)

x_train = tf.keras.utils.normalize(x_train, axis=1)
y_train = np.array(y_train)#tf.keras.utils.normalize(y_train, axis=1)

и далее:

model.add(tf.keras.layers.Dense(80, activation=tf.nn.sigmoid))

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

Опять же, поскольку ваши занятия не кажутся эксклюзивными, вы не должны использовать активацию softmax.

Но так как код теперь работает, вы можете поработать над оптимизацией (кажется, он не работал хорошо для тех 5 эпох, для которых я его запускал).

40
задан Community 23 May 2017 в 12:10
поделиться

4 ответа

Нет гарантии, что предоставленная вами длина содержания действительно верна. Попробуйте что-нибудь вроде следующего:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = null;
try {
  is = url.openStream ();
  byte[] byteChunk = new byte[4096]; // Or whatever size you want to read in at a time.
  int n;

  while ( (n = is.read(byteChunk)) > 0 ) {
    baos.write(byteChunk, 0, n);
  }
}
catch (IOException e) {
  System.err.printf ("Failed while reading bytes from %s: %s", url.toExternalForm(), e.getMessage());
  e.printStackTrace ();
  // Perform any other exception handling that's appropriate.
}
finally {
  if (is != null) { is.close(); }
}

Затем у вас будут данные изображения в baos , из которых вы можете получить массив байтов, вызвав baos.toByteArray () .

Этот код не тестировался (я просто написал его в поле для ответа), но он достаточно близок к тому, что, как я думаю, вам нужно.

58
ответ дан 27 November 2019 в 01:07
поделиться

Важно указать тайм-ауты, особенно когда сервер берет для ответа. С чистым Java, не используя зависимости:

public static byte[] copyURLToByteArray(final String urlStr,
        final int connectionTimeout, final int readTimeout) 
                throws IOException {
    final URL url = new URL(urlStr);
    final URLConnection connection = url.openConnection();
    connection.setConnectTimeout(connectionTimeout);
    connection.setReadTimeout(readTimeout);
    try (InputStream input = connection.getInputStream();
            ByteArrayOutputStream output = new ByteArrayOutputStream()) {
        final byte[] buffer = new byte[8192];
        for (int count; (count = input.read(buffer)) > 0;) {
            output.write(buffer, 0, count);
        }
        return output.toByteArray();
    }
}

Используя зависимости, например, свеча Гефнера, Быстрая :

public byte[] copyURLToByteArray(final String urlStr,
        final int connectionTimeout, final int readTimeout)
                throws IOException {
    return Request.Get(urlStr)
            .connectTimeout(connectionTimeout)
            .socketTimeout(readTimeout)
            .execute()
            .returnContent()
            .asBytes();
}
0
ответ дан 27 November 2019 в 01:07
поделиться

Просто расширяю ответ Барнарда с помощью commons-io. Отдельный ответ, потому что я не могу форматировать код в комментариях.

InputStream is = null;
try {
  is = url.openStream ();
  byte[] imageBytes = IOUtils.toByteArray(is);
}
catch (IOException e) {
  System.err.printf ("Failed while reading bytes from %s: %s", url.toExternalForm(), e.getMessage());
  e.printStackTrace ();
  // Perform any other exception handling that's appropriate.
}
finally {
  if (is != null) { is.close(); }
}

http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toByteArray (java.io.InputStream)

27
ответ дан 27 November 2019 в 01:07
поделиться

Длина содержимого - это просто заголовок HTTP. Вы не можете доверять ему. Просто прочитайте все, что можно, из потока.

Available определенно неверно. Это просто количество байт, которые могут быть прочитаны без блокировки.

Другой проблемой является обработка ресурсов. Закрытие потока должно произойти в любом случае. try/catch/finally сделают это.

1
ответ дан 27 November 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: