fishcharlie

joined 1 year ago
[โ€“] fishcharlie@eventfrontier.com 5 points 4 days ago (1 children)

I know I'm not necessarily the target audience for this. But it feels too expensive. 6x the price of Cloudflare R2, almost 13x the price of Wasabi. Even iCloud storage is $0.99 for 50 GB with a 5 GB free tier. But again, I know I'm not necessarily the target audience as I have a lot of technical skills that maybe average users don't have.

If you ever get around to building an API, and are interested in partnerships, let me know. Maybe there is a possibility for integration into !echo@eventfrontier.com ๐Ÿ˜‰.

 

cross-posted from: https://eventfrontier.com/post/177049

I keep getting an error ValueError: perm should have the same length as rank(x): 3 != 2 when trying to convert my model using coremltools.

From my understanding the most common case for this is when your input shape that you pass into coremltools doesn't match your model input shape. However, as far as I can tell in my code it does match. I also added an input layer, and that didn't help either.

I have put a lot of effort into reducing my code as much as possible while still giving a minimal complete verifiable example. However, I'm aware that the code is still a lot. Starting at line 60 of my code is where I create my model, and train it.

I'm running this on Ubuntu, with NVIDIA setup with Docker.

Any ideas what I'm doing wrong?


from typing import TypedDict, Optional, List
import tensorflow as tf
import json
from tensorflow.keras.optimizers import Adam
import numpy as np
from sklearn.utils import resample
import keras
import coremltools as ct

# Simple tokenizer function
word_index = {}
index = 1
def tokenize(text: str) -> list:
    global word_index
    global index
    words = text.lower().split()
    sequences = []
    for word in words:
        if word not in word_index:
            word_index[word] = index
            index += 1
        sequences.append(word_index[word])
    return sequences

def detokenize(sequence: list) -> str:
    global word_index
    # Filter sequence to remove all 0s
    sequence = [int(index) for index in sequence if index != 0.0]
    words = [word for word, index in word_index.items() if index in sequence]
    return ' '.join(words)

# Pad sequences to the same length
def pad_sequences(sequences: list, max_len: int) -> list:
    padded_sequences = []
    for seq in sequences:
        if len(seq) > max_len:
            padded_sequences.append(seq[:max_len])
        else:
            padded_sequences.append(seq + [0] * (max_len - len(seq)))
    return padded_sequences

class PreprocessDataResult(TypedDict):
    inputs: tf.Tensor
    labels: tf.Tensor
    max_len: int

def preprocess_data(texts: List[str], labels: List[int], max_len: Optional[int] = None) -> PreprocessDataResult:
    tokenized_texts = [tokenize(text) for text in texts]
    if max_len is None:
        max_len = max(len(seq) for seq in tokenized_texts)
    padded_texts = pad_sequences(tokenized_texts, max_len)

    return PreprocessDataResult({
        'inputs': tf.convert_to_tensor(np.array(padded_texts, dtype=np.float32)),
        'labels': tf.convert_to_tensor(np.array(labels, dtype=np.int32)),
        'max_len': max_len
    })

# Define your model architecture
def create_model(input_shape: int) -> keras.models.Sequential:
    model = keras.models.Sequential()

    model.add(keras.layers.Input(shape=(input_shape,), dtype='int32', name='embedding_input'))
    model.add(keras.layers.Embedding(input_dim=10000, output_dim=128)) # `input_dim` represents the size of the vocabulary (i.e. the number of unique words in the dataset).
    model.add(keras.layers.Bidirectional(keras.layers.LSTM(units=64, return_sequences=True)))
    model.add(keras.layers.Bidirectional(keras.layers.LSTM(units=32)))
    model.add(keras.layers.Dense(units=64, activation='relu'))
    model.add(keras.layers.Dropout(rate=0.5))
    model.add(keras.layers.Dense(units=1, activation='sigmoid')) # Output layer, binary classification (meaning it outputs a 0 or 1, false or true). The sigmoid function outputs a value between 0 and 1, which can be interpreted as a probability.

    model.compile(
        optimizer=Adam(),
        loss='binary_crossentropy',
        metrics=['accuracy']
    )

    return model

# Train the model
def train_model(
    model: tf.keras.models.Sequential,
    train_data: tf.Tensor,
    train_labels: tf.Tensor,
    epochs: int,
    batch_size: int
) -> tf.keras.callbacks.History:
    return model.fit(
        train_data,
        train_labels,
        epochs=epochs,
        batch_size=batch_size,
        callbacks=[
            keras.callbacks.EarlyStopping(monitor='val_accuracy', patience=5),
            keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=1),
            # When downgrading from TensorFlow 2.18.0 to 2.12.0 I had to change this from `./best_model.keras` to `./best_model.tf`
            keras.callbacks.ModelCheckpoint(filepath='./best_model.tf', monitor='val_accuracy', save_best_only=True)
        ]
    )

# Example usage
if __name__ == "__main__":
    # Check available devices
    print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

    with tf.device('/GPU:0'):
        print("Loading data...")
        data = (["I love this!", "I hate this!"], [0, 1])
        rawTexts = data[0]
        rawLabels = data[1]

        # Preprocess data
        processedData = preprocess_data(rawTexts, rawLabels)
        inputs = processedData['inputs']
        labels = processedData['labels']
        max_len = processedData['max_len']

        print("Data loaded. Max length: ", max_len)

        # Save word_index to a file
        with open('./word_index.json', 'w') as file:
            json.dump(word_index, file)

        model = create_model(max_len)

        print('Training model...')
        train_model(model, inputs, labels, epochs=1, batch_size=32)
        print('Model trained.')

        # When downgrading from TensorFlow 2.18.0 to 2.12.0 I had to change this from `./best_model.keras` to `./best_model.tf`
        model.load_weights('./best_model.tf')
        print('Best model weights loaded.')

        # Save model
        # I think that .h5 extension allows for converting to CoreML, whereas .keras file extension does not
        model.save('./toxic_comment_analysis_model.h5')
        print('Model saved.')

        my_saved_model = tf.keras.models.load_model('./toxic_comment_analysis_model.h5')
        print('Model loaded.')

        print("Making prediction...")
        test_string = "Thank you. I really appreciate it."
        tokenized_string = tokenize(test_string)
        padded_texts = pad_sequences([tokenized_string], max_len)
        tensor = tf.convert_to_tensor(np.array(padded_texts, dtype=np.float32))
        predictions = my_saved_model.predict(tensor)
        print(predictions)
        print("Prediction made.")


        # Convert the Keras model to Core ML
        coreml_model = ct.convert(
            my_saved_model,
            inputs=[ct.TensorType(shape=(max_len,), name="embedding_input", dtype=np.int32)],
            source="tensorflow"
        )

        # Save the Core ML model
        coreml_model.save('toxic_comment_analysis_model.mlmodel')
        print("Model successfully converted to Core ML format.")

Code including Dockerfile & start script as GitHub Gist: https://gist.github.com/fishcharlie/af74d767a3ba1ffbf18cbc6d6a131089

From what I've seen TensorFlow is still more popular. But that might be starting to change. Maybe we need to make a PyTorch community as well ๐Ÿค”

 

I created a Lemmy community specifically for TensorFlow! Check it out and subscribe if you're interested.

I wish it worked on more webpages. But totally agree.

 

Is there a way to determine if a user sign-up application is pending solely based on the server instance URL and the username?

It looks like even when the application is pending the profile page is created and is live. So that doesnโ€™t really help me determine that.

What? I'm not following. Steam isn't federating with anyone. This is about having a link to an external site. Nothing more. Has nothing to do with federation directly.

[โ€“] fishcharlie@eventfrontier.com 3 points 4 weeks ago (2 children)

Just added to my todo list. Hopefully I'll get around to this today! Thanks!!

[โ€“] fishcharlie@eventfrontier.com 5 points 4 weeks ago (1 children)

Thanks so much! ๐ŸŽ‰ Native is the only way to go imo ๐Ÿ˜. Iโ€™ll make a PR this weekend.

Might also have some comments on the Lemmy API eventually, but Iโ€™ll save those for a later date haha.

Thanks for all you do for Lemmy.

[โ€“] fishcharlie@eventfrontier.com 6 points 4 weeks ago (1 children)

Check back in 24 hours or so. If it still isn't available, please let me know.

Thank you so much! I really appreciate your support. As mentioned, this is only the beginning. Lots more improvements coming ๐ŸŽ‰. And if you ever have feedback, suggestions, ideas, problems, etc. be sure to let me know!

[โ€“] fishcharlie@eventfrontier.com 4 points 4 weeks ago (3 children)

What is your region?

 

cross-posted from: https://eventfrontier.com/post/150886

I'm pleased to announce the release of Echo for Lemmy! Echo is a Lemmy client for iPhone that I've been working on for a while and I'm excited to finally share it with you all.

Echo for Lemmy is a fully native iOS application built using fully native Apple SDKs. This means it feels right at home on your iPhone and is designed to be fast, efficient, and easy to use. No overhead from web views or cross-platform frameworks.

Here are some of the features available in Echo for Lemmy:

  • Connect with communities based on your interests.
  • Sort your feed by most active, trending posts, new posts, and many more.
  • Upvote and downvote posts & comments.
  • Powerful search experience to find the content you're looking for.
  • Create posts using share extension from any app on your device.
  • Bookmark posts to easily find later.
  • Fully native application with dark mode support & accessibility features.

Echo for Lemmy is available for free on the App Store, with subscription plans available for Echo+. You can download it here: Echo for Lemmy on the App Store.

You can also join the official Echo Lemmy community at [!echo@eventfrontier.com](/c/echo@eventfrontier.com).

I'm excited to hear feedback, suggestions, bug reports, and feature suggestions. Feel free to comment here, or create a new post! You can also reach out via email at support@rrainn.com.

This is only the beginning. Much more to come!


Download Echo for Lemmy: https://echo.rrainn.com/download/iphone

Echo Lemmy Community: !echo@eventfrontier.com

Echo Mastodon Profile: @echo@mstdn-social.com


Screenshot of Echo for Lemmy on an iPhone showing a list of posts in your home feed.

 

cross-posted from: https://eventfrontier.com/post/150886

I'm pleased to announce the release of Echo for Lemmy! Echo is a Lemmy client for iPhone that I've been working on for a while and I'm excited to finally share it with you all.

Echo for Lemmy is a fully native iOS application built using fully native Apple SDKs. This means it feels right at home on your iPhone and is designed to be fast, efficient, and easy to use. No overhead from web views or cross-platform frameworks.

Here are some of the features available in Echo for Lemmy:

  • Connect with communities based on your interests.
  • Sort your feed by most active, trending posts, new posts, and many more.
  • Upvote and downvote posts & comments.
  • Powerful search experience to find the content you're looking for.
  • Create posts using share extension from any app on your device.
  • Bookmark posts to easily find later.
  • Fully native application with dark mode support & accessibility features.

Echo for Lemmy is available for free on the App Store, with subscription plans available for Echo+. You can download it here: Echo for Lemmy on the App Store.

You can also join the official Echo Lemmy community at [!echo@eventfrontier.com](/c/echo@eventfrontier.com).

I'm excited to hear feedback, suggestions, bug reports, and feature suggestions. Feel free to comment here, or create a new post! You can also reach out via email at support@rrainn.com.

This is only the beginning. Much more to come!


Download Echo for Lemmy: https://echo.rrainn.com/download/iphone

Echo Lemmy Community: !echo@eventfrontier.com

Echo Mastodon Profile: @echo@mstdn-social.com


Screenshot of Echo for Lemmy on an iPhone showing a list of posts in your home feed.

 

Is there a way to get a list of users subscribed to a given Lemmy community? Trying to do some Lemmy wide data analysis using that information.

Or alternatively, is there a way to get a list of communities a given user is subscribed to?

 

After upgrading Lemmy from 0.18.5 to 0.19.1, the lemmy_server process is taking up 200-350+% of my CPU. Although I haven't seen it max out my CPU yet, it's getting dangerously close at times.

Any thing I can do to fix this?

I'd be fine with downgrading temporarily if this will require a Lemmy fix, but I'm not seeing any documentation on how to do that. I'm assuming DB migrations were run between those two versions (which might make that complicated).

 

Does Lemmy have anyway to pre-fill the Create Post details from the URL? For example Reddit allows for: https://www.reddit.com/submit?url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F24823114%2Fpost-to-reddit-via-url&title=Post%20to%20Reddit%20via%20URL.

I'm aware that this gets slightly tricky across instances (due to different domains), however I was hoping to build a system where the user enters their Lemmy domain, and it takes them to a page so they can create a post about a given URL.

Any ideas?

 

cross-posted from: https://eventfrontier.com/post/6196

I'm extremely excited to announce Echo for Lemmy. This is a project I've dedicated all of my free time to for the past little bit, and it has come such a long way. Although there is still a lot of work to do, I'm excited to share this alpha version and get feedback from the community.

Key Features:

  • Intuitive, beautiful design
  • Timeline that provides key information about posts
  • Upvote, downvote, and comment on posts just by swiping
  • Threaded comment support
  • Blocking & Reporting support
  • Support for every timeline sort option
  • Share Extension to create posts from other apps
  • And much more

Screenshots:

Screenshot of the Echo timeline

Screenshot of the profile view

How to Join:

Please keep in mind that this is currently a closed alpha program. Things might not be perfect. Bugs exist. It's not feature complete. However, it's a great start, and after using it myself, I think it's ready to be shared with the community.

I truly believe in the community aspect of Lemmy and the Fediverse. Your feedback will help shape this application, and I'm excited to hear what you think.

If you would like to join the alpha program, please fill out this form, and I'll be sending out invites as soon as possible. I expect the first wave of invites to be sent out this week. Then be sure to subscribe to our Lemmy community to stay up to date on the latest news, ask questions, leave feedback, and more.

How to Report Feedback:

I will be compiling feedback from the following sources. Please feel free to use any of these to report feedback.

All constructive feedback is welcome. Please note, that nonconstructive feedback may result in removal from the alpha program.

view more: next โ€บ